Skip to Content

密码与 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 keepassxc

KeePassXC 是一个功能丰富的图形化密码管理器,支持:

  • 密码数据库加密存储
  • 自动填充密码
  • 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 nullok

nullok 参数允许未配置 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@server

PAM 认证流程配置

理解 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=900
sudo 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

最佳实践

  1. 使用 12 位以上的密码,包含大小写字母、数字和特殊字符。
  2. 为每个服务使用不同密码,使用密码管理器。
  3. 所有支持 2FA 的服务都启用 2FA。
  4. 保存好备用验证码和恢复密钥。
  5. 注册多个安全密钥作为备用。
  6. 定期更换密码,但不要太频繁(90 天一次即可)。
  7. 监控登录失败记录,及时发现暴力破解。
Last updated on