第九章 管理用户帐号

 

“系统管理员与毒品销售商的相似之处在于:两者都是用K来度量,两者都有用户。”(老的,陈旧的计算机笑话。)

本章解释如何创建新用户帐号,如何修改这些帐号的属性,以及如何删除帐号。不同的Linux系统有不同的工具来做这些工作。

 

什么是帐号?

当一台计算机被许多人使用时,常常需要区分这些用户,例如,他们的私有文件保持私有。甚至,在某一时刻,计算机只能被单个用户使用时这也是很重要的,就如同许多微型计算机一样。 [1] 因此,每个用户都有一个唯一的用户名,这个用户名是用于登录的。

然而,对于用户来说除了名字还有许多其它特性。一个帐号(account)是指属于一个用户的所有文件、资源、以及信息。这个术语暗示如同在银行一样,并且在一个商业系统中每个帐号通常有些金钱与之有关,并且依赖于用户如何使用系统,那些金钱以不同的速率花光。例如,磁盘空间可能每兆字节每天有个价,处理时间可以每秒钟有个价。

 

创建一个用户

Linux内核本身将用户仅仅看作是一些数字。每个用户都用唯一的一个数字加以识别,即用户iduser id)或uid,因为对于计算机来说处理数字比处理文字来的更快更容易。在内核外的一个独立的数据库为每个文字名称,即用户名(username),指派了一个用户id

该数据库同样也包含一些另外的信息。

要创建一个用户,你需要给用户数据库增加有关该用户的信息,并为该用户建立一个登录目录(用户主目录)。还常常需要训练该用户,并为它设立适当的初始环境。

许多Linux发行版带有一个创建帐号的程序。现有几种这样的程序。两个可选的命令行命令是adduseruseradd;同样也许有个GUI上的工具。不管是什么样的程序,其结果是很少需要进行手工作业。尽管如此,细节却是很多并且复杂而难以理解,这些程序使得任何事情看上去都很简单而直接。不过,在手工创建用户帐号一节中描述了如何手工做到这点。

/etc/passwd以及其他信息文件

UNIX系统中基本的用户数据库是字符型文件,/etc/passwd(称为口令文件),里面列出了所有有效用户的用户名以及它们相关的信息。每个用户名对应文件中的一行,并且用冒号分成七个域:

。用户名

。口令,以加密的方式。

。数字形式的用户id

。数字形式的组id

。帐号的全名或其它描述。

。登录(主)目录。

。登录shell(登录时运行的程序)。

passwdmanual page中有对格式更详细的解释。

系统上的任何用户都可以读取口令文件,例如,他们可以知道其他用户的名称。这同样意味着每个人也都能看到口令(第二个域)。口令文件对口令进行了加密,所以从理论上讲是没有问题的。然而,这个加密术是可以破的,特别是当口令取得不好时(也即,它很短或者它可以从字典中查到)。因此,将口令放在口令文件中是不太好的。

许多Linux系统有影子口令(shadow passwords)。这是存储口令的另一种方法:加密的口令被存储在一个独立的文件中,/etc/shadow,只有root用户能读取这个文件。/etc/passwd文件的第二个域只含有一个特殊的标记。任何一个需要验证用户的程序需要设置uid,由此可以访问影子口令文件了。只使用口令文件其它域的常规的程序是得不到口令的。[2]

选取用户和组的id数值

在许多系统上,用户和组的id数值是怎样的并无关系,但是如果你使用网络文件系统(NFS),你必须在所有的系统中有相同的uidgid。这是因为NFS也用uid的数值来确认用户的。如果你没有使用NFS,你可以让你的帐号创建工具自动地选择它们。

如果你使用NFS,你就必须为同步帐号信息创建一种机制。另一种方法是使用NIS系统(见XXX网络管理员手册)。

然而,你应该避免重复使用曾经有的uid值(以及用户名),因为uid(或用户名)的新的拥有者有可能能够访问到原来的相同用户名的文件(或邮件、或其它的信息)。

 

初始化环境:/etc/skel

当为一个新用户创建了登录(主)目录时,就为用/etc/skel中的文件对这个目录进行初始化工作。系统管理员能够在/etc/skel中建立文件,这些文件可以为用户提供一个很好的缺省环境。例如,他可以建立一个/etc/skel/.profile文件,在其中可以为一些编辑器设置成对新用户友好的EDITOR环境。

然而,通常最好尽量保持/etc/skel越小越好,否则的话就很难更新已存在的用户的这些文件了。例如,如果友好编辑器的名称改变了,那么所有现存用户就不得不编辑修改他们的.profile文件。虽然系统管理员可以用一个描述文件来作自动的修改,当这样做几乎肯定会搞乱一些人的.profile文件。

只要可能,尽量将全局配置放入全局文件中,比如/etc/profile。这样就可以在不破坏用户自己的设置下做更新工作。

 

手工创建用户帐号

按以下步骤手工地创建一个新帐号:

。使用vipw编辑/etc/passwd并为新帐号加入一新行。小心语法。不要直接用一个编辑器编辑该文件!vipw会锁住这个文件,这样别的命令就不能同时更新它。你应该让口令域成‘*’,这样这个帐号就还不可以登录。

。类似地,如果你也想创建一个新组时,使用vigr来编辑/etc/group文件。

。使用mkdir为该用户建立一个登录(主)目录。

。将/etc/skel中的文件拷贝到这个新目录中。

。用chownchmod修改所有权和权限。此时,-R选项是非常有用的。不同的站点的权限稍有不同,但是通常以下命令所做的是正确的:

cd /home/newusername

chown -R username.group .

chmod -R go=u,go-w .

chmod go= .

。用passwd设置口令。

当你在最后一步设置好口令以后,该帐号就可以被使用了。在所有的工作都做完之前你不应该设置口令,否则的话,很有可能当你仍在拷贝文件时该用户冒昧地登录了进来。

有时需要创建不被用户使用的哑帐号(dummy accounts[3]。例如,为了设置一个匿名FTP服务器(这样任何人都可以从上面下载文件,而无需首先有一个帐号),必须创建一个叫做ftp的帐号。在这种情况下,不需要设置口令(上面的最后一步)。确实,最好不要,这样没人可以使用这个帐号,除非他们首先成为root,而root可以变成任何用户的。

 

更改用户属性

有一些命令用于更改一个帐号的各种属性(也即,/etc/passwd中的相关域):

chfn

更改全名域。

chsh

更改登录的shell

passwd

改变口令。

超级用户可以使用这些命令来改变任何帐号的属性。普通用户只能更改自己帐号的属性。有时也需要不让普通用户使用这些命令(用chmod来改),例如在一个有许多新手的环境中。

其它的一些任务需要手工来做。例如,要改变用户名,你需要直接编辑/etc/passwd文件(记住,用vipw)。同样地,要将用户加入进一些组中或从一些组中删除,你需要编辑/etc/group文件(用vigr)。这些任务其实是不多的,然而,你要很小心地去做:例如,如果你改变了用户名,用户就再也收不到原来的e-mail了,除非你也建立了邮件的别名。[4]

 

删除一个用户

要删除一个用户,你首先要删除他的所有文件、邮箱、邮件别名、打印作业、cronat作业、以及所有该用户的其它一切。然后,从/etc/passwd以及 /etc/group中移去相关行(记住,从所有组中移去该用户名)。在开始进行删除工作时,最好首先禁用该帐号(见下面),以免在该帐号正被删除之际,用户正使用该帐号。

记住,用户可能在他的登录目录(他的主目录)之外还有文件。find命令可用来找出它们:

find / -user username

然而,如果你的硬盘很大的话,上面这条命令将需要很长的时间。如果你加载上了网络磁盘,你就必须小心,不要搜索网络或其上的服务器。

有些Linux发行版带有做这个工作的专用命令;参见deluseruserdel。不过,手工同样也能轻易地做到,而且使用命令可能做不彻底。

 

临时禁用一个用户

有时需要临时禁用一个帐号,而不是删除它。例如,用户可能没有付费,或者系统管理员可能怀疑有个解密高手已经取得了该帐号的口令。

最好的禁用一个帐号的方法是将它的shell换成一个特殊的程序,这个程序只是打印一条消息。这样,不管谁想登录进这个帐号,都将失败,并会知道为什么。这条消息可以告诉用户去与系统管理员联系以解决任何问题。

同样也可以将用户名或口令改成别的,但这样做的话这个用户会被搞懵了,不知道怎么回事。让用户感到困惑意味着会有更多的麻烦。[5]

建立特殊程序的一个简单方法是写一个‘tail scripts(描述文件)’:

#!/usr/bin/tail +2

This account has been closed due to a security breach.

Please call 555-1234 and wait for the men in black to arrive.

头两个字符(‘#!’)告诉内核该行的余下部分是命令,是用于解释执行这个文件的。在这种情况下的tail命令将在标准输出设备上输出除第一行以外的所有信息。

如果用户billg被怀疑有破坏安全的行为,系统管理员可能会象以下这样做:

# chsh -s /usr/local/lib/no-login/security billg

# su - tester

This account has been closed due to a security breach.

Please call 555-1234 and wait for the men in black to arrive.

#

当然,这里的su的目的是用于测试改变是否发挥作用了。

Tail scripts应该存放在一个独立的目录中,这样,他们的名字不会妨碍普通用户的命令。

注释

  1. 如果我的姐姐能够看到我的情书,那是多么地尴尬啊。
  2. 的确,这说明口令文件含有一个用户的除了口令之外的所有信息。这真是发展的奇妙之处。
  3. 超现实的用户?
  4. 例如,由于结婚了,用户的名字可能会改变并且他想让他的用户名反映他的新名字。
  5. 如果你是个BOFH,你会觉得很有趣。