密码与 2FA
强密码策略和双因素认证(2FA)是保护用户账户安全的两道重要防线。本文介绍如何在 Ubuntu 26.04 中配置密码策略并启用双因素认证。
强密码策略
安装密码质量检查工具
sudo apt install libpam-pwquality配置密码策略
编辑密码质量配置文件:
sudo nano /etc/security/pwquality.conf常用配置项:
# 密码最小长度
minlen = 12
# 最少包含的字符类别数(大写、小写、数字、特殊字符)
minclass = 3
# 最少包含的大写字母数
ucredit = -1
# 最少包含的小写字母数
lcredit = -1
# 最少包含的数字
dcredit = -1
# 最少包含的特殊字符
ocredit = -1
# 新密码中不能与旧密码相同的字符数
difok = 5
# 禁止用户名作为密码的一部分
usercheck = 1
# 限制连续相同字符
maxrepeat = 3
# 限制连续相同类别的字符
maxclassrepeat = 4
# 拒绝回文密码
palindrome = 1
# 拒绝字典中的常见词
dictcheck = 1配置密码过期策略
# 编辑全局设置
sudo nano /etc/login.defs# 密码最长有效期(天)
PASS_MAX_DAYS 90
# 密码最短使用期(天)
PASS_MIN_DAYS 7
# 密码过期前警告天数
PASS_WARN_AGE 14
# 密码最小长度
PASS_MIN_LEN 12对特定用户设置密码策略
# 设置用户密码最长有效期为 90 天
sudo chage -M 90 username
# 设置用户密码最短使用期为 7 天
sudo chage -m 7 username
# 设置密码过期前 14 天警告
sudo chage -W 14 username
# 立即要求用户修改密码
sudo chage -d 0 username
# 查看用户密码策略
sudo chage -l username密码历史(禁止重复使用旧密码)
编辑 PAM 配置:
sudo nano /etc/pam.d/common-password找到包含 pam_unix.so 的行,添加 remember 参数:
password [success=1 default=ignore] pam_unix.so obscure use_authtok try_first_pass yescrypt remember=12这会阻止用户使用最近 12 次使用过的密码。
密码管理工具
命令行密码管理器 pass
# 安装
sudo apt install pass
# 初始化(需要 GPG 密钥)
gpg --gen-key
pass init "your-gpg-id"
# 添加密码
pass insert email/gmail
pass insert -m server/production # 多行模式
# 查看密码
pass email/gmail
# 生成随机密码
pass generate web/newsite 20
# 列出所有密码
pass ls
# 搜索
pass find gmail使用 KeePassXC
# 安装
sudo apt install keepassxc
# 或使用 snap
sudo snap install keepassxcKeePassXC 是一个功能丰富的图形化密码管理器,支持:
- 密码数据库加密存储
- 自动填充密码
- TOTP 双因素认证
- 浏览器集成
- SSH Agent 集成
Google Authenticator(TOTP 2FA)
安装和初始化
# 安装 PAM 模块
sudo apt install libpam-google-authenticator
# 以普通用户运行初始化
google-authenticator初始化过程中的选项建议:
Do you want authentication tokens to be time-based (y/n) y
# 选 y,使用基于时间的令牌(TOTP)
# 会显示一个二维码,用手机上的认证器 App 扫描
# 推荐 App:Google Authenticator、Authy、Microsoft Authenticator、FreeOTP
Do you want me to update your "/home/user/.google_authenticator" file? (y/n) y
Do you want to disallow multiple uses of the same authentication token? (y/n) y
# 选 y,防止令牌重放
By default, a new token is generated every 30 seconds.
Do you want to change the size of the time skew window? (y/n) n
Do you want to enable rate-limiting? (y/n) y
# 选 y,限制尝试频率务必保存显示的紧急备用验证码。
为本地登录启用 2FA
sudo nano /etc/pam.d/common-auth在文件末尾添加:
auth required pam_google_authenticator.so nulloknullok 参数允许未配置 2FA 的用户正常登录。全部用户配置完成后可以移除此参数。
为 SSH 登录启用 2FA
# 编辑 PAM SSH 配置
sudo nano /etc/pam.d/sshd添加:
auth required pam_google_authenticator.so编辑 SSH 服务配置:
sudo nano /etc/ssh/sshd_config# 启用键盘交互认证
KbdInteractiveAuthentication yes
# 要求密钥 + TOTP 双重认证
AuthenticationMethods publickey,keyboard-interactive重启 SSH:
sudo systemctl restart ssh为 sudo 启用 2FA
sudo nano /etc/pam.d/sudo在 @include common-auth 之后添加:
auth required pam_google_authenticator.so这样每次使用 sudo 都需要输入验证码。
硬件安全密钥(FIDO2/U2F)
支持的设备
Ubuntu 26.04 支持 FIDO2/U2F 安全密钥,如:
- YubiKey 5 系列
- Google Titan Security Key
- Feitian ePass FIDO
- SoloKeys
安装配置
# 安装 PAM U2F 模块
sudo apt install libpam-u2f
# 安装管理工具
sudo apt install pamu2fcfg注册安全密钥
# 创建配置目录
mkdir -p ~/.config/Yubico
# 注册第一个密钥(插入安全密钥并触摸)
pamu2fcfg > ~/.config/Yubico/u2f_keys
# 注册备用密钥(追加模式)
pamu2fcfg -n >> ~/.config/Yubico/u2f_keys为 sudo 启用安全密钥
sudo nano /etc/pam.d/sudo在 @include common-auth 之前添加:
auth sufficient pam_u2f.so为登录启用安全密钥
sudo nano /etc/pam.d/gdm-password添加:
auth required pam_u2f.so为 SSH 启用安全密钥
OpenSSH 8.2+ 原生支持 FIDO2 密钥:
# 生成 FIDO2 SSH 密钥
ssh-keygen -t ed25519-sk -C "your_email@example.com"
# 或使用常驻密钥(不需要服务器有 .ssh/authorized_keys 中的公钥对应的硬件密钥)
ssh-keygen -t ed25519-sk -O resident -C "your_email@example.com"
# 将公钥部署到服务器
ssh-copy-id -i ~/.ssh/id_ed25519_sk.pub user@serverPAM 认证流程配置
理解 PAM 控制标志
| 标志 | 说明 |
|---|---|
required | 必须成功,失败后继续检查其他模块 |
requisite | 必须成功,失败后立即返回 |
sufficient | 成功则直接通过,失败继续检查 |
optional | 成功或失败都不影响最终结果 |
多因素认证组合示例
密码 + TOTP:
# /etc/pam.d/common-auth
auth required pam_unix.so
auth required pam_google_authenticator.so密码 + 安全密钥(安全密钥可选):
auth required pam_unix.so
auth sufficient pam_u2f.so
auth required pam_google_authenticator.so账户锁定策略
配置登录失败锁定
sudo nano /etc/pam.d/common-auth在文件开头添加:
auth required pam_faillock.so preauth silent deny=5 unlock_time=900
auth [default=die] pam_faillock.so authfail deny=5 unlock_time=900sudo nano /etc/pam.d/common-account添加:
account required pam_faillock.so参数说明:
deny=5:5 次失败后锁定unlock_time=900:锁定 900 秒(15 分钟)
管理锁定状态
# 查看用户的失败尝试
sudo faillock --user username
# 解锁用户
sudo faillock --user username --reset
# 查看所有被锁定的用户
sudo faillock最佳实践
- 使用 12 位以上的密码,包含大小写字母、数字和特殊字符。
- 为每个服务使用不同密码,使用密码管理器。
- 所有支持 2FA 的服务都启用 2FA。
- 保存好备用验证码和恢复密钥。
- 注册多个安全密钥作为备用。
- 定期更换密码,但不要太频繁(90 天一次即可)。
- 监控登录失败记录,及时发现暴力破解。
Last updated on