太好了 — 你已经贴出了 `password-auth` 的当前内容,基于它我会直接给出**可复制的、安全步骤**:先备份,再替换为建议的密码策略(使用 `pam_pwquality`,最小长度 12、`difok=3`、至少 3 类字符、并在 `pam_unix` 上启用密码历史 `remember=5`)。同时我会说明为什么这样改、如何测试,以及如何回滚。 > 说明:我保留 `pam_pwquality` 为 `requisite`(与你当前一致),因为这会在强度检查失败时立即终止并拒绝密码更改,减少后续模块运行。但如果你希望即使强度检查失败也执行后续模块(例如记录历史或其它处理),可以把它改成 `required`。我在下面也给出小备注。 --- ## 一步一步来(复制黏贴即可) 1. 先备份原文件: ```bash cp /etc/pam.d/password-auth /etc/pam.d/password-auth.bak.$(date +%F_%T) ls -l /etc/pam.d/password-auth* ``` 2. 将下面内容写入临时文件并做替换(安全写入): ```bash cat <<'EOF' | tee /etc/pam.d/password-auth.new >/dev/null # /etc/pam.d/password-auth - modified recommended settings auth required pam_kysec.so #%PAM-1.0 auth required pam_env.so auth required pam_faillock.so preauth audit deny=3 even_deny_root unlock_time=60 #auth sufficient pam_fprintd.so auth sufficient pam_unix.so nullok try_first_pass #auth sufficient pam_sss.so use_first_pass auth [default=die] pam_faillock.so authfail audit deny=3 even_deny_root unlock_time=60 auth sufficient pam_faillock.so authsucc audit deny=3 even_deny_root unlock_time=60 auth requisite pam_succeed_if.so uid >= 1000 quiet_success auth required pam_deny.so account required pam_unix.so account sufficient pam_localuser.so account sufficient pam_succeed_if.so uid < 1000 quiet #account [default=bad success=ok user_unknown=ignore] pam_sss.so account required pam_permit.so # Password quality: enforce length, classes, difok # - minlen=12 : minimal length (increase if you want stronger) # - difok=3 : new password must differ in at least 3 characters from old # - minclass=3: at least 3 character classes (uppercase, lowercase, digit, other) # - u/l/d/ocredit -1 : require at least one of each (set ocredit=0 to make special char optional) password requisite pam_pwquality.so retry=3 minlen=12 difok=3 minclass=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=0 local_users_only # UNIX module performs the actual password change and supports history # remember=5 : prevent reuse of last 5 passwords password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5 # If you have SSSD and want it to accept the token, uncomment below (but test first) #password sufficient pam_sss.so use_authtok password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so #session optional pam_systemd.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so #session optional pam_sss.so EOF ``` ```bash mv /etc/pam.d/password-auth /etc/pam.d/password-auth.orig.$(date +%F_%T) mv /etc/pam.d/password-auth.new /etc/pam.d/password-auth chmod 644 /etc/pam.d/password-auth ls -l /etc/pam.d/password-auth* ``` --- ## 为什么这样改(要点) - `pam_pwquality.so minlen=12 difok=3 minclass=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=0` - 最短 12 个字符、至少 3 类字符、与旧密码至少 3 个字符不同。`ocredit=0` 表示**特殊字符非强制但建议**(若你要强制特殊字符,将 `ocredit=-1`)。 - `pam_unix.so ... remember=5` - 实际写入 `/etc/shadow` 的模块,`remember=5` 阻止重复最近 5 个密码(提升安全性)。 - 保留 `pam_faillock`:继续防暴力破解(失败 3 次锁 60 秒)。 - `pam_deny.so` 保持在最后以确保策略失败时拒绝。 --- ## 测试(非常重要) 在替换后不要立刻登出 root。先用一个普通用户或测试账号验证: 1. 创建测试用户(如果没有): ```bash sudo useradd -m testpwuser || true sudo passwd testpwuser # 按提示设置一个弱密码测试(应被拒绝) ``` 2. 测试几种密码: - 尝试 `abc123`(应失败) - 尝试 `Abcdef12345`(若满足 minlen & classes 应通过) - 尝试重复旧密码(应被 `remember=5` 拒绝) 3. 查看认证日志: ```bash sudo tail -n 200 /var/log/auth.log # 或 /var/log/secure,视系统而定 # 或实时监测: sudo tail -f /var/log/auth.log ``` 4. 如果你使用 SSH,需要测试 `passwd` 改密是否与 SSH 有影响(通常没有),但如果你的环境有集中认证(SSSD/LDAP),请特别测试这些路径。 --- ## 回滚(若出现问题) 如果验证失败或导致登录异常,立刻恢复备份: ```bash # 恢复最初备份 sudo cp /etc/pam.d/password-auth.bak.* /etc/pam.d/password-auth # 或恢复刚做的原始文件 sudo mv /etc/pam.d/password-auth.orig.* /etc/pam.d/password-auth ``` 然后重启相关服务或直接重启机器(如果需要)。 --- ## 额外建议(可选) - 若你希望强制所有四类字符(UPPER+lower+digit+special),把 `ocredit=0` 改成 `ocredit=-1`(并把 `minclass=3` 可留或删)。 - 如果你更希望**即使强度检查失败也执行后续模块**(例如记录历史、通知或其它逻辑),可把 `password requisite pam_pwquality.so ...` 改为 `password required ...`。 - 如果系统使用 SSSD/LDAP,请确认是否需要在 `password` 区块保留 `pam_sss.so use_authtok`(我在建议中注释了它,避免在没有 SSSD 测试的系统上造成问题)。若你确实使用 SSSD,请取消注释并测试。 --- 如果你愿意,我可以: - 直接检查你当前 `/etc/pam.d/system-auth` 或 `/etc/pam.d/common-password`(如果存在)并给出一致化建议; - 或根据你的偏好(更严格:强制特殊字符 / 更宽松:允许 passphrase)把上面的配置调成两个不同的“严格度模板”供你选择并直接生成替换命令。 现在我已经把一个安全性较好的建议给出——要我继续把 `system-auth` / `common-password` 一并对齐吗? 项目:4 ```bash cp /etc/pam.d/password-auth /etc/pam.d/password-auth.bak.$(date +%F_%T) ls -l /etc/pam.d/password-auth* ``` ```bash cat <<'EOF' | tee /etc/pam.d/password-auth.new >/dev/null # /etc/pam.d/password-auth - modified recommended settings auth required pam_kysec.so #%PAM-1.0 auth required pam_env.so auth required pam_faillock.so preauth audit deny=3 even_deny_root unlock_time=60 #auth sufficient pam_fprintd.so auth sufficient pam_unix.so nullok try_first_pass #auth sufficient pam_sss.so use_first_pass auth [default=die] pam_faillock.so authfail audit deny=3 even_deny_root unlock_time=60 auth sufficient pam_faillock.so authsucc audit deny=3 even_deny_root unlock_time=60 auth requisite pam_succeed_if.so uid >= 1000 quiet_success auth required pam_deny.so account required pam_unix.so account sufficient pam_localuser.so account sufficient pam_succeed_if.so uid < 1000 quiet #account [default=bad success=ok user_unknown=ignore] pam_sss.so account required pam_permit.so # Password quality: enforce length, classes, difok # - minlen=12 : minimal length (increase if you want stronger) # - difok=3 : new password must differ in at least 3 characters from old # - minclass=3: at least 3 character classes (uppercase, lowercase, digit, other) # - u/l/d/ocredit -1 : require at least one of each (set ocredit=0 to make special char optional) password requisite pam_pwquality.so retry=3 minlen=12 difok=3 minclass=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=0 local_users_only # UNIX module performs the actual password change and supports history # remember=5 : prevent reuse of last 5 passwords password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5 # If you have SSSD and want it to accept the token, uncomment below (but test first) #password sufficient pam_sss.so use_authtok password required pam_deny.so session optional pam_keyinit.so revoke session required pam_limits.so #session optional pam_systemd.so session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid session required pam_unix.so #session optional pam_sss.so EOF ``` ``` mv /etc/pam.d/password-auth.new /etc/pam.d/password-auth ``` ``` ip addr | grep en cat /etc/pam.d/password-auth | grep pwq ``` 达梦: ``` cd /home/dmdba/dmdbms/bin ./disql SYSDBA/'"Hn@dameng123"':35236 ``` ``` SELECT ROLE$ FROM V$DATABASE; ``` ``` SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME='ENABLE_AUDIT'; ``` ``` SP_SET_PARA_VALUE(1, 'ENABLE_AUDIT', 2); ``` ``` cd /home/dmdba/dmdbms/bin ./disql SYSAUDITOR/SYSAUDITOR@localhost:35239 ``` ``` SP_SET_ENABLE_AUDIT(2); SELECT PARA_NAME, PARA_VALUE, PARA_TYPE FROM V$DM_INI WHERE PARA_NAME='ENABLE_AUDIT'; ```