Linux 用户管理避坑指南
作者:zhou | 系列:运维安全第 20 期
90% 的安全事件都跟用户管理有关——弱密码、权限滥用、日志没看。本文覆盖 Linux 用户管理的核心文件、用户 CRUD、登录过程、密码安全、登录审计、防暴力破解完整体系。
一、用户管理的核心文件
1. /etc/passwd — 用户的"身份证"
每行代表一个用户,格式:
用户名:密码占位:UID:GID:用户说明:主目录:登录Shell
devops:x:1000:1000:运维工程师:/home/devops:/bin/bash
关键规则:
- 密码占位符是
x,真正的密码在/etc/shadow里 — 分离设计是安全考虑的基线 - UID 潜规则:
0= 超级管理员,1-999= 系统账号,1000+= 普通用户 - ⚠️ 天坑: 把普通用户 UID 改成 0,该用户就是 root 了——权限管理大忌
2. /etc/shadow — 密码的"保险箱"
格式:
用户名:加密密码:最后修改:最小天数:最大天数:警告天数:过期天数:保留
加密密码字段解读:
| 前缀 | 算法 | 说明 |
|---|---|---|
$6$ |
SHA-512 | 当前推荐算法 |
$5$ |
SHA-256 | 兼容性场景 |
$1$ |
MD5 | 已废弃,强度不足 |
$2y$ |
Blowfish | 强度高但兼容性差 |
特别注意:
- 密码为
*或!→ 该用户不能登录 !!→ 密码从未设置过- 空密码 → 后果很严重
3. /etc/group — 用户的"朋友圈"
格式:
组名:组密码:GID:成员列表
一个用户可以属于多个组(逗号分隔)。用 id 命令查看用户的完整"社交关系"。
二、用户的增删改查
1. 创建用户:useradd
标准姿势:
useradd -m -s /bin/bash -G wheel devops
| 参数 | 作用 |
|---|---|
-m |
自动创建主目录 /home/devops |
-s /bin/bash |
指定登录 Shell |
-G wheel |
加入 wheel 组(获得 sudo 权限) |
创建完后必须设密码:
passwd devops
2. 修改用户:usermod
# 改 Shell
usermod -s /bin/zsh devops
# 改主目录(-m 移动原目录内容)
usermod -d /new/home/devops -m devops
# 加入新组(-aG 追加,避免覆盖)
usermod -aG docker devops
# 锁定/解锁
usermod -L devops # 锁定
usermod -U devops # 解锁
⚠️ 坑: usermod 操作正在登录的用户可能失败——先踢下线再说。
3. 删除用户:userdel
userdel -r devops # -r = 删掉主目录和邮件
⚠️ 血的教训: 生产环境慎用 userdel -r!先检查:
- 有没有正在运行的任务(
ps -u devops) - 有没有打开的文件(
lsof -u devops) - 有没有 crontab 任务(
crontab -u devops -l)
4. 查看用户:id
id devops
# uid=1000(devops) gid=1000(devops) groups=1000(devops),10(wheel),996(docker)
三、用户登录过程
登录 Shell vs 非登录 Shell
| 类型 | 触发场景 | 读取配置文件 |
|---|---|---|
| 登录 Shell | SSH 登录、telnet、本地登录 | /etc/profile → ~/.bash_profile/~/.bash_login/~/.profile |
| 非登录 Shell | 再开终端窗口、运行脚本 | ~/.bashrc |
配置文件加载顺序
登录 Shell 加载顺序:
/etc/profile → ~/.bash_profile → ~/.bash_login → ~/.profile
bash 只读上面三个用户级文件中的第一个,读到就停。
不管哪种 Shell 都会读:~/.bashrc
⚠️ 常见坑: 别把环境变量放 ~/.bashrc 里!登录 Shell 不读它!系统级环境变量放 /etc/profile,用户级放 ~/.bash_profile。
退出时执行的文件
用户退出时会执行 ~/.bash_logout,可在这里写清理逻辑(如记录退出时间)。
四、密码安全:策略与管理
1. 密码复杂度策略:/etc/security/pwquality.conf
# /etc/security/pwquality.conf
minlen = 12 # 最小 12 位
dcredit = -1 # 至少 1 位数字
ucredit = -1 # 至少 1 位大写
lcredit = -1 # 至少 1 位小写
ocredit = -1 # 至少 1 位特殊字符
负值表示"至少 N 位",正值表示"最多 N 位"。
2. 密码过期管理:chage
# 查看密码状态
chage -l devops
# 强制 90 天改密码,提前 7 天警告
chage -M 90 -W 7 devops
# 设为首登录必须改密码
chage -d 0 devops
3. 密码历史:防止重复使用
在 /etc/login.defs 设置:
PASS_HISTORY_SIZE 5 # 最近 5 个密码不能重用
五、登录日志:谁在什么时候登录了
安全审计的第一步:知道谁在什么时候登录了服务器。
1. last — 最近登录记录
last -10 # 最近 10 条
last -a # 显示主机名
last -F # 显示完整时间
last devops # 特定用户
2. lastlog — 所有用户最后登录
lastlog
3. lastb — 失败的登录尝试(最重要的!)
lastb # 需 root 权限
lastb -10 # 最近 10 条失败记录
# 统计被暴力破解的用户
lastb | awk '{print $1}' | sort | uniq -c | sort -rn
⚠️ 如果 lastb 输出很多,说明有人在暴力破解 SSH!
4. /var/log/secure — 详细日志
# 成功的登录
grep "Accepted" /var/log/secure
# 失败的登录
grep "Failed" /var/log/secure
# 查看某个 IP 的所有记录
grep "192.168.1.100" /var/log/secure
六、防暴力破解
与 ssh-brute-force-protection-guide 的纵深防御体系一致,本文从用户管理视角给出快速落地方法:
1. 禁用密码登录,改用密钥
# /etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes
2. 换掉默认端口
# /etc/ssh/sshd_config
Port 22222
3. Fail2Ban — 自动封 IP
[sshd]
enabled = true
port = ssh
filter = sshd
maxretry = 3
bantime = 3600 # 封 1 小时
findtime = 600 # 10 分钟内
4. PAM 模块:pam_tally2
# /etc/pam.d/sshd 第一行加
auth required pam_tally2.so deny=3 unlock_time=600 even_deny_root root_unlock_time=300
pam_tally2 --user devops # 查看失败次数
pam_tally2 --user devops --reset # 解锁
5. 禁止 root 直接登录
# /etc/ssh/sshd_config
PermitRootLogin no
6. 云防火墙/安全组
云服务器务必使用安全组,只开放需要的端口。
七、用户安全 Checklist
创建用户时:
useradd -m创建,自动建主目录- 加入
wheel或sudo组 - 立即用
passwd设密码
密码安全:
- 复杂度至少 12 位,含大小写数字特殊字符
- 90 天强制换密码
- 用
chage检查密码状态
登录安全:
- 禁用 root SSH 登录
- 改 SSH 默认端口
- 用密钥登录,禁用密码
- 装 Fail2Ban 或配
pam_tally2
日志审计:
- 每天看
lastb有没有异常 - 定期查
/var/log/secure
关联页面
| 页面 | 关联点 |
|---|---|
| server-security-hardening-checklist | 服务器安全加固清单:用户管理、密码策略、禁用 root 登录等基线配置(本文的延伸实践) |
| ssh-brute-force-protection-guide | SSH 暴力破解纵深防御:公钥认证 / fail2ban / 2FA 完整方案 |
| linux-intrusion-detection-guide | Linux 入侵检测:auditd 监控 passwd/shadow 变更 + 应急响应 |