Linux服务与安全管理
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

4.3 用户和组的管理

4.3.1与管理用户和组有关的配置文件

Linux把用户账户、用户密码、组账户和组密码信息存放在不同的配置文件中。

1.用户账户文件/etc/passwd

Linux系统把用户账户及其相关信息(密码除外)存放在配置文件“/etc/passwd”中,该文件的预设属性是“-rw-r--r--”,形式如图4-11所示。

图4-11 一个“/etc/passwd”文件

可以看出,passwd文件中每行定义一个用户账户,由7个字段构成,分别表示账户名、密码、UID(所属的用户)、GID(用户的有效组,即用户所创建文件默认所属的组)、用户信息说明、家目录、Shell,各字段值间用“:”分隔。

注意:“/sbin/nologin”是一个特殊的Shell,使用户无法登录,通常用于系统账户。

2.用户密码文件/etc/shadow

2.用户密码文件/etc/shadow

Linux系统将用户密码及其相关的信息单独保存在配置文件“/etc/shadow”中,该文件的预设属性是“-r--------”,形式如图4-12所示。

图4-12 一个“/etc/passwd”文件

可以看出,shadow文件的形式类似于passwd文件,其每行由9个字段构成,分别表示账户名、密码、最近更改密码的日期、密码不可被更改的天数、密码需要重新变更的天数、密码需要变更期限前的警告期限、密码过期的宽限时间、账户失效日期、保留字段。

3.用户组账户文件

用户组账户信息保存在配置文件“/etc/group”中,其预设属性是“-rw-r--r--”,形式如图4-13所示。该文件每行定义一个组账户,由4个字段构成,分别表示用户组名称、密码、GID、支持的账户名称。

图4-13 一个“/etc/group”文件

4.用户组密码文件

用户组的真实密码保存在配置文件“/etc/gshadow”中,其预设属性是“-r--------”,形式如图4-14所示。该文件由4个字段构成,分别表示用户组名称、密码、组管理员账户、支持的账户名称。

图4-14 一个“/etc/gshadow”文件

5.新建用户的配置文件

为什么在创建一个用户时,会自动创建其主目录、分配UID并设置密码策略呢?其实奥妙就在文件“/etc/login.defs”中,下面就来对该文件的内容进行分析。

4.3.2 私有(primary)组和有效(effective)组

用户一登录系统,就立刻拥有他的私有组的相关权限。例如,用户teacher的/etc/passwd、/etc/group、/etc/gshadow的相关内容以及用户teacher的身份信息如图4-15所示。

图4-15 用户teacher的属组信息

可以看出,用户teacher目前仅属于其私有组teacher,该组默认成为用户teacher的有效组。下面新建一个network组,并把用户teacher加入该组,命令如下:

# groupadd network
# usermod -G network teacher
# id teacher
uid=522(teacher) gid=522(teacher) groups=522(teacher),525(network)

其中,gid所指的组即为有效组。此时尽管teacher加入了network组,但有效组不变。

下面试着改变用户teacher的有效组,并再次验证其身份信息,如图4-16所示。

图4-16 改变用户teacher的有效组

4.3.3与用户和组管理有关的命令

1.用户账户管理

(1)添加用户账户。

用法:# useradd [option] username

选项及参数说明:

◇ -u 用户ID 手工指定新用户的UID,该值必须唯一,且大于499。

◇ -g 所属的主要组 该GID会被放置到文件“/etc/passwd”的第4栏。

◇ -G 所属的其他组 该参数会修改文件“/etc/group”的相关内容。

◇ -d 主目录 指定用户的家目录,默认为“/home/username”。

◇ -m 若家目录不存在,则创建它。

◇ -M 不创建家目录。

◇ -s shell 指定用户登录时的shell,默认为“/bin/bash”。

◇ -r 创建一个系统账户,该类用户的UID值在1~499之间。默认不创建对应的家目录。

【范例】 创建一个名为zyc1的用户,并作为network组的成员:

# useradd -g network zyc1
# passwd zyc1
# tail -1 /etc/passwd
zyc1:x:524:525::/home/zyc:/bin/bash

(2)设置用户账户属性。

用法:# usermod [option] username

选项及参数说明:

◇ -c 注释信息 对账户进行说明,该参数修改文件“/etc/passwd”的第5栏。

◇ -g 组账户名 该参数修改文件“/etc/passwd”的第4栏(GID)。

◇ -G组账户名 该参数修改该用户所属的其他组(附加组),即修改文件“/etc/group”。

◇ -d 用户的家目录 该参数修改文件“/etc/passwd”的第6栏。

◇ -e 失效日期 日期格式为:YYYY-MM-DD,该参数修改文件“/etc/shadow”的第8栏。

◇ -l 用户账户名 该参数修改文件“/etc/passwd”的第1栏。

◇ -s Shell文件 设置用户登录使用的shell,例如:/bin/bash、/bin/csh等。

◇ -u UID 该参数修改文件“/etc/passwd”的第3栏。

◇ -L 锁定用户账户,使其无法登录系统。该参数在“/etc/shadow”的密码栏首位添加“!”。

◇ -U 将用户账户解锁,该参数将去掉文件“/etc/shadow”的密码栏首位的“!”。

【范例】 将用户zy1c更名为zhangyingchun,将其家目录更改为“/home/zhangyingchun”,设置其密码在2012年12月12日失效。命令如下:

# usermod -l zhangyingchun -d /home/zhangyingchun -e “2012-12-12” zyc1
# tail -1 /etc/passwd
zhangyingchun:x:524:525::/home/zhangyingchun:/bin/bash
# grep zhangyingchun /etc/shadow
zhangyingchun:$1$Brbh5rBf$SCwajnNVcfLA16aYLc9w9.:15041:0:99999:7::15686:

【范例】 暂时锁定用户账户zhangyingchun。

# usermod -L zhangyinchun
# grep zhangyingchun /etc/shadow
zhangyingchun:!$1$Brbh5rBf$SCwajnNVcfLA16aYLc9w9.:15041:0:99999:7::15686:

(3)删除用户账户。

用法:# userdel [-r] username

选项及参数说明:

-r:连同用户的家目录一并删除。

【范例】 将用户账户zhangyingchun完整地删除。

# userdel -r zhangyingchun

2.用户密码管理

(1)设置用户登录密码。

使用useradd建立了用户账户之后,必须先设置密码才能登录系统。只有root才有权设置指定账户的密码,一般用户只能设置自己账户的密码。

用法:# passwd [username]

(2)锁定账户密码。

用法:# passwd -l username

在Linux中,除了用户账户可被锁定外,账户密码也可被锁定。只要任何一方被锁定,都将导致该账户无法登录系统。该命令在文件“/etc/shadow”的密码栏首位添加“!!”。只有root才有权执行该命令。

(3)解锁账户密码。

用法:# passwd -u username

该命令去掉文件“/etc/shadow”中密码栏首位的“!!”。只有root才有权执行该命令。

(4)查询密码状态。

用法:# passwd -S username

该命令用来查询当前账户的密码是否被锁定。若账户密码被锁定,将输出“Password locked.”,若未锁定,则显示“Password set,MD5 crypt.”。

【范例】 锁定用户petcat的密码,查询其状态,然后解锁:

(5)删除账户密码。

用法:# passwd -d username

只有root才有权删除账户的密码。密码被删除后该账户将不能登录系统。

3.管理用户组

(1)创建用户组。

用法:# groupadd [-g gid] [-r] groupname

选项及参数说明:

◇ -g gid 直接指定该组的GID值。

◇ -r 建立系统组。该类用户组的GID值在1~499之间。

(2)修改用户组属性。

用户组创建后,可以修改用户组的名称和用户组的GID值。

用法:# groupmod [-g gid] [-n groupname] groupname

选项及参数说明:

◇ -g gid 修改用户组的GID 值。

◇ -n groupname 修改用户组的账户名称。

【范例】 创建一个名为sg的系统用户组,然后将其账户名更改为sgnew,GID更改为102:

# groupadd -r sg
# tail -1 /etc/group
sg:x:101:
# groupmod -g 102 -n sgnew sg
# grep sgnew /etc/group
sgnew:x:102:

(3)删除用户组。

用法:# groupdel groupname

在删除用户组时,被删除的用户组不能是某个账户的私有组,否则将无法删除,若要删除,则应先删除该私有组中的账户,然后再删除该组。

(4)设置组管理员。

用法:# gpasswd [-A user1, ...] groupname

说明:设置为组管理员的用户不一定属于该组。

(5)管理组。

所谓管理组,就是将用户加入/移出指定的组。

用法:# gpasswd -a|-d username groupname

【范例】 用户student是testgroup组中的成员,请将用户petcat设置为network组的管理员,然后以petcat的身份将用户zhangyingchun加入该组,并从该组中移除用户teacher。操作过程如图4-17所示。

图4-17 管理组范例