3.3. 基础账户管理

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

本章将介绍:

3.3.1. 账户类型

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

有三种主要类型:系统账户,用户账户,及超级用户账户。

3.3.1.1. 系统账户

系统账户用于运行服务,例如 DNS,邮件,及网络服务器。这么做是为了安全:如果所有服务都以超级用户运行,它们的行为将没有限制。

系统账户的例子有 daemonoperatorbindnews,及www

警告:

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

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 可能会欲某些软件不兼容。

登入类

登录类是组机制的扩展,在将系统定制给不同用户时提供了额外的灵活性。登录类将在第 13.13.1 节 “设置登入类别”中进一步讨论。

密码修改时间

默认情况下,密码不会过期。但是用户可以设置密码过去时间,从而强制部分或全部用户在经过一段时间后更改其密码。

账户过期时间

默认情况下 FreeBSD 的账户不会过期。若需设置用户过期时间,请使用 pw(8)设置。账户到期后将不能再登入系统,但账户的文件和目录将被保留。

用户全名

用户名唯一地将帐户标识为 FreeBSD,但不一定反映用户的真实姓名。与注释类似, 此信息可以包含空格、大写字符,并且长度超过8个字符。

Home 目录

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

用户 shell

Shell 提供了用户与系统交互的默认环境。有许多不同类型的 Shell。有经验的用户将有自己的喜好, 这可以反映在他们的帐户设置。

3.3.1.3. 超级账户

超级用户账户,一般被称为root,用于管理系统,不受任何限制。因此它不应用于日常任务,比如收发电子邮件,编程等等。

与其他用户帐户不同,超级用户可以不受限制地运行程序。滥用超级用户帐户可能会导致壮观的灾难。用户帐户无法错误地销毁操作系统,因此建议以普通用户帐户身份登录,并且仅在命令需要额外权限时才使用超级用户。

使用超级使用者下指令时永远要再三检查,由于一个多余的空白或缺少的字元可能意味着无法挽回的数据遗失。

有几种方法可以获得超级用户权限。虽然可以以root的身份登录,但强烈建议不要这样做。

改使用su(1)切换为超级使用者。执行此指令时若指定-参数,该使用者会继承root的使用者环境。执行此指令的使用者必须在wheel群组中,否则指令会失败。使用者也必须要知道root使用者帐号的密码。

在本例中, 用户只成为超级用户才能运行make install,因为此步骤需要超级用户权限。命令完成后,用户键入exit 离开超级用户帐户并返回到其用户帐户的权限。

例 3.1. 使用超级账户安装程序
% configure
% make
% su -
Password:
# make install
# exit
%

内置的su(1)框架在单人系统或只有一位系统管理者的小型网络可以运作的很好。另一种方式是安装security/sudo套件或Port。此软件提供了活动记录且允许管理者设定那个使用者可以用超级使用者执行那个指令。

3.3.2. 管理用户

FreeBSD 有许多命令来管理用户账户。表 3.1 “管理用户账户的程序”中总结了一些常见命令和管理账户的例子。查看它们的手册页以获取更多信息。

表 3.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)工具采用互动的方式,只需几个步骤便可建立新使用者帐号。如例 3.2 “在 FreeBSD 上添加用户”所示,可输入必填的资讯或按Return键采用方括中的预设值。在此例当中,使用者被邀请加入wheel群组,这让使用者可使用su(1)变成超级使用者。完成之后,此工具会询问是否要建立其他的使用者或离开。

例 3.2. 在 FreeBSD 上添加用户
# 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

要自系统完全移除一个使用者可使用超级使用者执行rmuser(8)。这个指令会执行以下步骤:

  1. 移除使用者的crontab(1)项目,若项目存在。

  2. 移除任何属于该使用者的at(1)工作。

  3. 终止用户拥有的所有进程。

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

  5. (可选) 删除用户的主目录(如果该目录为用户所拥有)。

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

  7. 从临时文件存储区域 (如/tmp) 中删除用户拥有的所有文件。

  8. 最后,自/etc/group中该使用者所属的所有群组移除该使用者。若群组无任何成员且群组名称与该使用者名称相同,则该群组也会一并移除。这是为了辅助 adduser(8)替每位使用者建立独一无二的群组。

rmuser(8)无法用来移除超级使用者帐号,因为这几乎代表着大规模破坏。

默认情况下使用交互模式,就像下面这样。

例 3.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

任何使用者都可以使用chpass(1)来变更自己的预设Shell以及与自己的使用者帐号关联的个人信息。超级使用者可以使用这个工具更改任何使用者的其他帐号信息。

除了选填的使用者名称外,未传入任何选项时,chpass(1)会开启含有使用者信息的编辑器。当使用者自编辑器离开,便会更新新的资讯到使用者数据库。

注意:

离开编辑器时,此工具会提示使用者输入密码,除非使用超级使用者执行此工具。

例 3.4 “超级用户使用 chpass中,超级使用者输入了chpass jru并正在检视这个使用者可以更改的字段。若改以jru执行这个指令,只会显示最后六个字段供编辑,如例 3.5 “普通用户使用 chpass所示。

例 3.4. 超级用户使用 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:

例 3.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:

注意:

指令chfn(1)以及chsh(1)皆连接至chpass(1),就如同ypchpass(1)ypchfn(1)以及ypchsh(1)的关系。自从NIS支持自动化以后,便不再需要特别加上yp,如何设定NIS在第 29 章 网络服务器中有说明。

3.3.2.4. passwd

任何使用者皆可简单的使用passwd(1)更改自己的密码。要避免意外或未授权的变更,这个指令在设定新密码之前会提示使用者输入原来的密码:

例 3.6. 改变您的密码
% passwd
Changing local password for jru.
Old password:
New password:
Retype new password:
passwd: updating the database...
passwd: done

超级使用者可以更改任何使用者的密码透过在执行passwd(1)时指定使用者名称。当此工具以超级使用者执行时,将不会提示输入使用者目前的密码,这可在使用者忘记原来的密码时更改密码。

例 3.7. 作为超级用户修改另一个用户的密码
# passwd jru
Changing local password for jru.
New password:
Retype new password:
passwd: updating the database...
passwd: done

注意:

如同chpass(1)yppasswd(1)连接到passwd(1),因此NIS在两个指令上皆可运作。

3.3.2.5. pw

pw(8)工具可以建立、移除、修改以及显示使用者与群组,它的功能是做为系统使用者与群组档的前端。pw(8)有非常强大的的指令列选项集,这让该指令非常适合用于Shell scripts,但新的使用者可能会发现它比其他在本节的指令要复杂许多。

3.3.3. 管理用户组

群组代表一群使用者,群组可以由其群组名称及GID来辨识。在FreeBSD,核心会使用程序的UID以及其所属的群组清单来决定程序可以做那些事。大多数情况使用者或程序的GID通常指的是清单中的第一个群组。

群组名称与GID的对应表列在/etc/group。这个纯文字档案使用了四个以冒号分隔的字段,第一个字段为群组名称,第二个字段为加密后的密码,第二个字段为 GID以及第四个字段为以逗号分隔的成员清单。要取得更完整的语法说明,请参考group(5)

超级使用者可以使用文字编辑器修改/etc/group,或者可使用pw(8)加入与编辑群组。例如,要加入一个叫做teamtwo的群组然后确认该群组已新增:

例 3.8. 使用pw(8)添加用户组
# pw groupadd teamtwo
# pw groupshow teamtwo
teamtwo:*:1100:

在本例中,1100teamtwoGID。目前teamtwo没有任何成员,这个指令会加入jru作为teamtwo的成员。

例 3.9. 使用pw(8)加入使用者帐号到新的群组
# pw groupmod teamtwo -M jru
# pw groupshow teamtwo
teamtwo:*:1100:jru

-M的参数是以逗号分隔的使用者清单,用来加入成员到新的(空的)群组或取代既有群组中的成员。对使用者来说这里的群组成员与使用者列于密码档的主要群组不同(额外的),这代表在pw(8)使用groupshow时不会显示做为使用者主要群组的成员,但会显示在使用id( 1)或同类工具所查询的信息当中。当使用pw(8)来加入使用者到某个群组,该指令只会处理/etc/group且不会尝试自/etc/passwd读取其他的数据。

例 3.10. 使用pw(8)为用户组添加新成员
# pw groupmod teamtwo -m db
# pw groupshow teamtwo
teamtwo:*:1100:jru,db

在本例当中,给-m的参数是以逗号分隔的使用者清单,用来加入使用者到群组。不像前面的例子,这些使用者会加入到群组,而非取代既有群组中的使用者。

例 3.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)

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.