3.3.用户和基本账户管理

FreeBSD 允许多个用户同时使用计算机。虽然在任何时候只有一个用户可以坐在屏幕前使用键盘,但任意数量的用户都可以通过网络登录到系统中。为了使用该系统,每个用户都应该有自己的用户账户。

本章介绍:

  • FreeBSD系统中不同类型的用户帐号。

  • 如何添加,删除,和修改用户账户。

  • 如何设置限制来控制允许用户和群组访问的资源。

  • 如何创建组并将用户添加为组的成员。

3.3.1.账户类型

由于对 FreeBSD 系统的所有访问都是通过帐户实现的,而且所有进程都是由用户运行的,因此用户和帐户的管理非常重要。

主要有三种类型的账户:系统账户、用户账户和超级用户账户。

3.3.1.1.系统账户

系统账户用于运行服务,如 DNS、邮件和网络服务器。这样做的原因是安全问题;如果所有的服务都以超级用户的身份运行,它们就可以不受限制地行动。

系统账户的例子有daemon、operator、bind、news、www

在使用operator组时必须小心,因为可能会被授予类似超级用户的访问权限,包括但不限于关机、重启和访问该组中/dev中的所有项目。

nobody是通用的无特权系统账户。然而,使用nobody的服务越多,该用户将与更多的文件和进程相关联,因此该用户的特权就越大。

3.3.1.2.用户账户

用户账户被分配给真实的人,用来登录和使用系统。每个访问系统的人都应该有一个独特的用户账户。这使管理员能够发现谁在做什么,并防止用户篡改其他用户的设置。

每个用户都可以通过配置默认的 shell、编辑器、密钥绑定和语言设置来设置自己的环境,以适应他们对系统的使用。

在 FreeBSD 系统上的每个用户账户都有一些相关的信息。

User name

用户名称是在login:提示符下输入的。每个用户都必须有一个唯一的用户名。在 passwd(5)中记录了一些创建有效用户名的规则。建议使用由八个或更少的小写字母组成的用户名,以保持与应用程序的向后兼容性。

Password

每个账户都有一个相关的密码。

User ID (UID)

用户 ID(UID)是一个数字,用于在 FreeBSD 系统中唯一地识别用户。允许指定用户名的命令将首先把它转换为 UID。建议使用小于65535 的 UID,因为更高的值可能会引起某些软件的兼容性问题。

Group ID (GID)

组 ID(GID)是一个数字,用于唯一地识别用户所属的主组。组是一种机制,根据用户的 GID 而不是 UID 来控制对资源的访问。这可以大大减少一些配置文件的大小,并允许用户成为一个以上的组的成员。建议使用65535或更低的 GID,因为更高的 GID 可能会破坏一些软件。

Login class

登录类是对组机制的扩展,在为不同用户定制系统时提供了额外的灵活性。登录类别在配置登录类别中进一步讨论。

Password change time

默认情况下,密码是不会过期的。然而,可以在每个用户的基础上启用密码过期,迫使部分或所有用户在一定时间后改变他们的密码。

Account expiration time

默认情况下,FreeBSD 不对账户进行过期保护。当创建需要有限寿命的账户时,例如学校的学生账户,可以使用 pw(8) 指定账户的过期时间。在过期时间过后,这个账户就不能用来登录系统了,不过这个账户的目录和文件会保留。

User’s full name

用户名称对 FreeBSD 来说是账户的唯一标识,但不一定反映用户的真实姓名。与注释类似,这一信息可以包含空格、大写字母,并且长度超过8个字符。

Home directory

主目录是系统中一个目录的完整路径。当用户登录时,这是用户的起始目录。一个常见的惯例是把所有用户的主目录放在/home/username/usr/home/username下。每个用户都把他们的个人文件和子目录存放在自己的主目录下。

User shell

shell 为用户提供了与系统交互的默认环境。有许多不同种类的 shell,有经验的用户会有自己的偏好,这些偏好可以反映在他们的帐户设置中。

3.3.1.3.超级用户账户

超级用户账户,通常称为root,用于管理系统,没有权限限制。由于这个原因,它不应该被用于日常工作,如发送和接收邮件,对系统的一般探索,或编程。

超级用户与其他用户账户不同,可以不受限制地操作,滥用超级用户账户可能导致壮观的灾难。用户账户无法错误地破坏操作系统,因此建议以用户账户登录,只有在命令需要额外权限时才成为超级用户。

对于以超级用户身份发布的任何命令,一定要进行双重和三重检查,因为一个额外的空格或缺失的字符可能意味着不可修复的数据损失。

有几种方法可以获得超级用户的权限。虽然人们可以以 root 身份登录,但这是非常不可取的。

相反,使用 su(1)来成为超级用户。如果在运行这个命令时指定了-,用户也将继承根用户的环境。运行该命令的用户必须在wheel组中,否则命令会失败。该用户还必须知道根用户账户的密码。

在这个例子中,用户只有成为超级用户才能运行make install,因为这个步骤需要超级用户的权限。命令完成后,用户输入exit,离开超级用户账户,返回到用户账户的权限。

例1. 以超级用户身份安装一个程序

  1. % configure
  2. % make
  3. % su -
  4. Password:
  5. # make install
  6. # exit
  7. %

内置的 su(1)框架对于只有一个系统管理员的单一系统或小型网络来说效果很好。另一个选择是安装security/sudo软件包或 port。这个软件提供活动记录,并允许管理员配置哪些用户可以作为超级用户运行哪些命令。

3.3.2.管理账户

FreeBSD 提供了各种不同的命令来管理用户账户。最常见的命令在《管理用户帐户的实用工具》中进行了总结,后面还有一些使用实例。关于更多的细节和使用例子,请参见每个工具的手册页面。

表1. 管理用户账户的实用工具 |命令|概述| |:—-:|:—-:| |adduser(8)|推荐用于添加新用户的命令行程序。| |rmuser(8)|推荐用于删除用户的命令行程序。| |chpass(1)| 一个灵活的,用于改变用户数据库信息的工具。| |passwd(1)|用于更改用户密码的命令行工具。| |pw(8)|一个强大而灵活的工具,用于修改用户账户的所有方面。|

3.3.2.1. adduser

推荐用于添加新用户的程序是 adduser(8)。当一个新用户被添加时,这个程序会自动更/etc/passwd/etc/group。它还为新用户创建一个主目录,从/usr/share/skel复制默认的配置文件,并可以选择给新用户发送欢迎信息。这个工具必须以超级用户的身份运行。

adduser(8) 工具是交互式的,它将引导你完成创建一个新用户账户的步骤。正如在 FreeBSD 上添加用户中所看到的,要么输入所需的信息,要么按回车键接受方括号中的默认值。在这个例子中,用户被邀请进入 wheel 组,允许他们用 su(1)成为超级用户。完成后,该工具将提示创建另一个用户或退出。

例2. 在 FreeBSD 上添加一个用户

  1. # adduser
  2. Username: jru
  3. Full name: J. Random User
  4. Uid (Leave empty for default):
  5. Login group [jru]:
  6. Login group is jru. Invite jru into other groups? []: wheel
  7. Login class [default]:
  8. Shell (sh csh tcsh zsh nologin) [sh]: zsh
  9. Home directory [/home/jru]:
  10. Home directory permissions (Leave empty for default):
  11. Use password-based authentication? [yes]:
  12. Use an empty password? (yes/no) [no]:
  13. Use a random password? (yes/no) [no]:
  14. Enter password:
  15. Enter password again:
  16. Lock out the account after creation? [no]:
  17. Username : jru
  18. Password : ****
  19. Full Name : J. Random User
  20. Uid : 1001
  21. Class :
  22. Groups : jru wheel
  23. Home : /home/jru
  24. Shell : /usr/local/bin/zsh
  25. Locked : no
  26. OK? (yes/no): yes
  27. adduser: INFO: Successfully added (jru) to the user database.
  28. Add another user? (yes/no): no
  29. Goodbye!
  30. #

注意:由于输入密码时没有回显,所以在创建用户账户时要注意不要打错密码。

3.3.2.2.rmuser

要从系统中完全删除一个用户,请以超级用户身份运行 rmuser(8)。该命令执行以下步骤。 删除用户的 crontab(1)条目,如果存在的话。

删除属于该用户的任何at(1)作业。

杀死所有属于该用户的进程。

从系统的本地密码文件中删除该用户。

可以选择删除用户的主目录,如果该目录是由用户拥有的话。

/var/mail中删除属于该用户的接收邮件文件。

从临时文件存储区(如/tmp)中删除属于该用户的所有文件。

最后,从/etc/group中所有属于该用户的组中删除该用户。如果一个组变成空的,并且组名与用户名相同,那么这个组就会被删除。这补充了由 adduser(8) 创建的每个用户的唯一组。

rmuser(8)不能用来删除超级用户账户,因为这几乎是大规模破坏的表现。

默认情况下,使用的是交互式模式,如下面的例子所示。

例3. rmuser 交互式账户的删除

  1. # rmuser jru
  2. Matching password entry:
  3. jru:*:1001:1001::0:0:J. Random User:/home/jru:/usr/local/bin/zsh
  4. Is this the entry you wish to remove? y
  5. Remove user's home directory (/home/jru)? y
  6. Removing user (jru): mailspool home passwd.
  7. #

3.3.2.3.chpass

任何用户都可以使用 chpass(1)来改变他们的默认 shell 和与用户帐户相关的个人信息。超级用户可以使用这个工具来改变任何用户的额外账户信息。

当除了一个可选的用户名外,没有其他选项时,chpass(1)会显示一个包含用户信息的编辑器。当用户从编辑器中退出时,用户数据库被更新为新的信息。

该工具在退出编辑器时将提示用户的密码,除非该工具是以超级用户身份运行。

在《以超级用户身份使用chpass》中,超级用户已经输入了chpass jru,现在正在查看这个用户可以修改的字段。如果jru代替他运行这个命令,只有最后六个字段会被显示并可以编辑。这在以普通用户身份使用chpass中显示。

例4. 使用 chpass 作为超级用户

  1. #Changing user database information for jru.
  2. Login: jru
  3. Password: *
  4. Uid [#]: 1001
  5. Gid [# or name]: 1001
  6. Change [month day year]:
  7. Expire [month day year]:
  8. Class:
  9. Home directory: /home/jru
  10. Shell: /usr/local/bin/zsh
  11. Full Name: J. Random User
  12. Office Location:
  13. Office Phone:
  14. Home Phone:
  15. Other information:

例5. 使用 chpass 作为普通用户

  1. #Changing user database information for jru.
  2. Shell: /usr/local/bin/zsh
  3. Full Name: J. Random User
  4. Office Location:
  5. Office Phone:
  6. Home Phone:
  7. Other information:

命令 chfn(1)和 chsh(1)是 chpass(1)的链接,ypchpass(1)、ypchfn(1)和ypchsh(1)也是如此。由于 NIS 支持是自动的,所以在命令前指定 yp 是不必要的。如何配置 NIS 在《网络服务器》中有所介绍。

3.3.2.4.passwd

任何用户都可以使用 passwd(1)轻松地修改他们的密码。为了防止意外或未经授权的更改,该命令在设置新密码之前会提示用户的原始密码。

例6. 改变你的密码

  1. % passwd
  2. Changing local password for jru.
  3. Old password:
  4. New password:
  5. Retype new password:
  6. passwd: updating the database...
  7. passwd: done

超级用户可以通过在运行passwd(1)时指定用户名来改变任何用户的密码。当这个工具以超级用户身份运行时,它将不会提示用户的当前密码。这允许在用户不记得原来的密码时修改密码。

例7. 以超级用户身份修改另一个用户的密码

  1. # passwd jru
  2. Changing local password for jru.
  3. New password:
  4. Retype new password:
  5. passwd: updating the database...
  6. passwd: done

与 chpass(1) 一样,yppasswd(1) 是 passwd(1) 的链接,所以 NIS 可以使用任何一条命令。

3.3.2.5. pw

pw(8)工具可以创建、删除、修改和显示用户和组。pw(8)有一组非常强大的命令行选项,使它适合于在 shell 脚本中使用,但新用户可能会发现它比本节介绍的其他命令更复杂。

3.3.3.用户组管理

用户组是一个用户的列表。用户组由其组名和 GID 来识别。在 FreeBSD 中,内核使用一个进程的UID和它所属的组的列表来决定这个进程被允许做什么。大多数时候,一个用户或进程的 GID 通常意味着列表中的第一个组。

组名到GID的映射被列在/etc/group中。这是一个纯文本文件,有四个以冒号分隔的字段。第一个字段是组名,第二个是加密的密码,第三个是 GID ,第四个是以逗号分隔的成员列表。关于语法的更完整描述,请参考 group(5)。

超级用户可以使用文本编辑器修改/etc/group。另外,可以用 pw(8)来添加和编辑组。例如,添加一个名为teamtwo的组,然后确认它的存在。

例8. 使用pw(8)添加一个组

  1. # pw groupadd teamtwo
  2. # pw groupshow teamtwo
  3. teamtwo:*:1100:

在这个例子中,1100teamtwo的 GID。现在,teamtwo没有成员。这个命令将添加jruteamtwo的成员。

例9. 使用pw(8)将用户账户添加到一个新组中

  1. # pw groupmod teamtwo -M jru
  2. # pw groupshow teamtwo
  3. teamtwo:*:1100:jru

-M的参数是一个以逗号分隔的用户列表,用来添加到一个新的(空的)组或替换现有组的成员。对用户来说,这个组的成员资格与密码文件中列出的用户的主组不同(而且是附加的)。这意味着在使用pw(8)的groupshow时,用户不会显示为成员,但在通过id(1)或类似工具查询信息时,会显示出来。当 pw(8) 被用来将一个用户添加到一个组时,它只操作/etc/group,而不试图从/etc/passwd读取其他数据。

例10. 使用pw(8)向一个组添加新成员

  1. # pw groupmod teamtwo -m db
  2. # pw groupshow teamtwo
  3. teamtwo:*:1100:jru,db

在这个例子中,-m的参数是一个以逗号分隔的用户列表,这些用户将被添加到该组。与前面的例子不同,这些用户被添加到组中,并不取代组中的现有用户。

例11. 使用 id(1)来确定群组成员资格

  1. % id jru
  2. uid=1001(jru) gid=1001(jru) groups=1001(jru), 1100(teamtwo)

在这个例子中,jrujruteamtwo组的成员。

关于这个命令和/etc/group格式的更多信息,请参考 pw(8) 和 group(5) 。