《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
善后 签署政策协议、验证登录、记录联系信息 人工流程

常见错误

1
2
3
4
5
# 错误:不会处理点号文件(.*),且可能伤及父目录
chown -R user:group /home/user/*

# 正确
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)

示例

1
useradd -c "David Hilbert" -d /home/math/hilbert -g hilbert -G faculty -m -s /bin/tcsh hilbert

配置文件

  • /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(批量添加)

1
2
# 输入文件格式:类似passwd,但密码为明文(文件需严格保护)
newusers userlist.txt
  • 不复制启动文件(仅创建.xauth)
  • 适合大学/批量入学场景,但建议用Python脚本增强

6.4 FreeBSD adduser / pw

交互式adduser

  • 自动创建用户、组、主目录
  • 可生成随机初始密码
  • 对应删除:rmuser

pw命令(底层强大工具)

1
2
3
4
pw useradd raphael -m -s /bin/bash -c "Raphael Dobbins"
pw usermod raphael -w random      # 生成随机密码
pw lock raphael / pw unlock        # 锁定/解锁账户
pw groupmod staff -m dan           # 添加成员到组

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 全面删除用户文件和进程(最完善)

孤儿文件检查(删除后):

1
2
find / -xdev -nouser 2>/dev/null   # 无属主的文件
find / -xdev -nogroup 2>/dev/null  # 无属组的文件

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,权限通常为700750,避免非数据库用户读取数据文件。
  • 自动化用户管理:配合LDAP/AD可实现数据库服务器上操作系统账户的统一管理,但数据库内部账户(如root@localhost)仍需独立维护。
  • 审计与合规:金融/医疗行业对数据库用户有严格审计要求,需结合IAM和数据库自身审计功能(如MySQL Enterprise Audit、Oracle Audit Vault),确保“谁在何时做了什么”可追溯。
  • 删除用户前检查数据库连接:在删除操作系统用户前,检查该用户是否还有数据库连接或后台作业在运行,避免kill进程导致数据不一致。