Skip to content

👤 用户认证安全 ​

用户认证是服务器的身份验证门禁。密码太弱、锁定机制缺失,攻击者就能暴力破解进入系统。本节从 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_root

ucredit/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"

🧪 练习题 ​

  1. 配置 pwquality 要求密码至少 14 位,含大小写字母、数字和特殊字符
  2. 配置 faillock:3 次失败锁定 15 分钟
  3. 给 SSH 加上 Google Authenticator 双因素认证,验证登录流程

认证关过了,接下来从系统层面对整个操作系统做一次深度加固——系统安全加固。


🎯 本章要点 ​

  • required 不管成败都继续执行后续模块(延迟返回结果)。
  • pam_faillock 在连续登录失败达到阈值后锁定账户一段时间
  • pam_pwquality 控制密码最小长度、必须包含大小写+数字+特殊字符
加载练习题中...

有问题或补充?欢迎留言