在 Linux 服务器的日常运维中,账号和密码是最基础也是攻击者最常尝试突破的入口。一个被人遗忘的测试账号、一个设置了弱密码的闲置登录权限,都可能在安全审计中被标记为高危漏洞。因此,有意识地清理无用账号并强化密码策略,是加固系统的第一步。
1. 找出并禁用无用账号
为什么要清理:默认安装或后续安装的某些服务可能会创建系统账号,旧项目残留的临时账号、已离职员工的账号等,如果不加管理,会留下无人监控的后门。
常见分类:
- 系统服务账号(UID < 1000 或特定范围):通常用于运行守护进程,不应直接用于登录。它们的 shell 常设为
/usr/sbin/nologin或/bin/false,禁止交互登录。 - 普通用户账号:过去为同事、外包人员甚至测试目的创建的账号,密码往往很简单。
操作步骤:
首先,查看所有可登录的账号:
grep -E 'bash|sh$' /etc/passwd
或者使用更现代的工具(若安装了 users 相关包),列出真正拥有合法 shell 的用户。
对确认不会再使用的账号,先锁定而非直接删除(保留数据):
sudo passwd -l 用户名 # 锁定账号密码,无法登录
sudo usermod -s /usr/sbin/nologin 用户名 # 同时修改 shell,杜绝可能的非密码登录(如 SSH key)
如果确定账号及数据彻底无用,删除账号:
sudo userdel 用户名
sudo userdel -r 用户名 # 同时删除家目录和邮件池
此外,禁止 root 直接 SSH 登录也是常规做法(通过 /etc/ssh/sshd_config 中的 PermitRootLogin no),并删除组内多余成员,保证特权组(如 wheel、sudo 组)仅为必要人员保留。
2. 强化密码策略
目标:强制用户设置足够复杂的密码,并定期更换,降低暴力破解和字典攻击风险。
配置文件:核心文件为 /etc/login.defs 和 /etc/pam.d/common-password(或 /etc/pam.d/system-auth,随发行版不同略有差异)。
在 /etc/login.defs 中设置通用有效期:
PASS_MAX_DAYS 90 # 密码最长使用天数,到期强制修改
PASS_MIN_DAYS 7 # 两次修改的最小间隔天数
PASS_WARN_AGE 14 # 密码过期前14天开始警告用户
这些参数影响新创建的用户,对已有用户可以用 chage 命令调整:
sudo chage -M 90 -m 7 -W 14 用户名
使用 PAM 模块控制密码复杂度:
安装 libpam-pwquality(Debian/Ubuntu)或 pam_pwquality(RHEL/CentOS)。修改 /etc/pam.d/common-password(通常在包含 password requisite pam_pwquality.so 那行),添加选项:
password requisite pam_pwquality.so retry=3 \
minlen=12 \
difok=3 \
ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 \
enforce_for_root
参数含义:
minlen=12:最小长度 12 位(建议至少 12~16 位)。ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1:至少要包含1个大写字母、1个小写字母、1个数字和1个特殊字符(负值表示“至少N个”)。difok=3:新密码与旧密码至少有3个字符不同。retry=3:允许用户输入错误3次后退出。enforce_for_root:root 修改自身或其他用户密码时也受此限制(除非直接编辑 shadow 文件,否则无法绕过)。
屏蔽常用弱密码:
可利用 pwquality 的字典检查功能,在配置中添加:
dictcheck=1
usercheck=1
dictpath=/usr/share/cracklib/pw_dict # 字典路径(通常由 cracklib 提供)
这样会阻止用户将密码设置为常见单词或包含用户名的变形。
3. 密码历史与重复限制
防止用户反复使用相同几个密码,在 PAM 中启用历史记录。在 /etc/pam.d/common-password 中添加或修改 pam_unix.so 参数:
password sufficient pam_unix.so ... remember=5
remember=5 表示记录最近5次使用的密码,用户设置新密码时系统会拒绝与历史记录重复的密码。
4. 替代方案:SSH 密钥 + 禁止密码登录
更稳健的方式是完全放弃密码认证,改用 SSH 密钥对,并禁用密码登录。在 /etc/ssh/sshd_config 中设置:
PasswordAuthentication no
ChallengeResponseAuthentication no
PubkeyAuthentication yes
然后重启 SSH 服务。此时即使密码泄露也无法远程登录,显著降低暴力破解风险。当然,必须确保自己已有有效的公钥已添加至目标用户 ~/.ssh/authorized_keys。
5. 定期审计与自动化
这些手动设置最好通过配置管理工具(Ansible、Puppet 等)固化为基线策略,并定期用脚本检查:
- 扫描
/etc/shadow中是否存在空密码或!锁定状态外的异常账户; - 检查
/etc/passwd中是否存在不属于系统范围内的可登录 UID; - 使用
last、lastlog查看长期未登录的账户(例如lastlog -b 90查看90天未登录的用户),列为禁用候选。
总结:无用的账号是定时炸弹,弱密码策略是敞开的大门。简单的几项配置就能让系统的抗攻击能力从“一碰就破”提升到“需要极大成本去突破”,而付出这些努力的成本极低,且不影响合法用户的日常使用。这是安全运维中性价比最高的一环。