linux系统中的用户与组
1、用户
用户通常是指使用计算机的人,但在这里,用户是指按照一定权限和规则使用Linux系统资源的账户。Linux系统会给每个账户分配特定的名称,即用户名。用户名彼此不同因而可以用以区分用户。在Linux中每个用户除用户名外还拥有各自的标识符,即用户ID。用户名和用户ID是Linux系统用于识别和管理用户账户的依据。
Linux中的用户可以按权限和任务分为三种角色:
- 超级用户:拥有对系统的最高管理权限,默认是root用户。
- 普通用户:也称为登陆用户,具有登录到系统的权限。只能对自己拥有相应权限的文件进行访问和修改。这类用户一般都是系统管理员添加的。
- 系统用户:其最大的特点是不能登录系统,它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。例如系统默认的bin、adm、nobody用户等。这类用户一般都是系统自己添加的,当然,系统管理员也可以添加该类用户。
这三种角色的UID是不一样的,在绝大多数发行版中,root的UID是0,系统用户的UID是1~499,普通用户的UID是500~60000 。但也有些例外,比如CentOS7中系统用户的UID是1~999,而普通用户的UID为1000~60000 。
值得注意的是,UID是Linux下用户角色确认和权限控制的标志,例如将普通用户的UID设置为0后,这个普通用户就具有了root用户的权限,这是极度危险的操作。因此,在系统管理中,系统管理员一定要坚守UID唯一的特性。
2、用户组
用户组是具有相同特征用户的逻辑集合,是一个用户容器,组中的成员继承来自组的权限和许可。
3、用户和用户组的关系
- 一对一:一个用户存在一个组中,即用户是组的唯一成员
- 一对多:一个用户可以存在多个用户组中,此用户有多个组的共同权限
- 多对一:多个用户组可以存在一个组中,这些用户具有和组共同的权限
- 多对多:多个用户可以存在多个组中,即上述关系的扩展
二、配置文件
1、用户和组的配置文件
(1)/etc/passwd文件
系统用户信息文件,记录了每个用户的基本属性。
该文件每一行代表一个用户,格式如下,每行分七个部分,用半角冒号 :
分开:
username:password:UID:GID:GECOS:directory:shell
含义:
- 用户名(username):是代表用户账号的字符串,有唯一性,不可重复。
-
密码(password):存放加密后的用户口令,该字段存放的只是用户口令的加密串,不是明文。由于
/etc/passwd
文件对所有用户都可读,所以将密码保存在此处有很大的安全隐患。因此,许多Linux 发行版都使用了shadow技术,把真正加密后的用户口令存放到/etc/shadow
文件中,而在/etc/passwd
文件的口令字段中只存放一个特殊的字符用来占位,例如用x
或者*
来表示。 -
用户标识号(UID):即用户ID,每个用户都有一个UID,并且是唯一的,通常UID号的取值范围是0~65535,0是超级用户root的标识号,1~499由系统保留,作为系统账号,普通用户的标识号从500开始。不同的发行版略有不同,如 ArchLinux 中普通用户的ID从1000开始。
-
组标识号(GID):就是组ID,与UID类似,这个字段记录了用户所属的基本用户组。它对应着
/etc/group
文件中的一条记录()。 -
注释性描述(GECOS):可选的注释字段,记录用户的描述信息,通常为用户全名。
-
主目录(directory):用于登陆命令设置
$HOME
环境变量,也是用户登录到系统之后默认所处的目录。 -
默认终端(shell):是用户默认登录的shell,通常是
/bin/bash
,如果使用其他 shell ,可在这里设置其路径,此部分是可选的,可留空。linux下常用的shell有sh、bash、csh等,管理员可以根据用户的习惯,为每个用户设置不同的shell。
需要注意的是,登录 shell 必须位于
/etc/shells
中,否则系统会阻止登陆请求,此外,不要使用/usr/bin/bash
替代/bin/bash
, 除非这个路径已经在/etc/shells
中正确配置。
文件示例:
1 2 3 4 5 6 7 8 9 10 11 12 |
[wzh@wzh-arch ~]$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/usr/bin/nologin daemon:x:2:2:daemon:/:/usr/bin/nologin mail:x:8:12:mail:/var/spool/mail:/usr/bin/nologin ftp:x:14:11:ftp:/srv/ftp:/usr/bin/nologin http:x:33:33:http:/srv/http:/usr/bin/nologin uuidd:x:68:68:uuidd:/:/usr/bin/nologin dbus:x:81:81:dbus:/:/usr/bin/nologin nobody:x:99:99:nobody:/:/usr/bin/nologin wzh:x:1000:100::/home/wzh:/bin/bash |
(2)/etc/shadow文件
用户安全信息文件。早期的Unix/Linux系统是把密码加密后存储在 /etc/passwd
文件中,但是该文件同时又被其他一些系统工具(如 ls
)所使用,也用于用户名和用户ID的匹配,因此该文件是所有用户都可读的。即便是加密后的密文,存储在 /etc/passwd
文件也有很大的安全隐患,因此,linux将用户的密码信息从 /etc/passwd
文件中分离出来,单独放到了 /etc/shadow
文件中,该文件只有root用户拥有访问权限,从而保证了用户密码的安全性。
同 /etc/passwd
文件一样, /etc/shadow
文件中的一行即为一条记录,一条记录的各个部分(字段)使用半角冒号 :
分隔开:
username:password:lastchanged:minimum:maximum:warn:inactive:expire:reserved
含义:
- 用户名(Username):与
/etc/passwd
文件中的用户名相对应。 - 加密口令(Encrypted password):加密后的用户口令字符串,若是
*
或!
字符,表示用户未设置密码。如果此字段不是crypt
函数(命令)的合法输出值,如长度不同或包含有*
或!
等字符,则对应的用户不能登录系统。如果此字段为空,则表示用户无需密码即可登录。 - 最后修改时间(Date password last changed ):表示从1970年1月1日起,到用户最近一次修改口令时间的间隔天数。该字段与下面其他字段一起用于用户密码的生命周期计算。
- 最小间隔天数(Minimum days):表示两次修改密码之间的最小间隔天数。若从上次修改密码至今的间隔天数小于该值,则不允许修改密码。若该字段为空,则表示随时可修改。
- 最大时间间隔(Maximum days):表示两次修改密码之间的最大时间间隔,即密码有效期。若最后一次修改时间至今的间隔天数大于该值,则密码过期,系统会强制用户变更密码。若该字段为空,表示密码永不过期。
- 警告时间(Warn days):表示从系统开始警告用户到密码正式失效的间隔天数。若该字段为空,则表示从不警告。
- 不活动时间(Inactive days):表示用户口令过期后,距系统禁用此用户的间隔天数。也就是说当用户密码过期多少天后仍未修改,系统将禁用此用户不再允许其登录。若该字段为空,则表示用户密码过期后无论多久,系统都不禁用该账户。
- 失效时间(Expire date):表示从1970年1月1日起至用户账户失效的间隔天数,即该用户的帐号生存期。超过该生存期后,用户帐号失效,无法登录系统。如果该字段的值为空,帐号永久可用。
- 保留字段:linux的保留字段,目前为空。
文件示例:
1 2 3 4 5 6 7 8 9 10 11 12 |
[wzh@wzh-arch ~]$ sudo cat /etc/shadow root:$6$0o1Mh5Of$tHgfqXXCDlBhy1dEJFHFRVMVjHkpx72APlylxCVnMnQyK0VTWwl1svVMrlGegZjsz9yn9IuihhOMXxN/iOLv..:16956:::::: bin:x:14871:::::: daemon:x:14871:::::: mail:x:14871:::::: ftp:x:14871:::::: http:x:14871:::::: uuidd:x:14871:::::: dbus:x:14871:::::: nobody:x:14871:::::: wzh:$6$wQqK9Mv5$FujGthC8ZkNnMoKbs8VshkhYnJ0BBZR4ail0S6uAL2FBBXcC15QTsludvsFpiWxhgtJrsa5PYnv/9XW.2Hbxi0:16956:0:99999:7::: |
注:这里的加密口令只做示例,并非来自真实值。
(3)/etc/group文件
用户组信息文件,保存用户组的基本信息。
该文件每一行代表一个组,格式如下,每行分4个部分,用半角冒号 :
分开:
group_name:group_password:GID:mdmber_list
含义:
- 组名(Group name):表示用户组的字符串,用以区分和标识用户组,不能重复。
-
组密码(Group password):加密后的用户组口令密文,与用户密码一样,这里使用了影子(shadow)密码,只存放一个特殊的字符
x
用来占位,而真实的密码密文存放在/etc/gshadow
文件中。 -
组标识号(GID,Group ID):与组名一一对应,每个组都有唯一的组ID。
GID的取值规则与UID类似,root组的GID为0,系统类的组通常取1~499之间的数,而普通用户组取500~60000之间的值。此外,GID是Linux系统用于判断和控制权限的依据。
/etc/passwd
文件中记录的用户都可通过该字段匹配到其对应基本组。 -
组内用户列表(Member list): 显示属于这个组的所有用户,多个用户之间用半角逗号
,
分隔。
文件示例:
1 2 3 4 5 6 7 8 9 10 11 12 |
[wzh@wzh-arch ~]$ grep -E "root|wzh" /etc/group root:x:0:root bin:x:1:root,bin,daemon daemon:x:2:root,bin,daemon sys:x:3:root,bin adm:x:4:root,daemon disk:x:6:root wheel:x:10:root,wzh log:x:19:root wzh:x:1000: testgroup:x:1001:wzh |
(4)/etc/gshadow
用户组安全信息文件,只有root用户有访问权限,保存有用户组加密后的密码、等信息。
同 /etc/group
文件一样, /etc/gshadow
文件中的一行即为一条组记录,每条记录的各个部分(字段)使用半角冒号 :
分隔开:
group_name:froup_password:administrators:members
含义:
- 组名(Group name):用户组名称,同
/etc/group
文件中组名。 -
组密码(Group password):加密后的用户组口令密文,如果该字段是
!
或!!
,通常表示该组未设定密码。组密码用于用户临时加入组(如使用newgrp
命令)时的验证。如果此字段不是
crypt
函数(命令)的合法输出值,如包含有*
或!
等字符,则非该组成员的用户会因无法通过验证而不能切换活动组为该组。若该字段为空,则直接拒绝非该组成员的用户切换活动组为该组。root用户和该组成员在切换活动组到该组时会跳过密码验证直接切换成功。
-
组管理员(Administrators ):组管理员拥有修改组密码、添加和删除组成员的权限。该字段可以为空,如果有多个管理员,使用半角逗号
,
隔开。 -
组成员(Members):与
/etc/group
文件中的成员列表字段相同。
文件示例:
1 2 3 4 5 6 7 8 9 10 11 12 |
[wzh@wzh-arch ~]$ sudo grep -E "root|wzh" /etc/gshadow root:::root bin:::root,bin,daemon daemon:::root,bin,daemon sys:::root,bin adm:::root,daemon disk:::root wheel:::root,wzh log:::root wzh:!:wzh: testgroup:!::wzh |
2、其他目录和文件
(1)etc/login.defs文件
该文件在各个发行版中略有不同,用来定义一些账号管理和登录相关的配置项。
以下是和账户创建相关的一些配置项。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# *必须设置项* # 用户默认邮件信箱放置目录 # MAIL_DIR /var/spool/mail # 密码时效相关配置项: # # PASS_MAX_DAYS 密码最长可用天数,对应 /etc/shadow 内的第 5 字段 # PASS_MIN_DAYS 密码最短可用天数,对应 /etc/shadow 内的第 4 字段 # PASS_MIN_LEN 密码长度,该项目前已废弃 # PASS_WARN_AGE 密码过期前的警告天数,对应 /etc/shadow 内的第 6 字段 # PASS_MAX_DAYS 99999 PASS_MIN_DAYS 0 PASS_MIN_LEN 5 PASS_WARN_AGE 7 # # 添加用户(useradd)时自动设定UID时使用的取值范围 # UID_MIN 1000 UID_MAX 60000 # 系统账户 SYS_UID_MIN 201 SYS_UID_MAX 999 # # 添加组(groupadd)时自动设定GID是使用的取值范围 # GID_MIN 1000 GID_MAX 60000 # 系统账户 SYS_GID_MIN 201 SYS_GID_MAX 999 # # If defined, this command is run when removing a user. # It should remove any at/cron/print jobs etc. owned by # the user to be removed (passed as the first argument). # #USERDEL_CMD /usr/sbin/userdel_local # # 当使用 useradd 创建用户时,在不加 -M 及 -m 时,是否默认创建用户家目录 # CREATE_HOME yes # 权限掩码, useradd 和 newusers 使用该掩码创建用户家目录, # 因此家目录权限会是 700(即:drwx------) 。 # 若未指定,该项使用默认值 022。 UMASK 077 # 使用 userdel 删除用户时,同时删除已无成员的组 # USERGROUPS_ENAB yes # 密码使用的加密算法 ENCRYPT_METHOD SHA512 |
(2)/etc/skel目录
该目录是新建用户家目录时是用的参考目录,定义了新建用户在家目录下默认的文件(如.bash_profile, .bashrc, .bash_logout等配置文件),新建用户家目录时会将 /etc/skel
目录下的内容复制到新建的家目录中。
例:
1 2 3 4 5 6 7 8 9 |
[wzh@wzh-arch ~]$ sudo ls -a /etc/skel . .. .bash_logout .bash_profile .bashrc [wzh@wzh-arch ~]$ sudo mkdir /etc/skel/www [wzh@wzh-arch ~]$ sudo ls -a /etc/skel . .. .bash_logout .bash_profile .bashrc www [wzh@wzh-arch ~]$ sudo useradd -m tuser [wzh@wzh-arch ~]$ sudo ls -a /home/tuser/ . .. .bash_logout .bash_profile .bashrc www |
在 /etc/skel
目录中创建一个目录 www ,则使用 useradd 命令新建用户后其家目录中也会有一个 www 文件夹。
(3)/etc/default/useradd文件
使用 useradd
命令添加用户时的默认规则。通过 useradd
命令创建用户时,若不指定相关参数,则会使用默认值来定义新用户。如默认主目录一般位于 /home
目录下,默认使用的shell是 /bin/bash
等。
该文件内容如下:
1 2 3 4 5 6 7 8 9 10 11 |
[wzh@wzh-arch ~]$ cat /etc/default/useradd # useradd defaults file for ArchLinux # original changes by TomK GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=no |
- GROUP=100:新建账号的基本组ID为 100
系统中 GID 为 100 者即是 users 这个组,此配置项意为指定新建账户的基本组为 users 这一用户组。 然而,在一些发行版中却并非如此,新建账户时系统同时新建了一个与账户同名的组,新账户使用该同名的组为其基本组。这是Linux中两种不同的组机制所致, 这两种机制分别是:
私有群组机制:系统会创建一个与账号同名的群组给用户作为基本组。 这种群组的配置机制会比较有保密性,这是因为使用者都有自己的群组,而且家目录权限将会配置为 700 (仅有自己可进入自己的家目录) 之故。使用这种机制将不会参考 GROUP=100 这个配置值。代表性的发行版有 RHEL, Fedora, CentOS 等;
公共群组机制:就是以 GROUP=100 这个配置值为依据,指定新建账号的基本组,因此每个账号都属于 users 这个群组, 且默认家目录通常的权限会是drwxr-xr-x
,由于每个账号都属于 users 群组,因此大家都可以互相分享家目录内的数据之故。代表发行版有 SuSE 等。
由于我们的 CentOS 使用私有群组机制,因此这个配置项目是不会生效的!不要太紧张啊! - HOME=/home:用户家目录的基准目录(basedir)
用户的家目录通常是与账号同名的目录,这个目录将会创建在此配置值指定的目录下。 - INACTIVE=-1:密码过期后是否会失效
shadow 文件的第七个字段(Inactive days)的配置值将会影响到口令过期后, 在多久时间内还可使用旧口令登陆。如果是 0 代表口令过期立刻失效, 如果是 -1 则是代表口令永远不会失效,如果是数字,如 30 ,则代表过期 30 天后才失效。 - EXPIRE=:账号失效的日期
shadow 文件的第八字段(Expire date)。 - SHELL=/bin/bash:默认使用的 shell
- SKEL=/etc/skel:用户家目录的参考目录
用户家目录内的各项数据,都是由 /etc/skel 所复制过去的。 - CREATE_MAIL_SPOOL=no:创建用户的 mailbox
三、用户和用户组的管理
1、用户的管理命令
useradd
:添加用户passwd
:为用户设置密码usermod
:修改用户命令,可以通过usermod 来修改登录名、用户的家目录等等pwconv
:同步用户从/etc/passwd 到/etc/shadowpwck
:pwck是校验用户配置文件/etc/passwd 和/etc/shadow 文件内容是否合法或完整pwunconv
:是pwcov 的立逆向操作,是从/etc/shadow和 /etc/passwd 创建/etc/passwd ,然后会删除 /etc/shadow 文件id
:查看用户的UID、GID及所归属的用户组chfn
:更改用户信息工具su
:用户切换工具sudo
:sudo 是通过另一个用户来执行命令(execute a command as another user),su 是用来切换用户,然后通过切换到的用户来完成相应的任务,但sudo 能后面直接执行命令,比如sudo 不需要root 密码就可以执行root 赋与的执行只有root才能执行相应的命令;但得通过visudo 来编辑/etc/sudoers来实现visudo
:visodo 是编辑 /etc/sudoers 的命令;也可以不用这个命令,直接用vi 来编辑 /etc/sudoers 的效果是一样的sudoedit
:和sudo
功能差不多
2、用户组管理命令
groupadd
:添加用户组groupdel
:删除用户组groupmod
:修改用户组信息groups
:显示用户所属的用户组grpck
:检查/etc/group文件和/etc/gshadow文件,检查数据是否正确存放grpconv
:通过/etc/group和/etc/gshadow 的文件内容来同步或创建/etc/gshadow ,如果/etc/gshadow 不存在则创建grpunconv
:通过/etc/group 和/etc/gshadow 文件内容来同步或创建/etc/group ,然后删除gshadow文件