10、Linux用户和组

发布时间 2023-10-17 21:22:34作者: gcc_com

Linux用户和组

Windows当中guest用户为内置用户,用户组当中是否复杂。且不同的组都有不同的(独有的)权限。Linux当中用户十分纯粹。

一、基本概念

1、基本介绍

Linux作为一种多用户的操作系统(服务器系统),允许多个用户同时登陆到系统上,并响应每个用户的请求。任何需要使用操作系统的用户,都需要一个系统账号,账号分为:管理员账号与普通用户账号。在Linux中,操作系统根据UID来判断用!根据UID来判断用户!而不是用户名!只要id为0就是管理员,哪怕有多个id为0的账号;系统在新建账号时,会根据账号类型,自动分配递增账号的UID与GID(用户身份编号,组编号),也可自行分配。通常情况下,应当保证UID与GID唯一且不重复。

2、Linux的单用户任务和多用户任务

在Linux下,当你登录后,你也可以同时开启很多的服务任务和进程,而各自服务都会跑的很好却对其他任务没有任何影响,这种登录一个用户登录系统执行多个服务任务和进程的情况,就称为单用户多任务。

多用户任务——有时可能是很多用户同时用同一个系统,如公司几十个运维人员,每台机器都可以和被若干个运维人员登录部署或解决相关故障问题,但并不是所有的运维人员都要做同一件事,所以就有了多任务、多用户的情况。

注:多用户、多任务并不是大家同时挤到一起,在一台机器的键盘和显示器前来操作机器,多用户可能是通过SSH客户端工具等远程工具等远程登录服务器来进行,比如对服务器的运程控制,只要具有相关用户的权限,任何人都是可以上去操作访问服务器。

3、Linux系统用户分类

用户在系统中是分角色的,由于角色的不同,权限和所完成的任务也不同。在Linux系统中每个用户的 ID 细分为 2 种,分别是用户ID(User ID,简称 UID)和组 ID(Group ID,简称 GID),这与文件有拥有者和拥有群组两种属性相对应。值得注意的是用户的角色是通过UID和GID识别的。特别是UID,在运维工作中,一个UID是唯一标识一个系统用户的账号。

在Windows当中用户信息存放在SAM文件/目录当中;在Linux当中用户信息都存放在/etc/passwd。
//[root@x~]# cat /etc/passwd

①、root用户

root用户是UID和GID都等于0的用户,是Linux系统中的“上帝”,拥有最大的权限。如果深入了解Linux系统,会发现root用户真的拥有很多特权,比如:无视Linux对权限的设置而强行读、写、执行文件,切换其他用户登录不需要密码,可以强行切换到已经所用的用户,只有root可以直接为普通用户修改密码等等。

②、系统用户

系统用户通常用于运行服务,但是此用户无家目录,也不能用于登录系统。例如,在yum安装apache、nginx等服务后,就会自动创建apache和nginx的用户和同名用户组。在Cent OS 6系统中,系统用户的UID范围是1-499,在Cent OS 7系统中,系统用户的ID是1-999。伪用户/系统用户不是一个真是的用户,只是一个服务。

③、普通用户

普通用户只能由root用户创建,该用户拥有家目录,并且可以登录,该用户的权限由root分配。普通用户拥有指定的shell环境。在Cent OS 7系统中,普通用户的ID是1000-60000。

4、用户和用户组介绍

用户——每一个用户都有一个唯一的用户名和用户口令,在登录系统后,只有正确输入了用户名和密码,才能登录系统和相应的目录。

用户组——简单的说,linux系统中的用户组(group)就是具有相同特性的用户(user)集合;有时我们需要让多个用户具有相同的权限,比如查看、修改某一个文件或目录,如果不用用户组,这种需求在授权时就很难实现。如果使用用户组就方便多了,只需要把授权的用户都加入到同一个用户组里,然后通过修改该文件或目录的对应的用户组的权限,让用户组具有符合需求的操作权限,这样用户组下的所有用户对该文件或目录就会具有相同的权限,这就是用户组的用途。将用户分组是linux系统中对用户进行管理及控制访问权限的一种手段,通过定义用户组,在很大程度上简化了运维管理工作。

用户和用户组的对应关系有:一对一、一对多、多对一和多对多。

一对一:即一个用户可以存在一个组中,也可以是组中的唯一成员。比如,root

一对多:即一个用户可以存在多个组中,这个用户就具有这些组。

多对一:即多个用户可以存在一个组中,这些用户这些组的共同权限。

多对多:即多用户可以存在于多个组中。并且几个用户可以归属相同的组;其实多对多的关系是前面三条的扩展。

二、用户及用户组配置文件介绍

在Linux中,万物皆文件,所以用户与组也以配置文件的形式保存在系统中,以下为用户和组的主要配置文件详解:

  • /etc/passwd:用户及其属性信息(名称、 UID、主组ID等)
  • /etc/group:组及其属性信息
  • /etc/shadow:用户密码及其相关属性
  • /etc/gshadow:组密码及其相关属性(其实用户组也没有密码)

1、用户的配置文件/etc/passwd

/etc/passwd文件中每行定义(都是)一个用户账号,有多少行就表示多少个账号,在一行中可以清晰的看出,各内容之间又通过冒号“:”划分了7个字段/部分(冒号分隔),这7个字段分别定义了账号的不同属性,/etc/passwd文件实际内容如下:

[root@localhost ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash		【root用户,在 /etc/passwd文件的第一行】
xzm:x:1000:1000:XZM:/home/xzm:/bin/bash		【普通用户】
①字段1【root】:帐号名,这是用户登陆时使用的账户名称,在系统中是唯一的,不能重名
②字段2【x】:密码占位符x(已重置);早期的unix系统中,该字段是存放账户和密码的,由于安全原因,后来把这个密码字段内容移		到/etc/shadow中了。这里可以看到一个字母x,表示该用户的密码是/etc/shadow文件中保护的。
③字段3【UID】:UID;范围是0-65535
④字段4【GID】:GID;范围是0-65535;当添加用户时,默认情况下会同时建立一个与用户同名且UID和GID相同的组。
⑤字段5【root】:用户说明(备注):这个字段是对这个账户的说明
⑥字段6【/root】:宿主目录(家目录);用户登陆后首先进入的目录(用户登录系统后的缺省目录),一般与"/home/用户名"这样的目录
⑦字段7【/bin/bash】:登录Shell;当前用户登陆后所使用的shell执行环境(用户登录后使用的命令解释器),在centos/rhel系统中,默认的shell是bash;如果不希望用户登陆系统,可以通过usermod或者手动修改passwd设置,将该字段设置为/sbin/nologin即可。大多数内置系统账户都是 /sbin/nologin,这表示禁止登陆系统。这是出于安全考虑的。——awd攻防必须的操作!

【用户名:密码:UID(用户ID):GID(组ID):描述性信息:主目录:默认Shell】

passwd中有关UID的限制说明:0:当用户的UID为0时,表示这个账户为超级用户;如果要增加一个系统管理员账户的话,只需将该账户的UID改为0即可(不建议操作)。

看一下/etc/passwd的权限:
[root@localhost ~]# ll /etc/passwd
-rw-r--r--. 1 root root 2301 Sep 28 19:56 /etc/passwd
因为每个用户登录时都需要取得UID和GID来判断权限问题,所以/etc/passwd的权限为644,这样一来就会带来安全问题,即所有的用户都可以都/etc/passwd文件,即使文件内的密码是加密的,但还是存在一定的被攻击破解的安全隐患。因此,就有了/etc/shadow文件。

2、用户的影子口令文件/etc/shadow

/etc/shadow 文件,用于存储 Linux 系统中用户的密码信息,又称为“影子文件”。在文件中每行定义(都是)一个用户密码,有多少行就表示多少个账号所对应的密码,在一行中可以清晰的看出,各内容之间又通过冒号“:”划分了9个字段/部分(冒号分隔),这9个字段分别定义了密码的不同属性,/etc/shadow文件实际内容如下:

[root@localhost ~]# cat /etc/shadow
root:$6$gzV7F7XygZZLiLMs$q3xIpzL6.tLwg.PkqiIynm2gtkED2pu7oRLlUvfk516Pt/nVgnmISbMW0HOeHoQbjx1bcpD/xpKaL1xwT6dnx.::0:99999:7:::
①字段1:帐号名称/用户名:同/etc/passwd文件的用户名有相同的含义。
②字段2:加密密码(通常使用sha512/md5加密):真正加密的密码。所有伪用户的密码都是"!!"或"*",代表没有密码是不能登录的。$6$:sha加密,$1$:md5加密。
③字段3:最近更改密码的时间/最后一次修改时间:Linux计算日期的时间是以1970年1月1日作为1不断累加得到的时间。
④字段4:禁止修改密码的天数/最小修改时间间隔:该字段规定了从第 3 字段(最后一次修改密码的日期)起,多长时间之内不能修改密码。如果是0,则密码可以随时修改;如果是10,则代表密码修改后10天之内不能再次修改密码。
⑤字段5:用户必须更改口令的天数/密码有效期:密码的最长有效天数,该字段的默认值为99999天,也就是273年,可认为是永久生效。
⑥字段6:警告更改密码的期限/密码需要变更前的警告天数:与第 5 字段相比较,当账户密码有效期快到时,系统会发出警告信息给此账户,提醒用户 “再过 n 天你的密码就要过期了,请尽快重新设置你的密码!”。该字段的默认值是 7。
⑦字段7:不活动时间/密码过期后的宽限天数:在密码过期后,用户如果还是没有修改密码,则在此字段规定的宽限天数内,用户还是可以登录系统的;如果过了宽限天数,系统将不再让此账户登陆,也不会提示账户过期,是完全禁用。比如,此字段规定的宽限天数是 10,则代表密码过期10天后失效;如果是 0,则代表密码过期后立即失效;如果是 -1,则代表密码永远不会失效。
⑧字段8:账号失效时间:默认值为空;从1970/1/1日起,到用户被禁用的天数(账户密码失效时启用)
⑨字段9:保留字段(未使用):这个字段目前没有使用,等待新功能的加入。

【用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段】

3、用户组配置文件/etc/group

/etc/group文件是用户组的配置文件,内容包括用户与用户组,并且能显示用户归属哪个用户组,因为一个用户可以归属一个或多个不同的用户组;同一用户组的用户之间具有相似的特性。如果某个用户下有对系统管理有最重要的内容,最好让用户拥有独立的用户组,或者是把用户下的文件的权限设置为完全私有。另外root用户组一般不要轻易把普通用户并入。

[root@localhost ~]# cat /etc/group
root:x:0:
xzm:x:1000:xzm
①字段1:组账户名称(组名)
②字段2:密码占位符x(组密码位):通常不需要设置该密码,由于安全原因,该密码被记在/etc/gshadow中,因此显示为'x'。这类似/etc/shadow。
③字段3:组账户GID号,用户组ID
④字段4:本组的成员用户列表(用户):加入这个组的所有用户账号

【组名:机密密码:GID:用户】

4、用户组的影子文件/etc/gshadow

组用户信息存储在 /etc/group 文件中,而将组用户的密码信息存储在 /etc/gshadow 文件中。

[root@localhost ~]# cat /etc/gshadow
root:::

【组名:加密密码:组管理员:组附加用户列表】

三、对用户/组进行增删改

以下命令对Linux的用户和用户组进行管理。

1、useradd添加用户

useradd命令一般用于添加用户,该命令常见操作如下:
命令:useradd [选项] [用户名]
选项:
-M 表示不创建家目录
-s [shell]:表示手工指定用户的shell环境,默认是/bin/bash
-u [UID]:表示手工指定用户的UID
-d [家目录]:手工指定用户的家目录
-c [用户说明]:手工指定的用户说明(用户备注信息)
-g [组名]:表示手工指定用户的初始组/指定用户的gid(需要指定存在的gid)
-G [组名]:表示指定用户的附属组(需要指定存在的gid)
-p 指定用户的密码(只有设置为密码才能算是创建了真正可登录的用户)(必须以密文的方式指定)
示例:
[root@localhost ~]# useradd gi
gi:x:1001:1001::/home/gi:/bin/bash——(系统默认创建同名家目录/home/gi)
useradd test4 -u 2000 -M //手工指定UID为2000,并且不创建家目录
useradd test6 -d /home/xxx //手工指定家目录位置

[root@localhost ~]# useradd -u 550 -g lamp1 -G root -d /home/lamp1 -c "test user" -s /bin/bash lamp1
#在建立用户lamp1的同时,指定了UID(550)、初始组(lamp1,已存在的)、附加组(root)、家目录(/home/lamp1/)、用户说明(test user)和用户登录Shell(/bin/bash)
/etc/passwd:lamp1:x:550:502:test user:/home/lamp1:/bin/bash

[root@localhost ~]# grep "lamp1" /etc/passwd /etc/shadow /etc/group		#同时查看三个文件

2、userdel删除用户

userdel命令可以删除用户,后面直接跟用户名可以直接删除该用户。但是,我们一般在删除用户时都会添加-r参数,表示连同该用户的家目录一起删除。

命令:userdel [参数] [用户名]
参数:-r	//删除用户的同时删除用户家目录(仅root用户可用)
注意:在删除用户的同时如果不删除用户的家目录,那么家目录就会变成没有属主和属组的目录,也就是垃圾文件。

3、usermod修改用户

这里一定要分清useradd命令和usermod命令的区别(两者命令相似),前者用于添加用户,当然,添加用户时可以对用户信息进行定制;后者针对与已存在的用户,使用该命令可以修改它们的信息。相比useradd命令,usermod命令还多出了几个选项,即 -L 和 -U,作用分别与 passwd 命令的 -l 和-u 相同。

usermod命令常用于修改用户的信息,常用参数如下:
命令:usermod [选项] [用户名]
选项:
-u [UID]:修改用户的UID号
-c [用户说明]:修改用户的说明信息
-d [家目录]:表示重新指定用户的家目录
-g [组名]:表示重新指定用户的(主)组
-G [组名]:表示给用户添加附属组
-L(Lock):表示锁定用户(临时锁定用户),被锁定用户的密码前出现“!”表示无法登录(与passwd相似)
-U(Unlock):表示解除对用户的锁定

#如果在锁定用户后使用passwd命令修改该锁定用户的口令,则该用户会被自动解锁。
#usermod命令给用户增加附属组如下所示:注意,在下述操作中,必须首先存在一个GID为1001的组。
[ root@localhost ~]#id pzz
uid=1000(pzz) gid=1000(pzz) groups=1000(pzz)
[ root@localhost ~]#usermod pzz -G 1001
[ root@localhost ~]# id pzz
uid=1000(pzz) gid=1000(pzz) groups=1000(pzz) , 1001 (linux)
[ root@localhost~]#

4、groupadd添加用户组

命令:[root@localhost ~]# groupadd [选项] [组名]
选项:
-g [GID]:指定组 ID
-r:创建系统群组

示例:创建新群组
[root@localhost ~]# groupadd group1
#添加group1组
[root@localhost ~]# grep "group1" /etc/group
/etc/group:group1:x:502:
/etc/gshadow:group1:!::

5、groupmod修改用户组

命令:[root@localhost ~]# groupmod [选项] [组名]
选项:
-g GID:修改组 ID
-n 新组名:修改组名

例子:
[root@localhost ~]# groupmod -n testgrp group1
#把组名group1修改为testgrp
[root@localhost ~]# grep "testgrp" /etc/group
testgrp:x:502:
#注意GID还是502,但是组名已经改变

6、groupdel刪除用户组

命令:[root@localhost ~]# groupdel [组名]
例子:
[root@localhost ~]#grep "group1" /etc/group /etc/gshadow
/etc/group:group1:x:505:
/etc/gshadow:group1:!::
[root@localhost ~]#groupdel group1
[root@localhost ~]#grep "group1" /etc/group /etc/gshadow
[root@localhost ~]#
//使用 groupdel 命令删除群组,其实就是删除 /etc/gourp 文件和 /etc/gshadow 文件中有关目标群组的数据信息。
//不能使用 groupdel 命令随意删除群组。此命令仅适用于删除那些 "不是任何用户初始组" 的群组。

四、其他命令

1、passwd

命令:passwd [选项] [用户名]
选项:(仅root用户可用)
	-S:查询用户密码的密码状态。仅root用户可用
	-l:暂时锁定用户(被锁定的用户不能使用密码登入--密码前加“!!”),但对root用户无效,照样可以登入。仅root用户可用
	-u:解锁用户。仅root用户可用
注意:
#普通用户只能使用passwd命令修改自己的密码,而不能修改其他用户的密码。普通用户修改自己的密码需要先输入自己的旧密码,只有旧密码输入正确才能输入新密码。不仅如此还不能输入弱密码(root用户直接无视)。
#在查询用户密码状态时,如果没有设置密码则查询时会有整个( Password locked . ),代表密码属于锁定状态。在Linux当中如果用户没有密码则就属于锁定状态。
#ctrl + d		//退出用户
#passwd----不带参数默认修改root账户的密码,而且不需要输入原密码。
#passwd命令主要由于修改密码。

2、gpasswd

为了避免系统管理员(root)太忙碌,无法及时管理群组,我们可以使用 gpasswd 命令给群组设置一个群组管理员,代替 root 完成将用户加入或移出群组的操作。

命令:gpasswd [参数] [组名]
参数:
-a:添加用户到组
-d:从组删除用户
-A:指定管理员
-M:指定组成员和-A的用途差不多
-r:删除密码
-R:限制用户登入组,只有组中的成员才可以用newgrp加入该组

3、chage

chage命令专门针对/etc/shadow文件的命令/操作。

除了 passwd -S 命令可以查看用户的密码信息外,还可以利用 chage 命令,它可以显示更加详细的用户密码信息,并且和passwd命令一样,提供了修改用户密码信息的功能。

命令:chage [选项] [用户名]
选项:
-l:列出用户的详细密码状态
-d 日期:修改/etc/shadow文件中指定用户密码信息(shadow[3]字段),也就是最后一次修改密码的日期,格式为YYYY-MM-DD;
-m 天数:修改密码最短保留的天数,也就是/etc/shadow (shadow[4]字段)
-M 天数:修改密码的有效期,也就是/etc/shadow (shadow[5]字段)
-W 天数:修改密码到期前的警告天数,也就是/etc/shadow (shadow[6]字段)
-I 天数:修改密码过期后的宽限天数,也就是/etc/shadow (shadow[7]字段)
-E 日期:修改账号失效日期,格式为YYYY-MM-DD,也就是/etc/shadow (shadow[8]字段)

//chage [用户名] -d 1000 -M 89 -W 9 -m 2 //修改密码最后一次更改日期为1000,有效期为89天,密码最小使用天数为2天,过期前9天进行提醒
//chage命令除了修改密码信息的功能外,还可以强制用户在第一次登录后,必须先修改密码,并利用新密码重新登陆系统,此用户才能正常使用。【命令:[root@localhost ~]#chage -d 0 lamp //用户登陆后就必须修改密码(root强制用户修改密码)(lamp为新用户)】

4、初始组与附属组(用户组)

用户和组存在多对多的关系,且用户必须拥有>=1的组。【用户和组存在多对多的关系,但是不能存在用户不加入组的用户。】
组(作用):实现/优化权限的赋予。
//初始组(主组):一个用户可以不存在附属组,但必须有初始组
//附属组:>=0
groupadd [组名]	//创建空组
groupdel [组名]	//删除组
usermod [组名] -G GID 		//将用户添加到附属组(必须跟上完整的id,不能有遗漏)
gpasswd -a [用户] [组名] 		//把用户添加到附属组
gpasswd -d [用户] [组名] 		//把用户从附属组中删除
//当一个用户只有一个组的话,那么这个组就是这个用户的初始组。
//附属组可以删除,即使组内有用户。
//用户主组不能删除,一般删除用户会同时删除用户主组。
主组:
也叫初始组,是用户登录系统时的组,规则如下:
创建新用户时,若未明确指定该用户所属的主组,会默认创建一个与用户名相同的组,作为该用户的主组
用户创建文件时,文件的所属权限组就是当前用户的主组
使用useradd命令时用-g参数可以指定主组,则不会默认创建同名的主组
用户有且只能所属一个主组
用户的主组不能被删除
用户不能直接被移出主组,但可以更换主组
用户被删除时它的主组若没有其他所属用户,则会自动删除该主组

附加组/附属组:
登录后可切换的其他组,规则如下:
使用useradd命令时用-G参数可以指定附加组
用户可以所属零个或多个附加组
用户的附加组和主组可相同
附加组可以直接被删除而无需关心是否所属于用户
附加组可以新增和移除任意个所属用户
用户被删除时所属附属组不会受影响

5、id

Linux id命令用于显示用户的ID,以及所属群组的ID。id会显示用户以及所属群组的实际与有效ID。若两个ID相同,则仅显示实际ID。若仅指定用户名称,则显示目前用户的ID。

id [参数] [用户名]
参数:(不带参数也行)
-g或--group  显示用户所属群组的ID。
-G或--groups  显示用户所属附加群组的ID。
-n或--name  显示用户,所属群组或附加群组的名称。
-r或--real  显示实际ID。
-u或--user  显示用户ID。
-help  显示帮助。
-version  显示版本信息。
示例:
[root@localhost ~]# usermod -G root lamp
#把用户lamp加入root组
[root@localhost ~]# id lamp
uid=501(lamp) gid=501(lamp) groups=501(lamp),0(root)
#大家发现root组中加入了lamp用户的附加组信息

6、su

Linux su(英文全拼:switch user)命令用于变更为其他使用者的身份,除 root 外,需要键入该使用者的密码。使用权限:所有使用者。

su [选项] [用户名]
选项:
- 只使用‘-’代表连用户的环境变量一起切换
-c 仅执行一次命令,而不切换用户身份
//切换不同用户,会加载不同用户的shell

su 和 su - 的区别

-选项表示在切换用户身份的同时,连当前使用的环境变量也切换成指定用户的。我们知道,环境变量是用来定义操作系统环境的,因此如果系统环境没有随用户身份切换,很多命令无法正确执行。即有 - 选项,切换用户身份更彻底;反之,只切换了一部分,这会导致某些命令运行出现问题或错误(例如无法使用 service 命令)。

7、whoami与who am i

whoami 命令和 who am i 命令是不同的 2 个命令,前者用来打印当前执行操作的用户名,后者则用来打印登陆当前Linux系统的用户名。

示例:
[Cyuyan@localhost ~]$ whoami
Cyuyan
[Cyuyan@localhost ~]$ who am i
Cyuyan    pts/0    2017-10-09 15:30 (:0.0)
在此基础上,使用 su 命令切换到 root 用户下,再执行一遍上面的命令:
[Cyuyan@localhost ~] su - root
[root@localhost ~]$ whoami
root
[root@localhost ~]$ who am i
Cyuyan    pts/0    2017-10-09 15:30 (:0.0)
//执行 whoami 命令,等同于执行 id -un 命令;执行 who am i 命令,等同于执行 who -m 命令。

所谓实际用户,指的是登陆 Linux 系统时所使用的用户,因此在整个登陆会话过程中,实际用户是不会发生变化的;而有效用户,指的是当前执行操作的用户,也就是说真正决定权限高低的用户,这个是能够利用 su 或者 sudo 命令进行任意切换的。一般情况下,实际用户和有效用户是相同的,如果出现用户身份切换的情况,它们会出现差异。