3.3.用户和基本账户管理

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

本章说明:

  • FreeBSD 系统上不同类型的用户账户。

  • 如何增加、删除和修改用户账户。

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

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

3.3.1. 账户类型

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

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

3.3.1.1. 系统账户

系统账户用于运行诸如 DNS、邮件和 Web 服务器等服务。这样做的原因是安全性;如果所有服务都以超级用户身份运行,它们可以无限制地行动。

系统账户的示例为 daemon,operator,bind,news 和 www。

nobody 是通用的不受特权限制的系统账户。然而,使用 nobody 的服务越多,与该用户关联的文件和进程就会越多,因此该用户的特权也就越大。

3.3.1.2. 用户账户

用户账户可分配给现实世界的人员,用于登录和使用系统。每个访问系统的人都应该拥有独一无二的用户账户。这使管理员可以查找谁在做什么,并防止用户覆盖其他用户的设置。

每个用户可以通过配置他们的默认 Shell、编辑器、快捷键和语言设置来设置自己的环境,以适应他们对系统的使用。

在 FreeBSD 系统上,每个用户账户都有与之关联的特定信息:

用户名

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

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

用户 ID(UID)

用户 ID(UID)是一个数字,用于唯一标识用户对 FreeBSD 系统的身份。允许指定用户名的命令将首先将其转换为 UID。建议使用小于 65535 的 UID,因为较高的值可能会导致与某些软件的兼容问题。

组 ID(GID)

组 ID(GID)是一个数字,用于唯一标识用户所属的主要组。组是一种基于用户 GID 而不是 UID 控制资源访问权限的机制。这可以显著减小某些配置文件的大小,并允许用户成为多个组的成员。建议使用 65535 或更低的 GID,因为较高值的 GID 可能会破坏某些软件。

登录类别

登录类别是对群组机制的扩展,提供了附加的灵活性,可以根据不同用户定制系统。有关登录类别的更多信息,请参阅配置登录类别。

默认情况下,密码永不过期。

但是,可以在每个用户基础上启用密码过期功能,强制特定或所有用户在一定时间后修改他们的密码。

默认情况下,FreeBSD 账户永不过期。

当创建需要有限生命周期的账户,比如学校中的学生账户时,请使用 pw(8)指定账户到期日期。在到期时间过去后,该账户将无法用于登录系统,尽管账户的目录和文件会保留。

用户的全名

用户名称在 FreeBSD 中唯一标识账户,但不一定反映用户的真实姓名。类似于注释,此信息支持空格,大写字符,并且长度可以超过 8 个字符。

主目录

主目录是系统上一个目录的完整路径。这是用户在登录时的起始目录。一个常见的约定是将所有用户主目录放在 /home/username 或 /usr/home/username 下。每个用户在自己的主目录中存储他们的个人文件和子目录。

用户 Shell

Shell 为用户提供与系统交互的默认环境。有许多不同类型的 shell,有经验的用户会有他们自己的偏好,这可以通过他们的账户设置体现出来。

3.3.1.3. 超级用户账户

超级用户账户,通常称为 root,用于管理系统,没有任何权限限制。因此,不应将其用于发送和接收邮件,系统的一般研究或编程等日常任务。

与其他用户账户不同,超级用户可以无限制地操作,滥用超级用户账户可能导致灾难性后果。用户账户不会因为错误而销毁操作系统,因此建议用用户账户登录,并仅在命令需要额外特权时才成为超级用户。

作为超级用户,始终要仔细检查所有执行的命令,因为多余的空格或遗漏的字符可能导致不可逆的数据丢失。

获得超级用户特权的方法有几种。虽然可以用 root 登录,但非常不建议这样做。

应该使用 su(1) 成为超级用户。如果在运行此命令时指定了 -,该用户还将继承 root 用户的环境。运行此命令的用户必须属于 wheel 组,否则命令将执行失败。用户还必须知道 root 用户账户的密码。

在此示例中,用户仅成为超级用户以便运行 make install,因为此步骤需要超级用户特权。命令完成后,用户键入了 exit 以退出超级用户账户,并退回到其用户账户的权限。

示例 1。作为超级用户安装程序

% configure
% make
% su -
Password:
# make install
# exit
%

内置的 su(1) 框架适用于单个系统或只有一个系统管理员的小型网络。另一种选择是安装软件包或 port security/sudo。该软件提供了活动日志记录,并能让管理员配置,哪些用户可以作为超级用户运行哪些命令。

3.3.2.管理账户

FreeBSD 提供了各种不同的命令来管理用户账户。最常见的命令在用于管理用户账户的实用工具中进行了总结,然后是一些用法示例。有关每个工具的更多详细信息和用法示例,请参阅手动页。

表 1. 用于管理用户账户的实用工具|命令|总结| | ----------------------------------------------------------------------------------------| ---------| | adduser(8)|增加新用户的推荐命令行应用程序。| | rmuser(8)|删除用户的推荐命令行应用程序。| | chpass(1)|用于修改用户数据库信息的灵活工具。| | passwd(1)|修改用户密码的命令行工具。| | pw(8)|修改用户账户的各个方面的强大而灵活的工具。| | bsdconfig(8)|带有账户管理支持的系统配置实用程序。|

3.3.2.1. 增加用户

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

adduser(8)实用程序是交互式的,逐步引导你创建新用户账户。如在 FreeBSD 中添加用户所示,要么输入所需信息,要么按回车键接受方括号中显示的默认值。在本例中,用户被邀请加入 wheel 组,使其能够使用 su(1)成为超级用户。完成后,实用程序将提示你要么创建另一个用户,要么退出。

FreeBSD 上添加用户的示例 2。

# adduser

输出应该类似于以下内容:

Username: jru
Full name: J. Random User
Uid (Leave empty for default):
Login group [jru]:
Login group is jru. Invite jru into other groups? []: wheel
Login class [default]:
Shell (sh csh tcsh zsh nologin) [sh]: zsh
Home directory [/home/jru]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password:
Enter password again:
Lock out the account after creation? [no]:
Username   : jru
Password   : ****
Full Name  : J. Random User
Uid        : 1001
Class      :
Groups     : jru wheel
Home       : /home/jru
Shell      : /usr/local/bin/zsh
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (jru) to the user database.
Add another user? (yes/no): no
Goodbye!

3.3.2.2. 删除用户

要完全从系统中删除用户,请作为超级用户运行 rmuser(8)。此命令执行以下步骤:

  1. 如果存在,删除用户的 crontab(1) 条目。

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

  3. 发送 SIGKILL 信号给所有由用户拥有的进程。

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

  5. 删除用户的主目录(如果用户拥有它),包括处理实际主目录路径中的符号链接。

  6. 从 /var/mail 中删除用户的传入邮件文件。

  7. 从 /tmp 、 /var/tmp 和 /var/tmp/vi.recover 中删除用户拥有的所有文件。

  8. 从 /etc/group 中删除用户名从属的所有组。(如果一个组变成空的,并且组名与用户名相同,那么将删除该组;这补充了 adduser(8)的每个用户独特组。)

  9. 删除用户拥有的所有消息队列、共享内存段和信号量。

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

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

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

# rmuser jru

输出应类似于以下内容:

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

3.3.2.3. 修改用户信息

所有用户都能使用 chpass(1) 修改其默认 shell 和与其用户账户关联的个人信息。超级用户可使用此工具修改任何用户的其他账户信息。

当不使用任何参数时,除了可选的用户名外,chpass(1) 会显示包含用户信息的编辑器。当用户从编辑器退出后,用户数据库将使用新信息进行更新。

在使用 chpass 作为超级用户时,超级用户已键入 chpass jru,现在正在查看可更改此用户的字段。如果 jru 代替运行此命令,则只会显示最后六个字段,并可供编辑。这显示正在在作为常规用户使用 chpass。

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

# chpass

输出应类似于以下内容:

# Changing user database information for jru.
Login: jru
Password: *
Uid [#]: 1001
Gid [# or name]: 1001
Change [month day year]:
Expire [month day year]:
Class:
Home directory: /home/jru
Shell: /usr/local/bin/zsh
Full Name: J. Random User
Office Location:
Office Phone:
Home Phone:
Other information:

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

#Changing user database information for jru.
Shell: /usr/local/bin/zsh
Full Name: J. Random User
Office Location:
Office Phone:
Home Phone:
Other information:

3.3.2.4. 修改用户密码

所有用户都可以使用 passwd(1)轻松修改他们的密码。为了防止意外或未经授权的更改,此命令将在设置新密码之前提示用户输入原始密码:

示例 6. 修改你的密码

% passwd

输出应类似于以下内容:

Changing local password for jru.
Old password:
New password:
Retype new password:
passwd: updating the database...
passwd: done

超级用户在运行 passwd(1)时可以通过指定用户名来修改任何用户的密码。当以超级用户身份运行该工具时,它不会要求用户输入当前密码。这能让在用户忘记原密码时修改密码。

例如 7. 作为超级用户更改另一个用户的密码

# passwd jru

输出应类似于以下内容:

Changing local password for jru.
New password:
Retype new password:
passwd: updating the database...
passwd: done

3.3.2.5. 创建、删除、修改和查看系统用户和组

pw(8)实用程序可以创建、删除、修改和查看用户和组。它充当了系统用户和组文件的前端。pw(8)具有一组非常强大的命令行参数,使其适用于 shell 脚本中的使用,但新用户可能会觉得它比本节介绍的其他命令更复杂。

3.3.3. 管理组

群组是个用户列表。群组以其群组名称和 GID 为标识。在 FreeBSD 中,内核使用进程的 UID 及其所属的群组列表来确定进程被允许执行的操作。在大多数情况下,用户或进程的 GID 通常意味着列表中的第一个群组。

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

超级用户可以使用文本编辑器修改 /etc/group(尽管最好应使用 vigr(8)来编辑组文件,因为它可以捕捉一些常见错误)。另外,可以用 pw(8)添加和编辑组。例如,要添加一个名为 teamtwo 的组,然后确认它存在:

示例 8. 使用 pw(8)添加组

# pw groupadd teamtwo
# pw groupshow teamtwo

输出应类似于以下内容:

teamtwo:*:1100:

在本示例中,1100 是 teamtwo 的 GID。现在,teamtwo 没有成员。此命令将添加 jru 作为 teamtwo 的成员。

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

# pw groupmod teamtwo -M jru
# pw groupshow teamtwo

输出应该类似于以下内容:

teamtwo:*:1100:jru

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

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

# pw groupmod teamtwo -m db
# pw groupshow teamtwo

输出应该类似于以下内容:

teamtwo:*:1100:jru,db

在此示例中,-m 的参数是一个逗号分隔的用户列表,这些用户将被添加到组中。与前一个示例不同,这些用户将附加到组中,而不会替换组中现有的用户。

示例 11。使用 id(1)来确定组成员身份

% id jru

输出的格式应该类似于以下内容:

uid=1001(jru) gid=1001(jru) groups=1001(jru), 1100(teamtwo)

在这个例子中,jru 是 jru 和 teamtwo 组的成员。

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

最后更新于

FreeBSD 中文社区 2024