用户管理

作者:David Bandel

一旦您的系统安装完成并且大多数服务配置完毕,就该添加用户了。您可能还没有过多考虑这个任务,但您应该考虑一下。

如果您像许多 Linux 初学者一样,您可能不了解给予某人访问您系统的权限的含义。也许,在一段时间内,您一直在使用 Unix 变体,其中基本决策已为您处理。实际上,一些安装程序,例如 Caldera 的 LISA(Linux 安装和系统管理),通过在安装过程中添加用户来启动该过程,然后允许您继续使用它来从系统中添加和删除用户。那么还有什么需要了解的呢?

首先,添加用户需要考虑您希望如何全面管理系统。安全直接受到诸如组和密码之类的事情的影响。它们的管理不应听天由命或安装程序的突发奇想——至少,在不探究它们的影响的情况下不应该。

/etc/passwd

当您添加用户时,无论您如何操作(稍后我会提到一些程序),您都会在 /etc/passwd 文件中添加一个条目。此文件由七个冒号分隔的字段组成,全部在同一行中指定

col:JkH7XmXwH6e/E:100:100:Bandel:/home/col:/bin/bash

这些字段是:用户登录名、密码、UID、GID、注释 (gecos) 字段、用户的主目录和用户的默认 shell。

如果您决定手动编辑 /etc/passwd 文件,请务必先制作备份副本,以便在出现问题时可以重新开始。总的来说,我建议使用专门设计用于编辑 /etc/passwd 文件的程序之一。

1. 登录名

第一个字段很容易解释。系统将此条目与下一个字段匹配作为用户的登录名/密码对。每个名称都必须是唯一的。这是唯一需要唯一的字段;稍后我将解释保持某些其他字段唯一的含义。除此之外,使用户名有意义有助于快速识别是谁在老板需要预算硬拷贝以便十分钟后参加董事会会议时,将 10MB 的文件发送到打印机。在包括 Linux 在内的大多数 Unix 变体中,登录名限制为 8 个字符。

2. 密码

第二个字段是密码。此字段可以包含多种内容,但通常包含加密密码。加密密码的长度必须为 13 个字符,由两个字符的种子加上加密密码组成。密码字段中经常看到的其他条目包括:“*”、“LOCKED”和“VOID”。如果您在此字段中看到“x”,您将需要阅读下面关于影子文件的内容。这些或任何其他不正确的条目,都会有效地将此用户锁定。如果您希望在不丢失他们正在使用的密码的情况下锁定用户,您可以在第一个字符中插入一个撇号。撇号永远不能用作“乱码”的一部分,因此除了作为种子的一部分是非法的之外,您还将字段大小设置为 14 个字符。要允许用户访问,只需删除撇号即可。

另请注意,此字段可能为空。始终检查 /etc/passwd 文件以确保第二个字段不为空。如果分隔此字段的两个冒号彼此相邻,中间没有任何内容,甚至没有空格,则该字段被定义为空或 NULL。如果为空,则登录不需要密码。这其中的含义是显而易见的。

3. UID

第三个字段是 UID(用户标识)。有效的 UID 范围是 0 到 65534。UID 为 0 对系统具有特殊意义;它是无所不能的“超级用户”,这个术语源自 su(替换用户)程序,普通用户通常使用该程序来成为 root 用户。当不带参数(用户名)调用或仅带连字符 (-) 调用时,root 是默认值。

UID 65534 通常保留给“nobody”,这是一个没有特权的用户,而不是非特权用户。此 UID 通常用于通过 FTP 或 HTTP 访问您系统的个人。

习俗规定,数字 1 到 99 保留给系统用户,例如 wheel、daemon、lp、operator、news、mail 等。这些数字对于大多数系统要求来说已经足够了。此外,您可能希望为半特权(暂且这么称呼)用户保留 100 到 999。这些用户是管理员,他们不需要完全的 root 权限,但他们确实做一些管理,因此需要比非特权用户更多的权限。为本地用户保留 1000 到 9999,为远程用户(如果有)保留 10000 到 65534。

如果以后需要搜索日志以查找可疑用户活动,为特定用户保留数字组会有所帮助。某些发行版(如 Caldera)从 100 开始 UID,另一些发行版(如 Red Hat)从 500 开始,还有一些发行版(如 Debian)为非特权用户从 1000 开始。只需确定一个方案并坚持下去。由于每个发行版都做自己的事情,为了在组织内混合发行版,如果系统联网,您必须手动干预。如果您想使用 NIS 或 NFS 来挂载公共目录(例如,/var/spool/mail、/home),则尤其如此。

与流行的看法相反,UID 字段不必是唯一的。事实上,一种让“想成为”系统破解者忙碌的方法是使用上面讨论的技术,并在 root 用户的密码字段的第一个字符中放置一个撇号。然后创建另一个条目,可能是 tuber,UID 为 0。某些系统要求 root 条目存在并且是第一个条目。

但请注意:非唯一字段可能会导致问题。例如,如果您以 tuber (UID 0) 身份登录并激活密码保护的屏幕锁定,当您尝试解锁它时,您会发现您自己聪明反被聪明误。内核通过您的 UID 识别您;它从 /etc/passwd 文件的顶部开始查找 UID 0,并发现它是与“root”对应的第一个条目——它就在那里停止;它不会再往下看。但是 root 用户的密码已被无效条目锁定。此时,您的选择是 telnet 进入并终止屏幕锁定进程,或重新启动机器。另一种摆脱困境的可能性是使用您运行的未锁定的虚拟终端,您可以切换到该终端。(有时,“额外的”虚拟终端会派上用场。)

在我离开 UID 之前,这里还有两件事要考虑。首先,如果您有任何“rhosts”文件引用您自己网络之外的其他系统,请确保您的用户名不仅在您的系统中是唯一的,而且在系统之间也是唯一的。如果您有一个 jonesd(Donna Jones 的)而另一个系统有一个 jonesd(Danny Jones 的),并且他们使用 rlogin 远程登录到彼此的系统,他们将有权访问彼此的文件(作为另一个人)。这些文件可能会导致许多问题,可能不应使用。

第二件事是 find 命令,系统管理程序广泛使用该命令,并且可以用于查找用户的文件以进行删除或更改所有者 (chown),在文件成为孤立文件之前(或之后)。学习此命令,并将其纳入您的工具箱。请参阅侧栏“关于 Find 命令的几句话”。

关于 Find 命令的几句话

4. GID

第四个字段是主 GID(组标识)号。每个用户都属于一个组。某些发行版使用通用组,例如“users”,每个人都属于该组。其他发行版创建“私有组”,并将每个用户分配到他自己的私有组作为其主组或默认组。Caldera 使用通用组,而 Red Hat 和 Debian 使用私有组。我建议阅读 Red Hat 用户手册,可以从 ftp.redhat.com/pub/redhat/redhat-4.1/Users-Guide/ 以各种格式通过匿名 FTP 获取。本手册中可以找到关于与减轻系统管理负担相关的私有组的讨论。

要发现他们所属的组,用户可以在命令提示符下键入 groups。返回的第一个组名是默认组。除非子目录的“setgid”位已打开,否则该用户保存的文件默认情况下会将组标识符设置为返回的第一个值。

5. 注释

第五个字段是注释,通常包含用户的全名。您可能会看到此字段被称为 gecos(通用电气综合操作系统)字段。影子文件有时会将此字段用于用户姓名以外的其他内容,但仅在特殊情况下。

6. 主目录

第六个字段是用户的主目录。给定没有参数或以波浪号 (~) 作为参数的 cd 命令将使用户移动到此目录。此目录必须具有完整路径名,即从根目录开始并向下。此规则的一个值得注意的例外是系统用户“bin”,其主目录的相对路径为 bin,因为系统上存在多个 bin 目录。

7. 默认 Shell

最后一个字段是用户的默认 shell。大多数 Linux 发行版(实际上,我所知道的所有发行版)默认使用 bash,即 Bourne Again Shell。对于大多数用户来说,这可能是最好的整体 shell。C 程序员倾向于喜欢其中一个 C shell(csh 或 tcsh)的语法,但对于编写脚本,大多数用户使用 bash 会做得更好。如果您需要用户拥有任何用途的系统条目(可能是 WWW 数据库帐户),但不希望他能够登录,您可以将 /bin/false 指定为他的 shell(通常对 nobody 帐户执行此操作)。shell 也可以是在用户登录时运行的程序,但这将是用户唯一可以做的事情——退出程序将注销他。如果您选择此选项,请注意某些程序允许用户从程序内部启动 shell。如果程序“shell out”到一个真正的 shell,那么用户就有一个进入系统的后门。

影子文件

关于影子文件的完整讨论超出了本文的范围。但是,为了让您了解它们是什么以及为什么创建它们,我提供以下内容。/etc/passwd 文件是“世界”可读的;任何人都可以复制它。“那又怎样”,您会说,“密码已加密且无法使用。” 不是真的。大多数用户,特别是那些选择自己密码的用户,选择的密码可以通过“字典攻击”来猜测或破解——也就是说,通过使用诸如 cops 之类的程序,攻击者可以运行字典通过 crypt 使用密码中的种子来查看是否获得匹配项。

当影子文件用于维护密码时,它不是世界可读的,也不能从系统上复制下来。密码字段中的“x”告诉您此系统使用影子密码。影子文件还包含有关密码上次更改时间、用户是否将被强制更改密码以及更改频率(密码到期日期)等信息。定期强制密码更改降低了不善于保护密码的用户带来的风险。

最新的 Linux 发行版都包含 PAM(可插拔身份验证模块)库。PAM 不需要应用程序“意识到 PAM”才能正常运行,但这些只是库,确实需要使用它们编写的程序。影子套件需要重新编译或替换许多程序,使其成为影子感知应用程序。如果您需要这种安全性,则需要认真阅读一些内容。

/etc/group

/etc/group 文件也是一个冒号分隔的列表,仅包含四个字段:组名、组密码、GID 和成员。组名/密码对的工作方式与 /etc/passwd 文件相同。但是,组通常没有与之关联的密码。快速查看您的 /etc/group 文件将显示第二个字段没有条目。向组添加密码通常不会增强安全性,因为用户对组密码(为什么不呢,每个人都知道)甚至比他们自己的密码更宽松。

Unix 中的原始组实现允许用户一次只属于一个组,并且如果需要,他们可以更改组。现在,一次属于多个组是很常见的,因此这在大多数情况下几乎无关紧要。文件另存为用户的主组,但可以使用 chgrp 命令手动更改,或通过目录上的 setgid 位更改。第三个字段是组标识号,其功能等同于其 /etc/passwd UID 对应项。第四个字段由逗号分隔的组成员列表组成(逗号后不使用空格)。

关于 /etc/passwd 和 /etc/group 文件的最后一点说明。我最近使用过的几个发行版一直在文件底部添加一行,如下所示:+:::::: (/etc/group 文件将只有四个冒号。)添加此行的目的是,如果在用户/密码对中找不到匹配的条目,则附加 NIS 数据库。这必须是文件中的最后一行。不读取此行之后的条目。我强烈建议,如果您不使用 NIS,请删除此行并使用 chmod 更改 ypbind 的权限,使其不可执行。如果您在没有正确设置的 NIS 服务器和正确的数据库的情况下运行 ypbind,您很容易被可以欺骗您的机器绑定到他的服务器并读取他的 NIS 映射以获得对您系统未经授权的访问的人所攻击。

添加和删除用户/组

所有 Linux 发行版都带有用于自动化添加、修改和删除用户过程的工具。所有发行版都包含 shell 脚本或程序,例如 adduseruseraddusermoduserdel。某些发行版,特别是 Caldera 和 Red Hat,附带了额外的程序来完成这项工作。Caldera 使用其 LISA 程序来处理添加和删除用户。Red Hat 的 usercfg,用于图形 (X11) 环境,不仅处理用户添加和删除,还有助于管理组。

所有这些都完成了某些基本任务,而不仅仅是在 /etc/passwd 文件中添加一行以及在 /etc/group 文件中添加适当的条目。鉴于 /etc/passwd 文件的敏感性以及损坏此文件的后果,仅凭这一点就足以保证其使用。没有人(甚至 root 用户)可以登录的系统用途不大。事实上,如果您确实使用编辑器编辑 /etc/passwd,则不应长时间保持打开状态。此文件被许多程序访问以进行登录和身份验证,保持此文件打开(尤其是在另一个用户决定更改其密码时)可能会导致系统不稳定。

所有这些脚本和程序都会提示您输入创建新帐户所需的信息。如果您需要添加或删除组帐户,则可以在大多数系统上找到 groupaddgroupdel (delgroup, addgroup, groupmod 等) 程序来完成此任务。

网络信息服务 (NIS)(以前称为黄页(英国电信的商标),程序上仍然带有“yp”前缀)的使用必然会改变我讨论过的一些程序,但基本原理保持不变。NIS 用于大型站点,以减轻将更改推送到每台机器的管理负担。但仍然需要设置帐户。NIS 只是集中和分发来自主服务器的文件,而不是单独更改每台机器上的文件。如果您确实在使用 NIS 的大型站点工作,您仍然需要在每台机器上设置一些正常帐户,以便在维护要求指示以单用户或非联网模式启动机器时使用。

安全

由于我在本文的开头就一直在提到安全性,因此我想我会提到一些程序来帮助您维护系统安全。

第一个程序 npasswd(与反转影子密码转换创建的文件无关)在用户更改密码时进行一些健全性检查。此程序通过将常规 passwd 程序 (/usr/bin/passwd 而不是 /etc/passwd) 重命名为类似 passwd.orig 的名称并从 passwd 创建到 npasswd 的链接来代替常规 passwd 程序使用。

您可能感兴趣的另一个程序是 pwgen。此程序生成随机密码,其中包含混合大小写字符、数字和合法(对于密码)标点符号。就我个人而言,我发现这些密码太难记住了,而且由于写下密码是安全禁忌,因此我设计了自己的(希望是)安全密码。

我提到 pwdutils 包仅适用于使用 NIS 的用户。此包包含 NIS 兼容程序。那些考虑使用 NIS 或影子文件的人需要确保他们用于系统管理(尤其是用户管理)的程序与 NIS 或影子套件一起使用。最重要的是,在您开始安装 NIS 或影子套件之前,请 RTFM——阅读精细手册(并备好紧急启动盘)。

/etc/skel

您可以做的无数事情中的一件会让您作为系统管理员的生活更轻松的事情是维护某些文件和子目录。经常被忽视的一个这样的子目录是 /etc/skel。此子目录是所有(据我所知)脚本和程序用来创建新用户的 $HOME 目录的骨架。您已经了解了管理程序如何将用户添加到 /etc/passwd。您已经注意到,同时创建了一个 /home/$USER 子目录,其中包含正确的权限和一些常用文件,例如 .bashrc、.cshrc 等。所有这些都是通过将 /etc/skel 及其所有文件和子目录复制到用户的新主目录并将所有权 (chown) 更改为新用户来完成的。使用 /etc/skel 目录来保存您希望新用户拥有的所有文件——可能是其 X 会话的默认 .fvwmrc 或对其 .bashrc 文件的一些更改。然后,一旦您运行 adduser 程序,新用户就可以开始工作了。

如果您查看我讨论过的一些程序,您会注意到有些是二进制文件,有些是脚本。我更喜欢使用修改后的 adduser 脚本,我在其中包含了几行我偶尔会忘记的内容。我的 Caldera 机器运行修改后的 fvwm (来自 LST),它写入文件 /var/run/xlaunch/$USER/background-:0.0。虽然如果目录不存在,这不是致命错误,但我不喜欢看到错误消息在我的控制台框中滚动。因此,我修改后的脚本包含两行来创建此子目录,然后 touch 文件名。您可以以类似的方式修改您的脚本。

结论

一旦设置完成,用户管理就没那么困难了。必要的工具默认安装,一些漂亮的 GUI 程序使这项任务几乎变得愉快。精心考虑的用户管理策略将帮助您增强安全性,同时使系统对您和用户都更友好且更易于使用。创建一些帐户,并将您的朋友介绍给“Linuxing”的乐趣。

User Administration
David Bandel 是一位计算机网络顾问,专门研究 Linux,但他很不情愿地与 Windows 和那些“真正的”Unix 机器(如 DEC 5000 和 Suns)合作。当他不工作时,他可以在自己的系统上进行黑客攻击,或者在飞机上从 2,500 英尺的高度欣赏西雅图的景色。他欢迎您的评论、批评、俏皮话,并且很乐意进一步混淆这个问题。可以通过电子邮件 dbandel@ix.netcom.com 与他联系。
加载 Disqus 评论