用户和组帐户
本节介绍初级管理(LPIC-1)考试 102 的 1.111.1 主题的内容。这个主题的权值为 4。
在本节中,我们将学习如何:
- 添加、修改和删除用户和组
- 终止和修改用户帐户
- 管理密码数据库和组数据库中的用户和组信息
- 使用正确的工具管理影子密码数据库和组数据库
- 创建和管理受限制的和用于特殊用途的帐户
正如在 “LPI 101 考试准备(主题 104):设备、Linux 文件系统和文件系统层次标准” 中学到的,Linux 是一种多用户系统,Linux 上的每个用户属于一个主 组,还可能属于其他组。在 Linux 中,文件的所有权与用户 id 和组密切相关。注意,可以作为一个用户登录,然后使用 su 或 sudo -s 变成另一个用户,然后可以使用 whoami 命令检查当前的有效 id,使用 groups 命令了解当前用户所属的组。在本节中,学习如何创建、删除和管理用户和组。还要了解 /etc 中的文件,这个目录中存储用户和组信息。
添加和删除用户和组
使用 useradd 命令在 Linux 系统中添加用户,使用 userdel 命令删除用户。与此相似,分别使用 groupadd 和 groupdel 命令添加和删除组。
添加用户或组
现代的 Linux 桌面往往为用户和组管理提供了图形界面。常常可以通过用于系统管理的菜单项访问这些图形界面。这些界面的差异相当大,所以您系统上的界面可能与这里的示例不一样,但是底层概念和命令是相似的。
首先,以图形化方式在 Fedora Core 5 系统中添加一个用户,然后查看底层命令。对于使用 GNOME 桌面的 Fedora Core 5,使用 System > Administration > Users and Groups,然后单击 Add User 按钮。
图 1 显示 User Manager 面板和 Create New User 面板,其中显示了新用户 ‘john’ 的基本信息。已经输入了用户的完整姓名(John Doe)和密码。面板指定默认的登录 shell 为 /bin/bash。在 Fedora 系统上,默认行为是创建一个与这个用户同名(在这个示例中是 ‘john’)的新组和主目录 /home/john。
图 1. 添加用户
清单 1 显示如何使用 id 命令显示这个新用户的基本信息。可以看到,john 的用户编号是 503,他与 john 组(组编号为 503)相关联。这是 john 所属的惟一一个组。
清单 1. 显示用户 id 信息
[root@pinguino ~]# id john
uid=503(john) gid=503(john) groups=503(john)
|
要想从命令行完成同样的任务,应该使用 groupadd 和 useradd 创建组和用户,然后使用 passwd 命令为新创建的用户设置密码。这些命令都需要根权限。清单 2 使用这些命令添加另一个用户 jane。
清单 2. 添加用户 jane
[root@pinguino ~]# groupadd jane
[root@pinguino ~]# useradd -c "Jane Doe" -g jane -m jane
[root@pinguino ~]# passwd jane
Changing password for user jane.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
[root@pinguino ~]# id jane
uid=504(jane) gid=504(jane) groups=504(jane)
[root@pinguino ~]# ls -ld /home/jane
drwx------ 3 jane jane 4096 Jun 25 18:22 /home/jane
|
在这两个示例中,用户 id 和组 id 的值都大于 500。请注意,一些比较新的系统的用户 id 从 1000 开始编号,而不是从 500 开始。这些值通常表示普通用户,500(对于从 1000 开始普通用户编号的系统,是 1000)以下的值是为系统用户 保留的。本节后面将讨论 系统用户。实际的分界点是在 /etc/login.defs 中作为 UID_MIN 和 GID_MIN 设置的。
在上面的清单 2 中,groupadd 命令接受一个参数 jane ,这是要添加的组的名称。组名必须以小写字母或下划线开头,通常只包含小写字母、下划线和连字符或破折号。可以指定的选项见表 3。
表 3. groupadd 的选项
选项 |
用途 |
-f |
如果这个组已经存在,那么以成功状态退出。这对于脚本编程很方便,这样就不需要在尝试创建一个组之前检查它是否存在。 |
-g |
手工指定组 id。默认行为是使用大于等于 GID_MIN 并大于现有的任何组 id 的最小值。组 id 通常是惟一的,而且必须是非负的。 |
-o |
允许组具有非惟一的 id。 |
-K |
可以用来覆盖来自 /etc/login.defs 的默认设置。 |
在上面的清单 2 中,useradd 命令接受一个参数 jane ,这是要添加的用户的名称,还指定了 -c 、-g 和 -m 选项。useradd 命令的常用选项见表 4。
表 4. useradd 的选项
选项 |
用途 |
-b --base-dir |
创建用户主目录的默认基目录。这常常是 /home,用户的主目录是 /home/$USER。 |
-c --comment |
描述 id 的文本字符串,比如用户的完整姓名。 |
-d --home |
为主目录指定目录名。 |
-e --expiredate |
帐户将过期或禁用的日期,采用的形式是 YYYY-MM_DD。 |
-g --gid |
用户的初始登录组的名称或编号。这个组必须已经存在,所以在清单 2 中先创建 jane 组,然后再创建 jane 用户。 |
-G --groups |
用户所属的其他组的列表(以逗号分隔)。 |
-K |
可以用来覆盖来自 /etc/login.defs 的默认设置。 |
-m --create-home |
如果用户的主目录不存在,就创建它。将 /etc/skel 中的骨架文件和所有目录复制到主目录。 |
-o --non-unique |
允许用户具有非惟一的 id。 |
-p --password |
加密的密码。如果没有指定密码,默认行为是禁用帐户。通常会在后续步骤中使用 passwd 命令,而不是生成加密的密码并在 useradd 命令中指定它。 |
-s --shell |
如果用户的登录 shell 不是默认的登录 shell,那么可以用这个选项指定用户的登录 shell 的名称。 |
-u --uid |
非负的数字用户 id;如果没有指定 -o 选项,那么用户 id 必须是惟一的。默认行为是使用大于等于 UID_MIN 并大于现有的任何用户 id 的最小值。 |
注意:
- 一些系统(包括 Fedora 和 Red Hat 发行版)对创建用户命令提供了扩展。例如,默认的 Fedora 和 Red Hat 行为是为一个用户创建一个新组,可以在
useradd 命令中使用 -n 选项来禁用这个功能。应该了解这些系统差异,如果有疑问,应该参考系统上的手册页。
- 在 SUSE 系统上,使用 YaST 或 YaST2 访问用户和组管理图形界面。
- 图形界面可能会执行其他任务,比如在 /var/spool/mail 中创建用户的邮件文件。
删除用户或组
与添加用户或组相比,删除用户或组要简单得多,因为选项更少。实际上,用来删除组的 groupdel 命令只需要组名;它没有选项。不能删除任何用户的主组。如果使用图形界面删除用户或组,其功能与这里显示的命令非常相似。
使用 userdel 命令删除用户。-r 或 --remove 选项请求同时删除用户的主目录以及其中包含的任何内容,还删除用户的邮件 spool。如果在 /etc/login.defs 中还设置了 USERGROUPS_ENAB 为 yes,那么在删除用户时,还会删除与用户同名的组,但这个组必须不是另一个用户的主组。
在清单 3 中可以看到一个删除组的示例,在这里有多个用户共享同一个主组。之前已经在系统中添加了另一个用户 jane2,他的组与 jane 相同。
清单 3. 删除用户和组
root@pinguino:~# groupdel jane
groupdel: cannot remove user‘s primary group.
root@pinguino:~# userdel -r jane
userdel: Cannot remove group jane which is a primary group for another user.
root@pinguino:~# userdel -r jane2
root@pinguino:~# groupdel jane
|
注意:
- 有一个
userdel 选项 -f 或 --force ,可以使用它同时删除用户和他们的组。这个选项很危险,只应该作为最后的手段。执行此操作之前,请仔细阅读手册页。
- 注意,如果删除用户或组,而且文件系统上有属于这个用户或组的文件,那么这些文件不会自动地删除或分配给另一个用户或组。
终止和修改帐户
您现在可以创建或删除用户 id 或组,还可能需要修改它们。
修改用户帐户
假设用户 john 希望用 tcsh shell 作为默认 shell。常常可以在图形界面中找到编辑用户(或组)的方法,或者查看对象属性的方法。图 2 是 Fedora Core 5 系统上用户 john 的属性对话框。
图 2. 修改用户帐户
在命令行上可以使用 usermod 命令修改用户帐户。可以使用 useradd 的大多数选项,但是不能为这个用户创建或填充新的主目录。如果需要修改用户名,那么指定 -l 或 --login 选项并加上新名称。可能希望修改主目录名称来匹配用户 id。还可能需要修改其他项目的名称,比如电子邮件 spool 文件。如果修改登录 shell,那么可能需要修改一些相关联的配置文件。清单 4 将用户 john 改为 john2,将 /bin/tcsh 设置为默认 shell,并将主目录重命名为 /home/john2。
清单 4. 修改用户
[root@pinguino ~]# usermod -l john2 -s /bin/tcsh -d /home/john2 john
[root@pinguino ~]# ls -d ~john2
ls: /home/john2: No such file or directory
[root@pinguino ~]# mv /home/john /home/john2
[root@pinguino ~]# ls -d ~john2
/home/john2
|
注意:
- 如果需要修改用户的其他组,那么必须指定其他组的完整列表。没有命令只为用户添加或删除一个组。
- 如果一个用户已经登录,或者他有正在运行的进程,那么对修改他的名称或 id 有一些限制。详情请查阅手册页。
- 如果修改一个用户的编号,可能希望修改他拥有的文件和目录来匹配这个新编号。
修改组
使用 groupmod 修改组信息。用 -g 选项修改组编号,用 -n 选项修改名称。
清单 5. 修改组名称
[root@pinguino ~]# ls -ld ~john2
drwx------ 3 john2 john 4096 Jun 26 18:29 /home/john2
[root@pinguino ~]# groupmod -n john2 john
[root@pinguino ~]# ls -ld ~john2
drwx------ 3 john2 john2 4096 Jun 26 18:29 /home/john2
|
在清单 5 中,当使用 groupmod 修改组名称时,john2 的组目录的组名称自动地改变了。觉得奇怪吗?因为组在文件系统索引节中由它们的编号表示,而不是由名称表示。但是,如果修改组的编号,那么应该更新以这个组作为主组的所有用户,还可能希望更新属于这个组的文件和目录来匹配新编号(采用上面介绍的修改用户编号的方法)。清单 6 将用户 john2 的组编号改为 505,更新用户帐户,并对 /home 文件系统中受影响的所有文件做适当的修改。如果可能的话,您也许希望对用户和组重新编号。
清单 6. 修改组编号
[root@pinguino ~]# groupmod -g 505 john2
[root@pinguino ~]# ls -ld ~john2
drwx------ 3 john2 503 4096 Jun 26 18:29 /home/john2
[root@pinguino ~]# id john2
uid=503(john2) gid=503 groups=503
[root@pinguino ~]# usermod -g john2 john2
[root@pinguino ~]# id john2
uid=503(john2) gid=505(john2) groups=505(john2)
[root@pinguino ~]# ls -ld ~john2
drwx------ 3 john2 503 4096 Jun 26 18:29 /home/john2
[root@pinguino ~]# find /home -gid 503 -exec chgrp john2 {} \;
[root@pinguino ~]# ls -ld ~john2
drwx------ 3 john2 john2 4096 Jun 26 18:29 /home/john2
|
用户和组密码
您已经看到了用来修改用户密码的 passwd 命令。密码是(或应该是)用户惟一的,可以由用户修改。根用户可以修改任何用户的密码。
组也可以有密码,使用 gpasswd 命令设置它们。如果用户知道组密码,他们就能够用 newgrp 命令临时加入一个组。当然,让许多人知道一个密码是不安全的,所以必须权衡用 usermod 将用户加入组的优点,以及让太多人知道组密码的安全风险。
终止或锁定帐户
如果需要禁止一个用户登录,那么可以使用 usermod 命令的 -L 选项终止(suspend)或锁定(lock)帐户。使用 -U 选项给帐户解锁(unlock)。清单 7 显示如何锁定 john2 帐户,以及在 john2 试图登录系统时发生的情况。注意,当 john2 帐户解锁时,会恢复相同的密码。
清单 7. 锁定帐户
[root@pinguino ~]# usermod -L john2
[root@pinguino ~]# ssh john2@pinguino
john2@pinguino‘s password:
Permission denied, please try again.
|
在 图 2 中,对话框上有几个选项卡显示其他用户属性。我们简要提到了如何使用 passwd 命令设置用户密码,但是这个命令和 usermod 命令都可以执行与用户帐户相关的许多任务,它们的作用与 chage 命令相似。表 5 列出了一部分选项。关于这些和其他选项的更多细节,请参考手册页。
表 5. 修改用户帐户的命令和选项
命令的选项 |
用途 |
Usermod |
Passwd |
Chage |
|
-L |
-l |
N/A |
锁定或终止帐户。 |
-U |
-u |
N/A |
对帐户解锁。 |
N/A |
-d |
N/A |
将帐户设置为无密码,从而禁用帐户。 |
-e |
-f |
-E |
为帐户设置过期日期。 |
N/A |
-n |
-m |
以天为单位的最小密码生命周期。 |
N/A |
-x |
-M |
以天为单位的最大密码生命周期。 |
N/A |
-w |
-W |
在必须修改密码之前提前发出警告的天数。 |
-f |
-i |
-I |
密码过期之后,直到禁用帐户之前的天数。 |
N/A |
-S |
-l |
输出关于当前帐户状态的简短消息。 |
管理用户和组数据库
用户和组信息的主要存储库是 /etc 中的 4 个文件。
- /etc/passwd
- 这是密码 文件,包含关于用户的基本信息
- /etc/shadow
- 这是影子密码 文件,包含加密的密码
- /etc/group
- 这是组 文件,包含组的基本信息以及哪些用户属于哪些组
- /etc/gshadow
- 这是影子组 文件,包含加密的组密码
本文前面介绍的命令会更新这些文件;在讨论这些文件之后,您还会看到处理它们的更多命令。这些文件都是纯文本文件。一般情况下,不应该直接编辑它们。应该使用工具更新它们,从而正确地锁定它们并保持同步。
您会注意到,passwd 和 group 文件都阴影化 了。这是为了保障安全。passwd 和 group 文件本身必须是广泛可读的,但是加密的密码不应该是广泛可读的。因此,影子文件包含加密的密码,只有根用户能够读取这些文件。suid 程序提供必要的身份验证访问;suid 程序具有根权限,但是任何人都可以运行它。确保为您的系统正确地设置权限。清单 8 给出一个示例。
清单 8. 用户和组数据库权限
[ian@pinguino ~]$ ls -l /etc/passwd /etc/shadow /etc/group /etc/gshadow
-rw-r--r-- 1 root root 701 Jun 26 19:04 /etc/group
-r-------- 1 root root 580 Jun 26 19:04 /etc/gshadow
-rw-r--r-- 1 root root 1939 Jun 26 19:43 /etc/passwd
-r-------- 1 root root 1324 Jun 26 19:50 /etc/shadow
|
注意: 尽管从技术上说可以不使用影子密码和影子组文件,但是几乎从不这样做,也不建议这样做。
/etc/passwd 文件
/etc/passwd 文件对于系统中的每个用户包含一行记录。清单 9 给出了一些示例行。
清单 9. /etc/password 条目
root:x:0:0:root:/root:/bin/bash
jane:x:504:504:Jane Doe:/home/jane:/bin/bash
john2:x:503:505:John Doe:/home/john2:/bin/tcsh
|
每行包含几个由冒号(:)分隔的字段,见表 6。
表 6. /etc/passwd 中的字段
字段 |
用途 |
Username |
用来登录系统的用户名。例如,john2。 |
Password |
加密的密码。在使用影子密码时,它包含一个 x 字符。 |
User id (UID) |
在系统中用来表示这个用户名的编号。例如,用户 john2 的编号是 503。 |
Group id (GID) |
在系统中用来表示这个用户的主组的编号。例如,用户 john2 的组编号是 505。 |
Comment (GECOS) |
一个用来描述用户的可选字段。例如,“John Doe”。这个字段可以包含多个逗号分隔的条目。它还由 finger 等程序使用。GECOS 这个名称是由于历史原因形成的。详情见 man 5 passwd 。 |
Home |
用户主目录的绝对路径。例如,/home/john2。 |
Shell |
当用户登录系统时自动启动的程序。这常常是一个交互式 shell,比如 /bin/bash 或 /bin/tcsh,但可能是任何程序,不一定是交互式的 shell。 |
/etc/group 文件
/etc/group 文件对于系统中的每个组包含一行记录。清单 10 给出了一些示例行。
清单 10. /etc/group 条目
root:x:0:root
jane:x:504:john2
john2:x:505:
|
每行包含四个由冒号(:)分隔的字段,见表 7。
表 7. /etc/group 中的字段
字段 |
用途 |
Groupname |
这个组的名称。例如,john2。 |
Password |
加密的密码。在使用影子密码时,它包含一个 x 字符。 |
Group id (GID) |
在系统中用来表示这个组的编号。例如,组 john2 的编号是 505。 |
Members |
逗号分隔的组成员列表,但是不包括以这个组作为主组的成员。 |
影子文件
应该只有根用户能够读取 /etc/shadow 文件。它包含加密的密码,以及密码和帐户的过期信息。关于其中的字段的信息,参见手册页(man 5 shadow )。密码可以使用 DES 加密,但是常常使用 MD5 加密。DES 算法使用用户密码的前 8 个字符的低 7 位作为 56 位的密钥,而 MD5 算法使用整个密码。在这两种算法中,都对密码做 salt 处理,所以两个在其他方面相同的密码不会生成相同的加密值。清单 11 演示如何为用户 jane 和 john2 设置相同的密码,然后显示在 /etc/shadow 中生成的 MD5 加密密码。
清单 11. /etc/shadow 中的密码
[root@pinguino ~]# echo lpic1111 |passwd jane --stdin
Changing password for user jane.
passwd: all authentication tokens updated successfully.
[root@pinguino ~]# echo lpic1111 |passwd john2 --stdin
Changing password for user john2.
passwd: all authentication tokens updated successfully.
[root@pinguino ~]# grep "^j" /etc/shadow
jane:$1$eG0/KGQY$ZJl.ltYtVw0sv.C5OrqUu/:13691:0:99999:7:::
john2:$1$grkxo6ie$J2muvoTpwo3dZAYYTDYNu.:13691:0:180:7:29::
|
输出开头的 $1$ 表示一个 MD5 密码。下面是 salt 值(直到下一个 $ 符号为止),它是一个最多 8 字符的长度可变的字段。余下的 22 字符的字符串是加密的密码。
操作用户和组的工具
您已经看到了几个操作用户帐户和组文件及其影子文件的命令。下面学习:
组管理员
在某些情况下,可能希望让根用户之外的用户能够管理一个或多个组,比如添加或删除组成员。清单 12 展示了根用户将用户 jane 设置为组 john2 的管理员,然后 jane 将用户 ian 添加为组成员。
清单 12. 添加组管理员和成员
[root@pinguino ~]# gpasswd -A jane john2
[root@pinguino ~]# su - jane
[jane@pinguino ~]$ gpasswd -a ian john2
Adding user ian to group john2
[jane@pinguino ~]$ id ian;id jane
uid=500(ian) gid=500(ian) groups=500(ian),505(john2)
uid=504(jane) gid=504(jane) groups=504(jane)
|
您可能会吃惊地发现,尽管 jane 是组 john2 的管理员,但她不是这个组的成员。/etc/gshadow 文件的结构可以解释这一现象的原因。/etc/gshadow 文件为每个条目包含四个字段,见表 8。注意,第三个字段是逗号分隔的组管理员列表。
表 8. /etc/gshadow 中的字段
字段 |
用途 |
Groupname |
这个组的名称。例如,john2。 |
Password |
如果这个组有密码,这个字段就用来保存加密的密码。如果没有密码,在这里可能会看到 ‘x’、‘!’ 或 ‘!!’。 |
Admins |
逗号分隔的组管理员列表。 |
Members |
逗号分隔的组成员列表。 |
可以看到,管理员列表和成员列表是两个不同的字段。gpasswd 的 -A 选项允许根用户添加组管理员,-M 选项允许根用户添加组成员。-a (注意,是小写的)选项允许管理员添加组成员,-d 选项允许管理员删除组成员。其他选项可以删除组密码。细节见手册页。
编辑密码和组文件的命令
尽管不属于 LPI 学习目标,但是还应该知道 vipw 命令可以安全地编辑 /etc/passwd,vigr 命令可以安全地编辑 /etc/group。在使用 vi 编辑器进行修改时,这些命令会锁定相关文件。如果修改 /etc/passwd,那么 vipw 会询问是否也需要更新 /etc/shadow。同样,如果使用 vigr 更新 /etc/group,就会询问是否更新 /etc/gshadow。如果需要删除组管理员,就需要使用 vigr ,因为 gpasswd 只能添加管理员。
转换程序
还有四个没有在 LPI 学习目标中列出的相关命令。它们是 pwconv 、pwunconv 、grpconv 和 grpunconv 。它们用来在影子和非影子密码和组文件之间进行转换。您可能不会用到它们,但是应该知道有这些命令存在。细节参见手册页。
受限制的和特殊用途的帐户
按照惯例,系统用户常常具有小于 100 的 id,根用户的 id 是 0。普通用户的自动编号是从 /etc/login.defs 中设置的 UID_MIN 值开始的,这个值常常设置为 500 或 1000。
除了普通用户帐户和根帐户之外,系统上常常有几个特殊用途的帐户,它们用于 FTP、SSH、邮件、新闻等守护进程。清单 13 显示 /etc/passwd 中一些特殊用途帐户的记录。
清单 13. 受限制的和特殊用途的帐户
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
news:x:9:13:news:/etc/news:
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
|
这样的帐户常常控制着文件,但是不应该通过普通的登录访问它们。因此,它们的登录 shell 常常设置为 /sbin/nologin 或 /bin/false,所以登录尝试会失败。
|