在多用户环境中,账号是系统安全的门户。加强账号安全无需复杂工具,用好 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_DAYS、PASS_MIN_DAYS、PASS_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,避免单台机器遗漏。 - 定期审计:用
lastb、faillock查看失败登录,用chage -l、passwd -S审核关键账号的密码状态。 - 警惕系统账号:大量的系统服务账号(如
www-data,nobody)通常应设为/sbin/nologin且无有效密码(即*或!),防止被攻击者利用。 - 结合认证源:如果使用了 LDAP、SSSD 等集中认证,登录限制可能还需在对应的客户端或服务器端额外控制,但本地 PAM 和 SSH 配置仍构成第一道防线。
账号安全并非一次性动作,而是一个持续收紧的动态过程。以这三项机制为根基,辅以适当的监控和审计,就能在不妨碍合法使用的前提下,扎扎实实地减少多数常见攻击的成功率。