人人都会AI编程

12.4 账号安全:密码策略、登录限制、锁定账号

更新时间:2026-07-12

在多用户环境中,账号是系统安全的门户。加强账号安全无需复杂工具,用好 Linux 内置的一系列标准机制就能大幅降低未授权访问的风险。本节围绕三个最实用的方向展开:强制使用健壮的密码、限制谁能从何处登录、及时锁定有风险的账号。


一、密码策略

密码策略的核心目标有两个:防止用户使用过于简单的密码,并定期强制更换。

1. 使用 chage 管理密码有效期

chage 命令可以直接调整单个账号的密码过期、修改间隔等参数,不需要编辑配置文件。

# 查看用户 alice 的密码状态
chage -l alice

# 设置密码最长使用 90 天,过期前 7 天提醒,过期后 5 天内仍可登录但强制改密
sudo chage -M 90 -W 7 -I 5 alice

# 强制用户下次登录时修改密码
sudo chage -d 0 alice

常用选项:

  • -M 天数:密码最大有效期
  • -m 天数:两次修改密码之间的最小间隔(防止用户反复改成旧密码)
  • -W 天数:到期前多少天开始警告
  • -I 天数:到期后宽限天数,过后账号被锁定
  • -E YYYY-MM-DD:账号绝对失效日期

2. 使用 PAM 模块强制密码复杂度

pam_pwquality.so(旧称 pam_cracklib.so)是负责校验密码强度的 PAM 模块,配置在 /etc/pam.d/common-password(Debian/Ubuntu)或 /etc/pam.d/system-auth(RHEL/Fedora)中。典型配置行:

password requisite pam_pwquality.so try_first_pass retry=3 minlen=12 difok=3 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1

含义解释:

  • minlen=12:最小密码长度 12 位(注意:此值实际上包含了凭据部分,实际最小密码长度为 minlen - (各类字符数),但通常将其设为你期望的最小长度+需要类型的数量)。
  • difok=3:新密码与旧密码至少 3 个字符不同
  • dcredit=-1:至少包含 1 个数字(负号表示最少数量)
  • ucredit=-1:至少包含 1 个大写字母
  • lcredit=-1:至少包含 1 个小写字母
  • ocredit=-1:至少包含 1 个特殊字符
  • retry=3:允许尝试输入次数

修改后,普通用户用 passwd 修改密码时会强制满足策略。

3. 利用 /etc/login.defs 全局默认值

该文件定义了新用户创建时的默认密码参数,如 PASS_MAX_DAYSPASS_MIN_DAYSPASS_WARN_AGE 等。建议生产环境调整:

PASS_MAX_DAYS   90
PASS_MIN_DAYS   1
PASS_WARN_AGE   7

这些值只对新建用户生效,修改后不影响已有用户(已有用户仍用 chage 调整)。


二、登录限制

合理限制登录行为可以阻断多数自动化攻击和未授权尝试。

1. 限制 root 直接登录

在绝大多数情况下,不建议 root 直接远程登录,而是通过普通用户 sudo 提权。在 /etc/ssh/sshd_config 中设置:

PermitRootLogin no

某些情况下可设为 PermitRootLogin prohibit-password(仅允许密钥登录)。修改后需要 sudo systemctl reload sshd

2. 限制可通过 SSH 登录的用户或组

同样在 sshd_config 中:

AllowUsers alice bob
AllowGroups sshusers
DenyUsers charlie
DenyGroups no-ssh

多个用户或组用空格分隔。生效顺序:DenyUsers 优先于 AllowUsers。限制后,非许可用户即使密码正确也无法登录 SSH。

3. 使用 PAM 模块限制登录尝试次数

暴力破解是最常见的攻击方式。pam_tally2(或新的 pam_faillock)模块可以在连续多次认证失败后自动锁定账号,即使是合法用户也无法继续尝试。

pam_faillock 为例(RHEL 8/9、Ubuntu 较新版本),在 /etc/pam.d/system-auth/etc/pam.d/password-auth 中添加:

auth required pam_faillock.so preauth silent audit deny=5 unlock_time=600
auth sufficient pam_unix.so nullok
auth required pam_faillock.so authfail audit deny=5 unlock_time=600
account required pam_faillock.so

参数说明:

  • deny=5:连续失败 5 次后锁定账号
  • unlock_time=600:锁定 600 秒(10 分钟)后自动解锁
  • silent:不显示更多错误细节
  • audit:向审计日志记录此次锁定

锁定后,即使后续提供正确密码,也会被拒之门外,并提示 “Account locked due to X failed logins”。管理员可以用 faillock --user alice --reset 手动解除锁定。

对于仍使用 pam_tally2 的旧系统(如 CentOS 7),类似配置:

auth required pam_tally2.so onerr=fail deny=5 unlock_time=600 even_deny_root root_unlock_time=300
account required pam_tally2.so

查看失败次数:pam_tally2 -u alice;清零:pam_tally2 -u alice --reset

4. 闲置登录超时(TMOUT

防止已登录的终端被他人趁机操作,可以在 /etc/profile 或用户环境变量中设置:

export TMOUT=600

单位为秒,600 秒(10 分钟)无操作后 shell 自动登出。


三、锁定账号

当用户离职、遭遇攻击或长期不需要登录时,应立即锁定其账号。

1. 锁定密码但保留 shell 不可登录

sudo passwd -l alice      # 锁定账号,在 /etc/shadow 中密码字段前加 “!!”
sudo passwd -u alice      # 解锁

此时账号目录和数据不受影响,但无法用密码登录(包括 SSH 和控制台)。如果用户已配置 SSH 密钥,则需要额外处理 ~/.ssh/authorized_keys 或全局禁用密钥认证。

2. 完全禁用账号

sudo usermod -L alice     # 与 passwd -l 类似
sudo usermod -U alice     # 解锁

若需更彻底的拒绝,可以设置 shell 为 /sbin/nologin/bin/false

sudo usermod -s /sbin/nologin alice

这样即使密码未锁定,用户也无法获得 shell(但 SFTP 等服务可能仍然可用,需配合服务配置禁止)。

3. 设置账号过期日期

对临时员工或合作方账号,用 chage -E 设置一个失效日期:

sudo chage -E 2025-12-31 temporary_user

到期后账号自动禁用,无法登录。

4. 手动清除 SSH 公钥

若担心已泄露的密钥,直接删除或重命名其 ~/.ssh/authorized_keys 文件:

sudo mv /home/alice/.ssh/authorized_keys /home/alice/.ssh/authorized_keys.bak

并检查用户是否在别处有 ~/.ssh/authorized_keys2(极少见,但可能存在)。


四、综合实践建议

  • 设定基线策略:使用集中配置管理工具(Ansible/Chef/Puppet)分发统一的 /etc/login.defs、PAM 配置及 sshd_config,避免单台机器遗漏。
  • 定期审计:用 lastbfaillock 查看失败登录,用 chage -lpasswd -S 审核关键账号的密码状态。
  • 警惕系统账号:大量的系统服务账号(如 www-data, nobody)通常应设为 /sbin/nologin 且无有效密码(即 *!),防止被攻击者利用。
  • 结合认证源:如果使用了 LDAP、SSSD 等集中认证,登录限制可能还需在对应的客户端或服务器端额外控制,但本地 PAM 和 SSH 配置仍构成第一道防线。

账号安全并非一次性动作,而是一个持续收紧的动态过程。以这三项机制为根基,辅以适当的监控和审计,就能在不妨碍合法使用的前提下,扎扎实实地减少多数常见攻击的成功率。