Files
2025-12-29 13:38:39 +08:00

9.2 KiB

太好了 — 你已经贴出了 password-auth 的当前内容,基于它我会直接给出可复制的、安全步骤:先备份,再替换为建议的密码策略(使用 pam_pwquality,最小长度 12、difok=3、至少 3 类字符、并在 pam_unix 上启用密码历史 remember=5)。同时我会说明为什么这样改、如何测试,以及如何回滚。

说明:我保留 pam_pwqualityrequisite(与你当前一致),因为这会在强度检查失败时立即终止并拒绝密码更改,减少后续模块运行。但如果你希望即使强度检查失败也执行后续模块(例如记录历史或其它处理),可以把它改成 required。我在下面也给出小备注。


一步一步来(复制黏贴即可)

  1. 先备份原文件:
cp /etc/pam.d/password-auth /etc/pam.d/password-auth.bak.$(date +%F_%T)
ls -l /etc/pam.d/password-auth*
  1. 将下面内容写入临时文件并做替换(安全写入):
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)。
  • pam_unix.so ... remember=5

    • 实际写入 /etc/shadow 的模块,remember=5 阻止重复最近 5 个密码(提升安全性)。
  • 保留 pam_faillock:继续防暴力破解(失败 3 次锁 60 秒)。

  • pam_deny.so 保持在最后以确保策略失败时拒绝。


测试(非常重要)

在替换后不要立刻登出 root。先用一个普通用户或测试账号验证:

  1. 创建测试用户(如果没有):
sudo useradd -m testpwuser || true
sudo passwd testpwuser   # 按提示设置一个弱密码测试(应被拒绝)
  1. 测试几种密码:
  • 尝试 abc123(应失败)

  • 尝试 Abcdef12345(若满足 minlen & classes 应通过)

  • 尝试重复旧密码(应被 remember=5 拒绝)

  1. 查看认证日志:
sudo tail -n 200 /var/log/auth.log    # 或 /var/log/secure,视系统而定
# 或实时监测:
sudo tail -f /var/log/auth.log
  1. 如果你使用 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';