分享

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

 dazheng 2007-08-23

LPI 102 考试准备,主题 111: 管理任务

初级管理(LPIC-1)主题 111

developerWorks
第 2 页,共 10 页


对本教程的评价

帮助我们改进这些内容


用户和组帐户

本节介绍初级管理(LPIC-1)考试 102 的 1.111.1 主题的内容。这个主题的权值为 4。

在本节中,我们将学习如何:

  • 添加、修改和删除用户和组
  • 终止和修改用户帐户
  • 管理密码数据库和组数据库中的用户和组信息
  • 使用正确的工具管理影子密码数据库和组数据库
  • 创建和管理受限制的和用于特殊用途的帐户

正如在 “LPI 101 考试准备(主题 104):设备、Linux 文件系统和文件系统层次标准” 中学到的,Linux 是一种多用户系统,Linux 上的每个用户属于一个 组,还可能属于其他组。在 Linux 中,文件的所有权与用户 id 和组密切相关。注意,可以作为一个用户登录,然后使用 susudo -s 变成另一个用户,然后可以使用 whoami 命令检查当前的有效 id,使用 groups 命令了解当前用户所属的组。在本节中,学习如何创建、删除和管理用户和组。还要了解 /etc 中的文件,这个目录中存储用户和组信息。

添加和删除用户和组

使用 useradd 命令在 Linux 系统中添加用户,使用 userdel 命令删除用户。与此相似,分别使用 groupaddgroupdel 命令添加和删除组。

添加用户或组

现代的 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)
                        

要想从命令行完成同样的任务,应该使用 groupadduseradd 创建组和用户,然后使用 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_MINGID_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 的最小值。

注意:

  1. 一些系统(包括 Fedora 和 Red Hat 发行版)对创建用户命令提供了扩展。例如,默认的 Fedora 和 Red Hat 行为是为一个用户创建一个新组,可以在 useradd 命令中使用 -n 选项来禁用这个功能。应该了解这些系统差异,如果有疑问,应该参考系统上的手册页。
  2. 在 SUSE 系统上,使用 YaST 或 YaST2 访问用户和组管理图形界面。
  3. 图形界面可能会执行其他任务,比如在 /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
                        

注意:

  1. 有一个 userdel 选项 -f--force,可以使用它同时删除用户和他们的组。这个选项很危险,只应该作为最后的手段。执行此操作之前,请仔细阅读手册页。
  2. 注意,如果删除用户或组,而且文件系统上有属于这个用户或组的文件,那么这些文件不会自动地删除或分配给另一个用户或组。

 





回页首


终止和修改帐户

您现在可以创建或删除用户 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
                        

注意:

  1. 如果需要修改用户的其他组,那么必须指定其他组的完整列表。没有命令只为用户添加或删除一个组。
  2. 如果一个用户已经登录,或者他有正在运行的进程,那么对修改他的名称或 id 有一些限制。详情请查阅手册页。
  3. 如果修改一个用户的编号,可能希望修改他拥有的文件和目录来匹配这个新编号。

 

修改组

使用 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 学习目标中列出的相关命令。它们是 pwconvpwunconvgrpconvgrpunconv。它们用来在影子和非影子密码和组文件之间进行转换。您可能不会用到它们,但是应该知道有这些命令存在。细节参见手册页。





回页首


受限制的和特殊用途的帐户

按照惯例,系统用户常常具有小于 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,所以登录尝试会失败。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多