首页 / 资讯动态 / Ubuntu安全系统账户弱密码检测与密码复杂度

Ubuntu安全系统账户弱密码检测与密码复杂度

Ubuntu系统中存在大量默认账户和服务账户,这些账户如果使用了弱密码或者没有设置密码复杂度策略,将直接导致服务器被暴力破解、提权攻击甚至沦为矿机。检测弱密码账户最直接的方法是使用John the Ripper、Hydra等工具对/etc/shadow文件进行离线破解测试,同时通过配置PAM模块和pam_pwquality来强制执行密码复杂度策略。本文将从检测方法、密码复杂度配置、加固方案三个层面,给出一套完整的Ubuntu安全账户密码管理方案。

一、Ubuntu系统中哪些账户需要重点关注

Ubuntu安装完成后,系统会自动创建一批账户。普通用户账户一般在安装时设定了密码,但以下几类账户往往是安全盲区:root账户(默认锁定但可能被启用)、daemon、bin、sys、sync、games、man、lp、mail、news、uucp、proxy、www-data、backup、list、irc、gnats、nobody、systemd-network、systemd-resolve、sshd、mysql、postgres等服务账户。这些账户中,部分默认没有登录权限,但如果被错误配置了密码或者被攻击者利用sudo权限,后果非常严重。尤其是sshd、mysql、postgres这类与网络服务直接相关的账户,一旦弱密码被利用,攻击者可以直接进入系统核心。

二、如何检测Ubuntu系统中的弱密码账户

检测弱密码有两条路径:一是检查密码哈希策略是否足够强,二是直接用工具尝试破解。先说第一种,查看/etc/shadow文件中每个账户的密码哈希算法:

sudo awk -F: '{print $1,$2}' /etc/shadow | head -20

如果某个账户的哈希字段是$1$(MD5)或者$5$(SHA-256无盐),说明密码哈希强度不够。现代Ubuntu默认使用$6$(SHA-512),这是基本要求。如果发现旧算法,需要立即迁移。

第二种方法是使用John the Ripper进行离线破解。首先提取shadow文件:

sudo unshadow /etc/passwd /etc/shadow > /tmp/crack.txt

然后用John进行破解:

sudo john --wordlist=/usr/share/wordlists/rockyou.txt /tmp/crack.txt

这个过程会尝试用常见密码字典对所有账户进行暴力测试。如果某个账户在几分钟内被破解,说明密码强度严重不足。对于生产环境,建议定期(比如每月)执行一次这样的检测。

另外还可以用Hydra对SSH服务进行在线检测:

sudo hydra -l root -P /usr/share/wordlists/rockyou.txt ssh://目标IP

注意:在线检测只能针对有网络登录权限的账户,而且会产生大量登录尝试日志,容易被入侵检测系统发现。建议优先使用离线方式。

三、Ubuntu密码复杂度策略的核心配置

Ubuntu从18.04开始默认使用pam_pwquality模块来管理密码复杂度。配置文件位于/etc/pam.d/common-password。打开这个文件,你会看到类似这样的内容:

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

这里每个参数的含义非常关键:minlen=8表示密码最少8位;difok=3表示新密码与旧密码至少有3个字符不同;ucredit=-1表示必须包含至少1个大写字母;lcredit=-1表示必须包含至少1个小写字母;dcredit=-1表示必须包含至少1个数字;ocredit=-1表示必须包含至少1个特殊字符。这套配置是比较合理的基线。

如果你的安全要求更高,可以调整为:

password requisite pam_pwquality.so retry=3 minlen=12 difok=5 ucredit=-2 lcredit=-2 dcredit=-2 ocredit=-2 maxrepeat=3 maxsequence=3 gecoscheck=1 enforce_for_root

新增的参数说明:minlen=12提升到12位;ucredit=-2要求至少2个大写字母;maxrepeat=3限制同一字符最多连续出现3次;maxsequence=3限制不允许出现abc、123这类连续序列;gecoscheck=1会检查密码是否包含用户全名等个人信息;enforce_for_root确保root账户也遵守同样的复杂度规则。最后这个参数极其重要,很多管理员忽略了root的密码策略。

四、密码过期和锁定策略的设置

光有复杂度不够,还需要定期更换密码和锁定失败尝试。编辑/etc/login.defs文件:

PASS_MAX_DAYS 90
PASS_MIN_DAYS 7
PASS_WARN_AGE 14

这表示密码最长90天必须更换,两次更换之间至少间隔7天,过期前14天开始提醒用户。对于服务账户,建议设置更短的周期或者直接禁用密码登录改用密钥认证。

账户锁定策略通过pam_faillock模块实现。编辑/etc/pam.d/common-auth:

auth required pam_faillock.so preauth silent deny=5 unlock_time=900
auth sufficient pam_unix.so nullok
auth required pam_faillock.so authfail deny=5 unlock_time=900

这段配置的意思是:连续5次登录失败后锁定账户,锁定时间为900秒(15分钟)。对于SSH登录,可以单独在/etc/pam.d/sshd中配置更严格的策略,比如deny=3直接锁定。

五、禁用不必要的账户和服务

检测和加固的同时,清理多余账户是最有效的手段。查看当前所有可登录的账户:

awk -F: '$7 !~ /nologin|false/ {print $1}' /etc/passwd

对于不需要的账户,直接锁定:

sudo usermod -L 账户名

或者直接删除:

sudo userdel -r 账户名

特别注意检查是否有UID为0的非root账户(这意味着有隐藏的root权限后门),以及是否有属于sudo组但不应该有sudo权限的账户:

grep -i sudo /etc/group

六、使用强密码生成工具和密码管理器

手动设置复杂密码容易出错,建议使用pwgen或openssl生成随机密码:

openssl rand -base64 16

这会生成一个22字符左右的随机字符串,包含大小写字母、数字和特殊字符,强度极高。对于需要多人管理的服务器环境,推荐使用HashiCorp Vault或者KeepassXC这类密码管理器来集中管理和轮换密码。

七、定期审计和自动化监控

安全不是一次性工作。建议编写一个简单的bash脚本,每周自动检测:

#!/bin/bash
echo "=== 弱密码哈希检测 ==="
sudo awk -F: '$2 ~ /^\$1\$/ || $2 ~ /^\$5\$/ {print $1, "使用弱哈希算法"}' /etc/shadow
echo "=== 可登录账户列表 ==="
awk -F: '$7 !~ /nologin|false/ {print $1}' /etc/passwd
echo "=== sudo组成员 ==="
grep -i sudo /etc/group
echo "=== 密码过期状态 ==="
sudo chage -l root 2>/dev/null | grep "密码"

把这个脚本加入crontab每周执行一次,配合邮件告警,就能形成持续的安全监控闭环。

八、总结与核心建议

Ubuntu账户安全的核心就三件事:第一,定期用John the Ripper做离线弱密码检测,发现问题立即整改;第二,通过pam_pwquality和pam_faillock强制执行密码复杂度和锁定策略,尤其不能放过root账户;第三,清理无用账户、禁用不必要的登录方式、用自动化脚本持续监控。密码安全没有银弹,但把这三件事做到位,可以挡住绝大多数自动化攻击和暴力破解。对于企业级环境,还应该结合审计日志(/var/log/auth.log)和入侵检测系统做更深层次的防护。