深色模式
身份鉴别合规:口令复杂度与双因子认证落地
摘要:身份鉴别的三要素是"你是谁(账号口令)+ 你有什么(令牌/密钥)+ 你是什么(生物特征)"。本文给出 Linux 上口令策略与 SSH 双因子(TOTP)的完整配置命令。"双因子"是通用安全实践,是否为强制要求取决于你组织适用的制度。
适用环境
bash
cat /etc/os-release
ls /etc/pam.d/ | head -20
ls /usr/lib64/security/pam_faillock.so /usr/lib/x86_64-linux-gnu/security/pam_faillock.so 2>/dev/null
command -v google-authenticator && google-authenticator --version1
2
3
4
2
3
4
操作步骤
1. 口令复杂度:pam_pwquality
bash
mkdir -p /etc/security/pwquality.conf.d
cat >/etc/security/pwquality.conf.d/99-policy.conf <<'EOF'
minlen = 12
dcredit = -1
ucredit = -1
lcredit = -1
ocredit = -1
minclass = 3
maxrepeat = 3
retry = 3
enforce_for_root
EOF1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
确认 PAM 已引用(RHEL 系在 system-auth/password-auth,Debian 系在 common-password):
bash
grep -n "pam_pwquality\|pam_cracklib" /etc/pam.d/system-auth /etc/pam.d/common-password 2>/dev/null1
2. 口令有效期与历史
bash
sed -i -E 's/^(PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_WARN_AGE).*//' /etc/login.defs
cat >>/etc/login.defs <<'EOF'
PASS_MAX_DAYS 90
PASS_MIN_DAYS 1
PASS_WARN_AGE 14
EOF
grep -q "^password.*pam_unix.*remember" /etc/pam.d/system-auth 2>/dev/null || \
sed -i 's/\(password[[:space:]]*sufficient[[:space:]]*pam_unix.so.*\)/\1 remember=5/' /etc/pam.d/system-auth1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
存量账号需单独设置(login.defs 只影响新建):
bash
for u in opsuser ops_zhang; do chage -M 90 -m 1 -W 14 "$u"; done
chage -l opsuser1
2
2
3. 登录失败锁定:pam_faillock
bash
# RHEL 8+
authselect enable-feature with-faillock 2>/dev/null
cat /etc/security/faillock.conf 2>/dev/null1
2
3
2
3
手动配置(Debian/Ubuntu 在 /etc/pam.d/common-auth):
bash
cat >/etc/security/faillock.conf <<'EOF'
deny = 5
fail_interval = 900
unlock_time = 900
silent
audit
EOF1
2
3
4
5
6
7
2
3
4
5
6
7
验证锁定与解锁:
bash
faillock --user opsuser
faillock --user opsuser --reset1
2
2
4. SSH 双因子:公钥 + TOTP
bash
# RHEL
dnf install -y google-authenticator qrencode-libs
# Debian/Ubuntu
apt-get install -y libpam-google-authenticator qrencode1
2
3
4
2
3
4
每个用户初始化(交互式,务必保存应急码):
bash
google-authenticator -t -d -f -r 3 -R 30 -W1
PAM 侧:
bash
cat >/etc/pam.d/sshd-2fa <<'EOF'
auth required pam_google_authenticator.so nullok secret=/home/${USER}/.google_authenticator
EOF
# 在 /etc/pam.d/sshd 顶部插入(保留原有 auth 行)
sed -i '1i auth required pam_google_authenticator.so nullok' /etc/pam.d/sshd1
2
3
4
5
2
3
4
5
sshd 侧必须开启挑战式认证:
bash
cat >/etc/ssh/sshd_config.d/98-2fa.conf <<'EOF'
PubkeyAuthentication yes
PasswordAuthentication no
AuthenticationMethods publickey,keyboard-interactive
KbdInteractiveAuthentication yes
UsePAM yes
EOF
sshd -t && systemctl restart sshd1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
改 sshd 认证方式前必须保留已登录会话
AuthenticationMethods 配错会直接锁死 SSH。先在测试机验证,远程机器上永远保留一个不断开的会话。
5. 统一入口:堡垒机的双因子
- 所有服务器只对堡垒机 IP 放通 SSH(见防火墙与网络隔离)。
- 堡垒机开启双因子 + 会话审计录制。
- 服务器侧
AllowUsers仅保留运维账号。
6. 时间同步:TOTP 的前提
bash
systemctl enable --now chronyd # Debian 系为 chrony
chronyc sources
timedatectl set-ntp true1
2
3
2
3
验证
bash
# 复杂度:弱口令应被拒绝
echo "opsuser:Password1" | chpasswd # 若被拒绝说明生效(长度不足时)
# 有效期
chage -l opsuser | grep -E 'Maximum|Warning'
# 失败锁定
faillock --user opsuser
# 双因子:登录时应提示 Verification code
ssh -p 2222 opsuser@server
# 配置语法
sshd -t && echo OK1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
判定标准:弱口令被拒;90 天强制改密;连续 5 次失败锁定;SSH 登录需输入动态码。
常见坑
AuthenticationMethods 配错导致全员无法登录
先在一台非关键机器验证,且保留活跃会话。出错时用带外控制台回滚 /etc/ssh/sshd_config.d/98-2fa.conf。
双因子后自动化任务(Ansible/rsync)集体失败
给自动化账号单独的 Match User 段豁免双因子,但限制其来源 IP 与命令集。
手机时间与服务器不同步导致动态码校验失败
TOTP 依赖时间。确保 chrony/ntp 正常,误差通常需在 30 秒窗口内。
只改 login.defs 以为存量账号也生效
必须用 chage 逐个设置,否则老账号仍是 99999 天。
丢了应急码又没有备用登录方式
初始化时打印的 emergency scratch codes 必须离线保存至少一份,否则手机丢失即失联。