UNIX/Linux系统管理技术手册-读书笔记-第八章
《UNIX/Linux系统管理技术手册-读书笔记-第八章
用户管理
1. 账户机制核心概念
| 概念 | 说明 | 能做什么 |
|---|---|---|
| UID(用户ID) | 32位无符号整数,内核识别用户的唯一数字 | 所有访问控制决策基于UID |
| GID(组ID) | 32位无符号整数,标识用户所属组 | 文件共享、权限分组管理 |
| getpwuid() / getpwnam() | C库函数,UID/登录名↔用户信息映射 | 程序透明获取用户信息,无需关心底层存储 |
| nsswitch.conf | 名称服务切换配置文件 | 决定用户/组信息查询顺序(files → ldap → etc) |
| root(UID=0) | 超级管理员账户 | 所有系统操作的最终权限 |
账户管理的本质是UID的管理——登录名、主目录、shell都只是UID的附属属性。
2. /etc/passwd 文件(核心用户数据库)
| 字段 | 含义 | 示例 |
|---|---|---|
| 登录名 | 唯一用户名(建议小写字母数字,≤32字符) | johnsmith |
| 密码占位符 | Linux为x,FreeBSD为* |
x |
| UID | 用户ID(真实用户建议≥1000) | 1001 |
| GID | 默认组ID(建议使用个人组,GID=UID) | 1001 |
| GECOS | 用户信息(全名、办公室、电话等,逗号分隔) | John Smith,CS-101,x1234 |
| 主目录 | 登录后的默认目录 | /home/johnsmith |
| 登录shell | 默认命令解释器 | /bin/bash |
重要约定:
- UID在整个组织内必须唯一(否则NFS安全问题和身份混乱)
- 已删除用户的UID不要回收重用(恢复备份时文件归属错乱)
- root和系统伪用户(bin/daemon等)使用UID < 1000
GECOS字段可通过chfn命令由用户自行修改(可禁用)。
3. /etc/shadow(Linux加密密码存储)
| 字段 | 含义 | 说明 |
|---|---|---|
| 登录名 | 关联passwd条目 | 与passwd一致 |
| 加密密码 | $6$salt$hash格式 |
$6$=SHA-512(当前标准) |
| 最后修改日期 | 1970-01-01起的天数 | 17336 ≈ 2017-06-09 |
| 最小间隔 | 两次修改间最少天数 | 0=不限制 |
| 最大间隔 | 密码有效期(天) | 180=180天后必须改 |
| 警告天数 | 过期前多少天提醒 | 14 |
| 宽限期 | 过期后多少天禁用 | 7 |
| 账户过期日期 | 1970-01-01起的天数 | 空=永不过期 |
| 保留字段 | 未使用 | 空 |
加密算法识别:
$1$= MD5(已不安全)$5$= SHA-256$6$= SHA-512(推荐默认)$2$= Blowfish
相关命令:
passwd:修改密码(自动更新shadow)chage:管理密码老化策略pwconv:同步passwd和shadow文件usermod -e YYYY-MM-DD:设置账户过期日期
4. /etc/group(组管理)
| 字段 | 含义 | 示例 |
|---|---|---|
| 组名 | 组标识名 | staff |
| 组密码占位符 | 通常为* |
* |
| GID | 组ID | 20 |
| 成员列表 | 逗号分隔的用户名(无空格) | dan,ben,trent |
个人组(User Private Group) :
- 每个用户拥有同名组,组内仅有该用户
- GID通常=UID
- 新文件默认属于个人组,避免意外共享
- 如需协作共享,单独创建项目组
组管理命令:
| 命令 | 功能 |
|---|---|
groupadd |
创建组 |
groupmod |
修改组 |
groupdel |
删除组 |
gpasswd |
设置组密码 |
vigr |
安全编辑/etc/group(文件锁+语法检查) |
pw groupmod -m user group(FreeBSD) |
向组添加成员 |
5. 手动添加用户(5步 + 善后)
| 步骤 | 操作 | 命令/工具 |
|---|---|---|
| 1 | 编辑passwd/shadow(Linux)或master.passwd(FreeBSD) | vipw(文件锁+语法检查) |
| 2 | 添加到/etc/group | vigr |
| 3 | 设置初始密码 | passwd newuser |
| 4 | 创建主目录,复制启动文件(/etc/skel) | mkdir + cp |
| 5 | 设置主目录所有权和权限 | chown -R user:group /home/user |
| 善后 | 签署政策协议、验证登录、记录联系信息 | 人工流程 |
常见错误:
启动文件来源:
- 系统模板:
/etc/skel/(存放.bashrc、.profile等) - 定制模板:
/usr/local/etc/skel/ - 常用启动文件:
.bashrc、.bash_profile、.profile、.cshrc、.vimrc、.gitconfig
umask推荐值:
077:完全私有(最严)027:组可读不可写(适中)022:组和其他可读不可写(宽松)
6. 脚本化用户管理命令
6.1 Linux useradd(核心命令)
| 常用选项 | 功能 |
|---|---|
-c "full name" |
设置GECOS(全名) |
-d /path |
指定主目录 |
-g group |
指定主组(个人组用同名) |
-G group1,group2 |
附加组列表 |
-m |
创建主目录(从/etc/skel复制启动文件) |
-s /bin/bash |
指定登录shell |
-u UID |
指定UID(不指定则自动分配) |
-D |
显示/设置默认值(如默认shell) |
示例:
|
|
配置文件:
/etc/login.defs:UID/GID范围、密码老化、加密算法/etc/default/useradd:默认主目录、默认shell
6.2 Debian/Ubuntu adduser(增强包装)
- 交互式或批处理模式
- 配置:
/etc/adduser.conf(主目录规则、权限、配额、正则匹配) - 对应删除命令:
deluser(配置文件/etc/deluser.conf) - 支持本地扩展脚本:
/usr/local/sbin/deluser.local
6.3 Linux newusers(批量添加)
- 不复制启动文件(仅创建.xauth)
- 适合大学/批量入学场景,但建议用Python脚本增强
6.4 FreeBSD adduser / pw
交互式adduser:
- 自动创建用户、组、主目录
- 可生成随机初始密码
- 对应删除:
rmuser
pw命令(底层强大工具) :
7. 删除用户账户(安全流程)
| 步骤 | 操作 |
|---|---|
| 1 | 从所有本地数据库/电话簿删除 |
| 2 | 从邮件别名删除或添加转发 |
| 3 | 删除crontab/at/打印作业 |
| 4 | 杀死该用户所有运行进程 |
| 5 | 从passwd/shadow/group/gshadow删除条目 |
| 6 | 删除主目录(先备份!) |
| 7 | 删除邮件存储文件 |
| 8 | 清理共享日历/房间预留等 |
| 9 | 验证孤儿文件:find / -xdev -nouser 2>/dev/null |
自动删除工具:
| 系统 | 命令 | 特性 |
|---|---|---|
| Linux | userdel -r user |
-r删除主目录+邮件池 |
| Debian/Ubuntu | deluser --remove-home user |
支持deluser.conf配置、本地脚本扩展 |
| FreeBSD | rmuser |
全面删除用户文件和进程(最完善) |
孤儿文件检查(删除后):
8. 禁止登录(临时/永久)
| 方法 | 操作 | 说明 |
|---|---|---|
| 锁定密码 | usermod -L user(Linux)pw lock user(FreeBSD) |
密码前加!/*LOCKED*,禁用密码登录 |
| 解锁 | usermod -U user / pw unlock |
恢复密码 |
| 修改shell | usermod -s /bin/false user |
输出信息后退出(但SSH可能绕过) |
| 账户过期 | usermod -e YYYY-MM-DD user |
设置到期日期,自动禁用 |
注意:
- 锁定密码仅影响密码认证,SSH密钥认证可能仍有效
- 修改shell为
/bin/nologin可配合/etc/nologin.txt显示自定义信息
9. 集中式账户管理
9.1 LDAP与Active Directory
| 方案 | 特点 | 适用场景 |
|---|---|---|
| LDAP | 通用目录服务,层次化数据仓库,支持多服务器 | UNIX/Linux环境统一账户管理 |
| Active Directory | LDAP + Kerberos,Windows原生 | 含Windows桌面的混合环境 |
| 集成方式 | nsswitch.conf + PAM模块 | 将认证和用户信息查询指向LDAP/AD |
9.2 单点登录(SSO)
| 系统 | 特点 |
|---|---|
| CAS(耶鲁) | Java开源中央认证服务 |
| Shibboleth | Apache 2许可证开源SSO |
| JOSSO | Java开源SSO服务器 |
| 商业方案 | 与身份管理系统集成 |
SSO核心:一次认证 → 凭证 → 访问多个应用。安全性更高(更复杂密码),但认证服务器是单点故障。
9.3 身份管理系统(IAM)
评估要点:
| 维度 | 考虑因素 |
|---|---|
| 监督 | Web管理界面、与人事数据库集成、自动删除离职人员 |
| 账户管理 | 全局唯一UID、跨平台统一管理、基于角色的账户提供、审批流程、审计日志 |
| 易用性 | 自助密码重置、强密码强制、一次操作全局改密 |
| 集成方式 | 是否需每台主机安装代理?是否原生支持底层系统? |
10. 本章核心命令速查表
| 命令 | 功能 | 平台 |
|---|---|---|
vipw |
安全编辑/etc/passwd(+shadow) | 全平台 |
vigr |
安全编辑/etc/group | Linux |
passwd user |
设置/修改密码 | 全平台 |
chage -l user |
查看密码老化信息 | Linux |
chfn user |
修改GECOS信息 | Linux |
useradd -m -g group user |
创建用户 | Linux |
userdel -r user |
删除用户(含主目录) | Linux |
usermod -L/-U user |
锁定/解锁账户 | Linux |
adduser(交互式) |
创建用户(增强版) | Debian/Ubuntu |
deluser --remove-home |
删除用户 | Debian/Ubuntu |
pw useradd/usermod/userdel |
用户管理(底层) | FreeBSD |
pw lock/unlock user |
锁定/解锁 | FreeBSD |
rmuser |
删除用户(最全面) | FreeBSD |
groupadd/groupmod/groupdel |
组管理 | Linux |
newusers file |
批量创建 | Linux |
find / -xdev -nouser |
查找孤儿文件 | 全平台 |
DBA视角补充:
- 数据库服务账户:MySQL(mysql)、PostgreSQL(postgres)、Oracle(oracle)都是系统伪用户,UID低且shell为/nologin,禁止直接登录。创建数据库时需确保这些系统账户在/etc/passwd中存在且UID/GID在各节点一致(尤其RAC/集群环境)。
- 数据库数据目录权限:数据目录(如
/var/lib/mysql)属主应为mysql:mysql,权限通常为700或750,避免非数据库用户读取数据文件。- 自动化用户管理:配合LDAP/AD可实现数据库服务器上操作系统账户的统一管理,但数据库内部账户(如
root@localhost)仍需独立维护。- 审计与合规:金融/医疗行业对数据库用户有严格审计要求,需结合IAM和数据库自身审计功能(如MySQL Enterprise Audit、Oracle Audit Vault),确保“谁在何时做了什么”可追溯。
- 删除用户前检查数据库连接:在删除操作系统用户前,检查该用户是否还有数据库连接或后台作业在运行,避免kill进程导致数据不一致。
文章作者 会写代码的小郎中
上次更新 2011-06-18
许可协议 CC BY-NC-ND 4.0