linux多服务器密码策略一致性巡检需聚焦pam强度参数、/etc/login.defs默认值、root用户实际策略及pam模块启用状态,通过ssh批量采集+本地结构化比对实现;推荐结合ansible实现策略即代码与自动验证闭环。

在 Linux 运维中,实现多台服务器集群的密码策略配置状态一致性巡检,核心是统一采集关键配置项(如 /etc/pam.d/common-password、/etc/login.defs、/etc/shadow 中的密码过期字段等),并通过批量执行 + 结构化比对完成“一致性判断”。不依赖外部平台时,可用纯 Shell + SSH 实现轻量级巡检。
明确需巡检的关键密码策略项
一致性巡检不是比对整个文件,而是聚焦影响行为的实际策略参数。常见必须比对的项包括:
-
PAM 密码强度规则:如
password [success=1 default=ignore] pam_pwquality.so retry=3 minlen=12 difok=3中的minlen、difok、retry、maxrepeat等 -
系统默认密码期限:从
/etc/login.defs提取PASS_MAX_DAYS、PASS_MIN_DAYS、PASS_WARN_AGE -
用户级密码状态(抽样):对 root 或指定运维账号,用
chage -l username检查实际生效的 max/min/warn 值,确认是否被单独覆盖 -
PAM 模块启用状态:确认
pam_pwquality.so或pam_pwcheck.so是否在common-password中启用(非注释且非 [default=die] 抑制)
编写巡检脚本:SSH 批量采集 + 本地结构化比对
以下是一个可直接运行的精简版巡检脚本框架(保存为 pwd_policy_audit.sh),支持 IP 列表输入和差异高亮:
#!/bin/bash
SERVERS=(192.168.1.10 192.168.1.11 192.168.1.12)
REPORT="audit_$(date +%Y%m%d_%H%M).log"
<p>echo "=== 密码策略一致性巡检报告 $(date) ===" > "$REPORT"</p><p>for host in "${SERVERS[@]}"; do
echo -e "\n--- $host ---" >> "$REPORT"</p><h1>采集 PAM 强度参数(提取 key=value 形式)</h1><p>ssh "$host" "grep -v '^#' /etc/pam.d/common-password 2>/dev/null | grep pwquality | sed 's/.<em>pam_pwquality.so[^[:alnum:]]</em>//; s/[[:space:]]*$//' | tr ' ' '\n' | grep '=' | cut -d= -f1,2" 2>/dev/null >> "$REPORT"</p><h1>采集 login.defs 默认值</h1><p>ssh "$host" "grep -E '^(PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_WARN_AGE)' /etc/login.defs 2>/dev/null" 2>/dev/null >> "$REPORT"</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill4570" title="linux-performance-analyzer"><img
src="https://img.php.cn/upload/skill/000/000/081/179013069298656.jpg" alt="linux-performance-analyzer" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill4570" title="linux-performance-analyzer" class="overflowclass">linux-performance-analyzer</a>
<p class="overflowclass">Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。</p>
</div>
<a rel="nofollow" href="/xiazai/skill4570" title="linux-performance-analyzer" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><h1>采集 root 用户实际密码策略(验证是否继承 defaults)</h1><p>ssh "$host" "chage -l root 2>/dev/null | grep -E '(Password expires|Minimum number|Warning period)'" 2>/dev/null >> "$REPORT"
done</p><p>echo -e "\n=== 差异分析 ===" >> "$REPORT"</p><h1>对每类参数做行频统计,快速定位异常值</h1><p>awk '/^PASS_|minlen|difok|retry/ {print $0}' "$REPORT" | sort | uniq -c | sort -nr >> "$REPORT"
echo "报告已生成:$REPORT"
</p>
✅ 使用前确保:所有目标服务器已配置免密 SSH 登录;ssh 客户端支持并发(可加 -o ConnectTimeout=5 -o BatchMode=yes 防卡顿);生产环境建议加上错误捕获(如 || echo \"$host: offline\" >> err.log)。
进阶:自动识别不一致并生成修复建议
在基础采集后,可用 Python 或 AWK 做二次分析。例如用 Python 脚本读取日志,按参数分组统计值分布,输出类似:
⚠ PASS_MAX_DAYS 不一致:10 台为 90,2 台为 180(主机:srv-db01, srv-app07)→ 建议同步为 90⚠ minlen=12 在 3 台缺失(实际为 minlen=8 或未设置)→ 检查 /etc/pam.d/common-password 是否漏配
这类输出可直接对接工单系统或通知运维群。关键逻辑是:把每个参数抽象为 (key, host, value) 三元组,再按 key 分组求 value 的唯一值个数,个数 > 1 即为不一致。
长期维护建议:策略即代码(Policy as Code)
巡检只是手段,根治靠标准化部署。推荐将密码策略固化为 Ansible Role:
- 用
lineinfile确保/etc/login.defs中的 PASS_* 字段统一 - 用
blockinfile管理/etc/pam.d/common-password中 pwquality 行 - 添加
assert模块,在每次执行后校验chage -l root输出是否符合预期 - 将该 Role 纳入 CI 流水线,每次变更都触发全量巡检测试
这样巡检就从“人工抽查”升级为“每次变更自动验证”,真正实现配置一致性闭环。










