主题
👤 用户认证安全
用户认证是服务器的身份验证门禁。密码太弱、锁定机制缺失,攻击者就能暴力破解进入系统。本节从 PAM 机制入手,逐一加固认证体系。
PAM:可插拔认证模块
PAM(Pluggable Authentication Modules)是 Linux 认证体系的底层框架。所有需要用户验证的服务(SSH、sudo、login),最终都是通过 PAM 来完成的。
核心目录:
| 路径 | 作用 |
|---|---|
/etc/pam.d/ | 每个服务的 PAM 配置 |
/lib/x86_64-linux-gnu/security/ | PAM 模块 .so 文件 |
/etc/security/ | 各模块的全局配置 |
bash
# 查看 SSH 服务使用的 PAM 模块
cat /etc/pam.d/sshd一个典型的 PAM 配置文件长这样:
config
# /etc/pam.d/common-password(密码策略)
password requisite pam_pwquality.so retry=3
password required pam_unix.so use_authtok每行格式:类型 控制标志 模块 参数
| 控制标志 | 含义 |
|---|---|
required | 必须通过,但无论成败都会继续执行后续模块 |
requisite | 必须通过,失败立即返回 |
sufficient | 通过则立即成功,忽略后续 |
optional | 成败不影响,除非它是唯一模块 |
密码策略:pam_pwquality
bash
# 安装密码质量模块
sudo apt install libpam-pwquality编辑 /etc/security/pwquality.conf:
config
# 最小密码长度
minlen = 12
# 最少包含 1 个大写字母
ucredit = -1
# 最少包含 1 个小写字母
lcredit = -1
# 最少包含 1 个数字
dcredit = -1
# 最少包含 1 个特殊符号
ocredit = -1
# 最少与旧密码不同的字符数
difok = 5
# 拒绝包含用户名连续 3 个以上字符的密码
reject_username = yes
# 拒绝连续重复字符超过 3 个的密码
maxrepeat = 3
# 拒绝密码中包含的用户全名
gecoscheck = 1
# 在错误信息中提示匹配规则
enforce_for_rootucredit/lcredit/dcredit/ocredit
-1 表示"至少 1 个",-2 表示"至少 2 个"。正数(如 1)则表示"最多 N 个",一般不用。
验证是否生效:
bash
# 用普通用户尝试设置弱密码
passwd
# 输入 "12345" 看是否被拒绝密码过期与历史
编辑 /etc/login.defs:
config
# 密码最大有效期(天),90 天强制换一次
PASS_MAX_DAYS 90
# 密码最小有效期,0 表示可随时修改
PASS_MIN_DAYS 1
# 密码过期前 7 天开始警告
PASS_WARN_AGE 7
# 创建用户时使用的默认值
CREATE_HOME yes
UMASK 077
USERGROUPS_ENAB yes设置密码历史(不允许重复使用最近 5 次密码):
bash
# pam_pwhistory.so 在 libpam-modules 包中(Ubuntu 默认已安装),无需额外安装在 /etc/pam.d/common-password 中:
config
password required pam_pwhistory.so remember=5 enforce_for_root账户锁定策略
方案一:pam_faillock(推荐,Ubuntu ≥ 22.04)
编辑 /etc/pam.d/common-auth,在 pam_unix.so 行前后分别添加:
config
# 在 pam_unix.so 之前:检查账户是否已被锁定
auth required pam_faillock.so preauth silent audit deny=5 unlock_time=600
# pam_unix.so 原有的那行保留不变(通常在 preauth 之后)
# auth [success=1 default=ignore] pam_unix.so nullok
# 在 pam_unix.so 之后:记录失败、清除成功计数
auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=600
auth sufficient pam_faillock.so authsucc audit deny=5 unlock_time=600参数说明:
deny=5:失败 5 次后锁定unlock_time=600:锁定 600 秒(10 分钟)audit:记录审计日志
bash
# 查看解锁时间
sudo faillock --user username
# 手动解锁
sudo faillock --user username --reset方案二:pam_tally2(旧版系统)
bash
# 在 /etc/pam.d/common-auth 中添加
auth required pam_tally2.so deny=5 unlock_time=600 onerr=fail audit
# 查看登录失败记录
sudo pam_tally2 -u username
# 重置计数
sudo pam_tally2 -u username --reset双因素认证(Google Authenticator)
2FA 给 SSH 登录再加一道锁:除了密钥/密码,还需要手机上当场生成的动态验证码。
bash
# 安装 Google Authenticator PAM 模块
sudo apt install libpam-google-authenticator
# 在服务器上为当前用户初始化(生成密钥和恢复码)
google-authenticator初始化过程会问几个问题:
- Do you want authentication tokens to be time-based? → y
- Do you want me to update your ~/.google_authenticator file? → y
- Do you want to disallow multiple uses? → y(一个码只能用一次)
- Rate limiting? → y(防暴力破解)
提示
用手机上的 Google Authenticator 或 Authy 扫描终端中显示的二维码即可绑定。
配置 SSH 使用 2FA
编辑 /etc/pam.d/sshd,在末尾添加:
config
auth required pam_google_authenticator.so然后修改 /etc/ssh/sshd_config:
bash
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive注意
AuthenticationMethods publickey,keyboard-interactive 表示密钥 + TOTP 码两者都必须通过。先测试成功再退出当前 SSH 会话。
重启 SSH:sudo systemctl restart ssh
/etc/login.defs 关键配置速查
config
PASS_MAX_DAYS 90 # 密码最长 90 天
PASS_MIN_DAYS 1 # 修改密码间隔最少 1 天
PASS_WARN_AGE 7 # 提前 7 天警告密码即将过期
LOGIN_RETRIES 5 # 登录失败最大尝试次数
LOGIN_TIMEOUT 60 # 登录超时秒数
UMASK 077 # 新建文件默认权限 600
SYS_UID_MIN 100 # 系统用户 UID 起
SYS_UID_MAX 999 # 系统用户 UID 止实战:一键配置
bash
#!/bin/bash
# auth-harden.sh — 认证安全一键加固
# 1. 安装必要包
apt install -y libpam-pwquality libpam-faillock
# 2. 配置密码策略
cat > /etc/security/pwquality.conf <<'EOF'
minlen = 12
ucredit = -1
lcredit = -1
dcredit = -1
ocredit = -1
difok = 5
reject_username = yes
maxrepeat = 3
gecoscheck = 1
enforce_for_root
EOF
# 3. 修改 login.defs
sed -i 's/^PASS_MAX_DAYS.*/PASS_MAX_DAYS 90/' /etc/login.defs
sed -i 's/^PASS_MIN_DAYS.*/PASS_MIN_DAYS 1/' /etc/login.defs
sed -i 's/^PASS_WARN_AGE.*/PASS_WARN_AGE 7/' /etc/login.defs
echo "✅ 认证安全加固完成"
echo "⚠ 如需 2FA,请手动运行 google-authenticator"🧪 练习题
- 配置 pwquality 要求密码至少 14 位,含大小写字母、数字和特殊字符
- 配置 faillock:3 次失败锁定 15 分钟
- 给 SSH 加上 Google Authenticator 双因素认证,验证登录流程
认证关过了,接下来从系统层面对整个操作系统做一次深度加固——系统安全加固。
🎯 本章要点
- required 不管成败都继续执行后续模块(延迟返回结果)。
- pam_faillock 在连续登录失败达到阈值后锁定账户一段时间
- pam_pwquality 控制密码最小长度、必须包含大小写+数字+特殊字符
加载练习题中...