9.2 KiB
太好了 — 你已经贴出了 password-auth 的当前内容,基于它我会直接给出可复制的、安全步骤:先备份,再替换为建议的密码策略(使用 pam_pwquality,最小长度 12、difok=3、至少 3 类字符、并在 pam_unix 上启用密码历史 remember=5)。同时我会说明为什么这样改、如何测试,以及如何回滚。
说明:我保留
pam_pwquality为requisite(与你当前一致),因为这会在强度检查失败时立即终止并拒绝密码更改,减少后续模块运行。但如果你希望即使强度检查失败也执行后续模块(例如记录历史或其它处理),可以把它改成required。我在下面也给出小备注。
一步一步来(复制黏贴即可)
- 先备份原文件:
cp /etc/pam.d/password-auth /etc/pam.d/password-auth.bak.$(date +%F_%T)
ls -l /etc/pam.d/password-auth*
- 将下面内容写入临时文件并做替换(安全写入):
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 /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)。
- 最短 12 个字符、至少 3 类字符、与旧密码至少 3 个字符不同。
-
pam_unix.so ... remember=5- 实际写入
/etc/shadow的模块,remember=5阻止重复最近 5 个密码(提升安全性)。
- 实际写入
-
保留
pam_faillock:继续防暴力破解(失败 3 次锁 60 秒)。 -
pam_deny.so保持在最后以确保策略失败时拒绝。
测试(非常重要)
在替换后不要立刻登出 root。先用一个普通用户或测试账号验证:
- 创建测试用户(如果没有):
sudo useradd -m testpwuser || true
sudo passwd testpwuser # 按提示设置一个弱密码测试(应被拒绝)
- 测试几种密码:
-
尝试
abc123(应失败) -
尝试
Abcdef12345(若满足 minlen & classes 应通过) -
尝试重复旧密码(应被
remember=5拒绝)
- 查看认证日志:
sudo tail -n 200 /var/log/auth.log # 或 /var/log/secure,视系统而定
# 或实时监测:
sudo tail -f /var/log/auth.log
- 如果你使用 SSH,需要测试
passwd改密是否与 SSH 有影响(通常没有),但如果你的环境有集中认证(SSSD/LDAP),请特别测试这些路径。
回滚(若出现问题)
如果验证失败或导致登录异常,立刻恢复备份:
# 恢复最初备份
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
cp /etc/pam.d/password-auth /etc/pam.d/password-auth.bak.$(date +%F_%T)
ls -l /etc/pam.d/password-auth*
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';