8.4. 用户与群组数据库
用户清单通常保存在 /etc/passwd
文件内,把编码后的密码保存在 /etc/shadow
文件内。这两个文件都是纯文本档,以简单的格式保存,可以用文本编辑器读取与修改。每个用户占一列,其字段以冒号区隔 (“:
”)。
说明 编辑系统文件
本章讨论的系统文件都是纯文本档,可以用文本编辑器处理。这些文件对核心系统的运作极为重要,编辑该等文件时多加慎重不会错的。首先,先复制或备份原文件。第二,在服务器或多人可同时近用该等文件的机器上,多费心以防止文件损坏。
为了达成此目标,最好使用 vipw
命令编辑 /etc/passwd
文件,或使用 vigr
命令编辑 /etc/group
文件。这些命令会先锁住该等文件再运行文本编辑器, (缺省使用 vi
命令,除非 EDITOR
环境变量有其他的设置)。加上 -s
选项可同时编辑对应的 shadow 文件。
基本 Crypt,单向的函数
crypt
是单向函数以特别的方法把字符串 (A
) 转换成另个字符串 (B
),转换后无法回复成 A
经由 B
。辨识 A
的唯一方法是逐一测试所有可能的值,查验等同于 B
的结果。最多可输入 8 个字符 (字符串 A
) 然后产生 13 个字符的可打印 ASCII 字符 (字符串 B
)。
8.4.1. 用户清单:/etc/passwd
在 /etc/passwd
文件内的字段清单:
登录,例如
rhertzog
;password:就是密码加密的单向函数 (
crypt
),使用DES
、MD5
、SHA-256
或SHA-512
。以特别符号 “x
” 表示加密后的密码保存在/etc/shadow
;uid
:用于辨识个别用户的不重复数字;gid
:用户主要群组 (Debian 的默认值系为每个用户创建一个群组) 的不重复号码;GECOS
:通常保存用户全名的数据栏;登录文件夹,用于保存用户的个人文件 (环境变量
$HOME
通常指向此处);登录时运行的程序。通常是命令解译器 (shell),若指定为
/bin/false
(不做任何事并立即回到控制),则用户无法登录。
基本 Unix 群组
Unix 群组是包括多个用户的实体,以集成授权系统可以共享文件 (具有同样的权限)。可以限定程序供指定的群组使用。
8.4.2. 隐藏与加密的密码档:/etc/shadow
The /etc/shadow
文件含以下的字段:
登录;
加密的密码;
管理密码期限的字段。
文档 /etc/passwd
、/etc/shadow
与 /etc/group
文件格式
这些格式记录在下列的手册页面:passwd(5)、shadow(5)、与 group(5)。
安全 /etc/shadow
文件安全
/etc/shadow
,不同于它的分身,/etc/passwd
,不能被一般用户读取。保存在 /etc/passwd
内的加密后密码可被任何人读取;破坏者可以用 “暴力” 法破坏它们,以常见的编码字符破解。这种攻击方式 — 称为 “字典攻击” — 对于使用 /etc/shadow
的系统是无效的。
8.4.3. 修改既有的帐号或密码
以下的命令允许修改用户数据库内的特定字段数据:passwd
允许用户更改自己的密码,并更新 /etc/shadow
文件;chfn
(CHange Full Name),保留给超级用户 (root) 专用,修改 GECOS
字段。chsh
(CHange SHell) 允许用户变更自己的登录 shell,但只限列名在 /etc/shells
之内;另一方面,管理者不受此限,且可设置任何 shell。
最后,chage
(CHange AGE) 命令允许管理者变更密码的有效期 (-l *用户*
选项列出现在的设置)。以 passwd -e *用户*
命令强迫密码失效,要求用户登录时变更密码才能继续使用。
8.4.4. 帐号禁用
有时需要 “禁用一个帐号” (关闭某用户),基于纪律考量、调查、或用户太久未登录。被禁用的帐号表示该用户不能登录或近用该机器。帐号还在机器内且文件与数据都未被删除木;只是不能使用。以 passwd -l *用户*
(锁定) 命令就能够达成。以同样的方式另个选项 -u
(解锁) 就可恢复该帐号。
下一步 NSS 与系统数据库
与其使用文件管理用户与群组清单,还可使用其他数据库类型,诸如 LDAP 或 db
,借由适当的 NSS (Name Service Switch 姓名服务切换) 模块。可用的模块列在 /etc/nsswitch.conf
文件内,在 passwd
、shadow
与 group
条目下。LDAP 下的 NSS 模块使用法,见 第 11.7.3.1 节 “Configuring NSS”。
8.4.5. 群组清单:/etc/group
群组列在 /etc/group
文件内,单纯的文本数据库类似 /etc/passwd
文件,包括以下的字段:
群组名称;
密码 (选项):加入群组会用到 (以
newgrp
或sg
命令,见专栏 基本 在多个群组工作);gid
:不重复的群组辨识码;成员清单:属于此群组的用户名清单,以逗点区隔。
基本 在多个群组工作
最终用户可能参加多个群组;其中一个是自己的 “主要群组”。用户自己的主要群组,用户初始配置时自动产生的默认值。用户添加的文件自动属于该读者,以及其主要群组。这种方式并不完全合意;例如,用户需要在自己主要群组之外的文件夹工作,与其他群组共享其文件。在这种情况下,用户需以命令:newgrp
变更其主要群组,产生新的 shell,或以 sg
命令,使用其他群组。这些命令也允许用户加入其他群组。若该等群组受密码保护,则需先取得密码才能运行该等命令。
用户还可以设置文件夹的 setgid
位,让该文件夹内的文件自动属于特定群组。详情见专栏 安全 setgid
目录和 粘着位。
id
命令显示用户现在的状态,包括个人辨识码 (uid
变量)、现在的主要群组 (gid
variable)、以及其所属群组的清单 (groups
变量)。
addgroup
与 delgroup
命令可以添加或删除群组。groupmod
命令修改群组的信息 (其 gid
或辨识码)。命令 passwd -g *group*
可变更群组的密码,passwd -r -g *group*
命令可删除群组的密码。
秘诀 getent
getent
(取得条目的意思 get entries) 命令使用适当的程序库函数,调用配置于 /etc/nsswitch.conf
文件的 NSS 模块,以标准方式检查系统数据库。此命令需要一个或两个参数:被检查的数据库名称、以及可能的搜索键词。因此,getent passwd rhertzog
命令将从用户 rhertzog
中给予用户数据库。