当前位置:Linux教程 - Linux - Linux系统管理者手册(管理用户帐号)

Linux系统管理者手册(管理用户帐号)



         Lars Wirzenius
    [email protected]

    翻译:赵炯
    [email protected]


    第九章 管理用户帐号

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

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

    什么是帐号?
    当一台计算机被许多人使用时,常常需要区分这些用户,例如,他们的私有文件保持私有。甚至,在某一时刻,计算机只能被单个用户使用时这也是很重要的,就如同许多微型计算机一样。 [1] 因此,每个用户都有一个唯一的用户名,这个用户名是用于登录的。
    然而,对于用户来说除了名字还有许多其它特性。一个帐号(account)是指属于一个用户的所有文件、资源、以及信息。这个术语暗示如同在银行一样,并且在一个商业系统中每个帐号通常有些金钱与之有关,并且依赖于用户如何使用系统,那些金钱以不同的速率花光。例如,磁盘空间可能每兆字节每天有个价,处理时间可以每秒钟有个价。

    创建一个用户
    Linux内核本身将用户仅仅看作是一些数字。每个用户都用唯一的一个数字加以识别,即用户id(user id)或uid,因为对于计算机来说处理数字比处理文字来的更快更容易。在内核外的一个独立的数据库为每个文字名称,即用户名(username),指派了一个用户id。
    该数据库同样也包含一些另外的信息。
    要创建一个用户,你需要给用户数据库增加有关该用户的信息,并为该用户建立一个登录目录(用户主目录)。还常常需要训练该用户,并为它设立适当的初始环境。
    许多Linux发行版带有一个创建帐号的程序。现有几种这样的程序。两个可选的命令行命令是adduser和useradd;同样也许有个GUI上的工具。不管是什么样的程序,其结果是很少需要进行手工作业。尽管如此,细节却是很多并且复杂而难以理解,这些程序使得任何事情看上去都很简单而直接。不过,在手工创建用户帐号一节中描述了如何手工做到这点。

    /etc/passwd以及其他信息文件
    UNIX系统中基本的用户数据库是字符型文件,/etc/passwd(称为口令文件),里面列出了所有有效用户的用户名以及它们相关的信息。每个用户名对应文件中的一行,并且用冒号分成七个域:
    。用户名
    。口令,以加密的方式。
    。数字形式的用户id。
    。数字形式的组id。
    。帐号的全名或其它描述。
    。登录(主)目录。
    。登录shell(登录时运行的程序)。

    在passwd的manual page中有对格式更详细的解释。
    系统上的任何用户都可以读取口令文件,例如,他们可以知道其他用户的名称。这同样意味着每个人也都能看到口令(第二个域)。口令文件对口令进行了加密,所以从理论上讲是没有问题的。然而,这个加密术是可以破的,特别是当口令取得不好时(也即,它很短或者它可以从字典中查到)。因此,将口令放在口令文件中是不太好的。
    许多Linux系统有影子口令(shadow passwords)。这是存储口令的另一种方法:加密的口令被存储在一个独立的文件中,/etc/shadow,只有root用户能读取这个文件。/etc/passwd文件的第二个域只含有一个特殊的标记。任何一个需要验证用户的程序需要设置uid,由此可以访问影子口令文件了。只使用口令文件其它域的常规的程序是得不到口令的。[2]

    选取用户和组的id数值
    在许多系统上,用户和组的id数值是怎样的并无关系,但是如果你使用网络文件系统(NFS),你必须在所有的系统中有相同的uid和gid。这是因为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中的文件拷贝到这个新目录中。
    。用chown和chmod修改所有权和权限。此时,-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]

    删除一个用户
    要删除一个用户,你首先要删除他的所有文件、邮箱、邮件别名、打印作业、cron和at作业、以及所有该用户的其它一切。然后,从/etc/passwd以及 /etc/group中移去相关行(记住,从所有组中移去该用户名)。在开始进行删除工作时,最好首先禁用该帐号(见下面),以免在该帐号正被删除之际,用户正使用该帐号。
    记住,用户可能在他的登录目录(他的主目录)之外还有文件。find命令可用来找出它们:

    find / -user username

    然而,如果你的硬盘很大的话,上面这条命令将需要很长的时间。如果你加载上了网络磁盘,你就必须小心,不要搜索网络或其上的服务器。
    有些Linux发行版带有做这个工作的专用命令;参见deluser或userdel。不过,手工同样也能轻易地做到,而且使用命令可能做不彻底。

    临时禁用一个用户
    有时需要临时禁用一个帐号,而不是删除它。例如,用户可能没有付费,或者系统管理员可能怀疑有个解密高手已经取得了该帐号的口令。
    最好的禁用一个帐号的方法是将它的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,你会觉得很有趣。
    发布人:netbull 来自:Linux自由鸽