linux管理任务: 用户和组帐户

来源:百度文库 编辑:神马文学网 时间:2024/05/06 06:21:32
LPI 102 考试准备,主题 111: 管理任务
初级管理(LPIC-1)主题 111

第 2 页,共 10 页
对本教程的评价

帮助我们改进这些内容
用户和组帐户
本节介绍初级管理(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 显示如何使用 id 命令显示这个新用户的基本信息。可以看到,john 的用户编号是 503,他与 john 组(组编号为 503)相关联。这是 john 所属的惟一一个组。
[root@pinguino ~]# id john uid=503(john) gid=503(john) groups=503(john)
要想从命令行完成同样的任务,应该使用 groupadd 和 useradd 创建组和用户,然后使用 passwd 命令为新创建的用户设置密码。这些命令都需要根权限。清单 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 相同。
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 的属性对话框。

在命令行上可以使用 usermod 命令修改用户帐户。可以使用 useradd 的大多数选项,但是不能为这个用户创建或填充新的主目录。如果需要修改用户名,那么指定 -l 或 --login 选项并加上新名称。可能希望修改主目录名称来匹配用户 id。还可能需要修改其他项目的名称,比如电子邮件 spool 文件。如果修改登录 shell,那么可能需要修改一些相关联的配置文件。清单 4 将用户 john 改为 john2,将 /bin/tcsh 设置为默认 shell,并将主目录重命名为 /home/john2。
[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 选项修改名称。
[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 文件系统中受影响的所有文件做适当的修改。如果可能的话,您也许希望对用户和组重新编号。
[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 帐户解锁时,会恢复相同的密码。
[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 给出一个示例。
[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 文件对于系统中的每个用户包含一行记录。清单 9 给出了一些示例行。
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 文件对于系统中的每个组包含一行记录。清单 10 给出了一些示例行。
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 加密密码。
[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 添加为组成员。
[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 中一些特殊用途帐户的记录。
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,所以登录尝试会失败。