nullok 是一条免检通道
PAM 的 pam_unix 模块带 nullok 参数时,允许“口令字段为空”的账号直接用空口令登录;nullok_secure 只把它限定在 /etc/securetty 列出的终端上,风险稍低但依然存在。这条通道的麻烦在于它不受口令策略约束:只要账号口令字段被清空,任何密码复杂度、锁定策略都形同虚设。审计时要全量扫描 /etc/pam.d 下的每个配置文件,再用 shadow 交叉验证有没有真的存在空口令账号。
基本信息
| 加固项 | 封堵空口令登录通道 |
|---|---|
| 适用平台 | Linux(使用 PAM 的发行版,RHEL 系与 Debian 系均适用) |
| 权限要求 | root |
| 达标判据 | /etc/pam.d 下无 nullok / nullok_secure;shadow 无空口令账号 |
| 关联文件 | /etc/pam.d/system-auth、password-auth、common-auth 等 |
典型使用场景
- 口令策略专项审计时作为“绕过通道”核查项
- 应急响应中发现可疑账号,确认是否靠空口令登录
- 从旧系统迁移账号后清理遗留的空口令设置
- 发行版升级或 PAM 配置被第三方软件改写后的复核
- 编写自动化基线脚本时作为一条独立的检查规则
全量扫描
全量扫描
grep -rn 'nullok\|nullok_secure' /etc/pam.d/ # 找出所有生效位置
awk -F: '($2=="") {print $1}' /etc/shadow # 找出真正的空口令账号
passwd -S user1 # 单账号复核:NP 表示空口令
cp -a /etc/pam.d /root/pam.d.bak-$(date +%F) # 改前先备份 PAM 目录处置
处置
passwd -l baduser # 立即锁定可疑账号
usermod -p '!' baduser # 等效:把口令字段置为锁定值
# 编辑 pam.d 中对应行,删除 nullok / nullok_secure 参数后保存
sed -i 's/ nullok_secure//; s/ nullok//' /etc/pam.d/system-auth # 示例,改后必须逐条确认
# 保持当前会话不退出,另开一个新会话验证正常账号仍能登录常见参数含义
| 参数 | 作用 | 处置建议 |
|---|---|---|
| nullok | 允许空口令账号登录 | 直接移除 |
| nullok_secure | 仅在安全终端列表内允许空口令 | 一并移除,风险等级略降但不豁免 |
| pam_unix.so | 本地账号口令验证模块 | 参数改动影响面大,改前备份、改后验新会话 |
| shadow 第 2 列为空 | 账号确实没有口令 | 先锁定再排查是否为入侵后门 |
空口令账号往往不是配置疏忽,而是攻击者留的后门:发现后应当先锁定账号、保留现场,再排查登录记录与计划任务,而不是删掉账号就结案。删号会销毁关键证据,也无法确认攻击者是否还有别的入口。
改 /etc/pam.d 属于高风险操作:配置写错会让所有人(包括 root)都登不进来。标准做法是先备份目录、修改时保留当前已登录会话不要退出、用另一个会话验证正常账号仍能登录,确认无误再收尾。