深色模式
弱口令治理:扫描、强制策略与清零闭环
摘要:弱口令是最容易被利用也最容易根治的风险。本文给出"自查扫描 → 强制策略 → 存量清零 → 持续监测"四步法,含 SSH/MySQL/Redis 的自查命令。
适用环境
bash
cat /etc/os-release
command -v john && john --version | head -1
command -v hydra && hydra -h | head -3
command -v medusa >/dev/null && echo "medusa 可用"
grep -n "pam_pwquality" /etc/pam.d/system-auth /etc/pam.d/common-password 2>/dev/null1
2
3
4
5
2
3
4
5
操作步骤
1. 先做资产盘点:哪些服务需要口令
bash
ss -lntup | grep -E ':(22|3306|5432|6379|27017|9200|15672|8080|8443)\s'
# 常见默认口令入口
# Redis 6379、MongoDB 27017、Elasticsearch 9200、RabbitMQ 15672、Tomcat 80801
2
3
2
3
2. 自查扫描(仅限自己拥有或已授权的系统)
用弱口令字典对 SSH 做自查:
bash
cat >/tmp/weak.txt <<'EOF'
123456
password
admin
root
test
12345678
qwerty
letmein
EOF
hydra -L /tmp/user.txt -P /tmp/weak.txt -t 4 -f ssh://10.0.1.10:22 2>/dev/null | tail -51
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
未经授权对他人系统做口令爆破是违法行为
只在自己负责的资产上做,扫描前走变更/审批流程,控制并发(hydra -t 4)避免打挂服务。
Redis/MongoDB 未授权与空口令检查:
bash
redis-cli -h 10.0.1.20 -p 6379 ping 2>&1 | head -1 # 能 PONG 说明无认证
redis-cli -h 10.0.1.20 -p 6379 -a "" info 2>&1 | head -2
curl -s -m 3 http://10.0.1.30:9200/_cat/indices 2>/dev/null | head -3 # ES 未授权
curl -s -m 3 http://10.0.1.30:27017 2>/dev/null | head -2 # MongoDB1
2
3
4
2
3
4
3. 离线审计本机口令强度(John the Ripper)
bash
# 合并口令散列
unshadow /etc/passwd /etc/shadow > /tmp/hashes.txt
john --format=crypt /tmp/hashes.txt --wordlist=/usr/share/wordlists/rockyou.txt
john --show /tmp/hashes.txt1
2
3
4
2
3
4
必须在受控环境处理散列文件
/tmp/hashes.txt 含全部口令散列,等同于高敏感数据。用完立即 shred -u 删除。
bash
shred -u /tmp/hashes.txt /tmp/weak.txt 2>/dev/null1
4. 强制策略:让弱口令设不进去
bash
cat >/etc/security/pwquality.conf.d/99-weak.conf <<'EOF'
minlen = 12
dcredit = -1
ucredit = -1
lcredit = -1
ocredit = -1
minclass = 3
maxrepeat = 3
dictcheck = 1
usercheck = 1
enforce_for_root
EOF1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
usercheck=1 禁止口令包含用户名,dictcheck=1 启用字典检查。
失败锁定(见身份鉴别篇的 pam_faillock):
bash
cat /etc/security/faillock.conf 2>/dev/null1
5. 存量清零:强制首次登录改密
bash
# 批量设置口令立即过期
for u in $(awk -F: '$3>=1000 && $3<65534 {print $1}' /etc/passwd); do
chage -d 0 "$u" && echo "$u 下次登录必须改口令"
done1
2
3
4
2
3
4
服务组件口令整改:
bash
# Redis 设置认证并绑定内网
sed -i 's/^# requirepass.*/requirepass StrongRedisPass2026!/' /etc/redis/redis.conf
sed -i 's/^bind .*/bind 10.0.1.20 127.0.0.1/' /etc/redis/redis.conf
systemctl restart redis
redis-cli -h 10.0.1.20 -a 'StrongRedisPass2026!' ping1
2
3
4
5
2
3
4
5
redis-cli -a 会把口令留在 shell 历史
用 redis-cli --askpass 或先 export REDISCLI_AUTH 并在操作后 unset,同时清理 ~/.bash_history。
bash
mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass2026!';"
mysql -e "DELETE FROM mysql.user WHERE authentication_string=''; FLUSH PRIVILEGES;"1
2
2
6. 默认口令与硬编码清零
bash
grep -rInE '(password|passwd|pwd)\s*[:=]\s*["'"'"']?(admin|123456|root|test|default|changeme)' \
--exclude-dir={.git,node_modules} /opt /srv 2>/dev/null | head -201
2
2
命中项一律改为从密钥中心读取。
7. 持续监测
bash
# 登录失败趋势(爆破迹象)
journalctl -u sshd --since "1 day ago" | grep -c "Failed password"
lastb | head -10
# 空口令与已过期账号
awk -F: '$2=="" {print $1}' /etc/shadow
chage -l root | grep -E 'Password expires'1
2
3
4
5
6
2
3
4
5
6
建议接入告警:单 IP 5 分钟内失败 >20 次即告警。
验证
bash
# 弱口令应被拒绝
passwd opsuser <<<"123456
123456" 2>&1 | tail -2
# 复杂度配置生效
grep -E 'minlen|usercheck|dictcheck' /etc/security/pwquality.conf.d/99-weak.conf
# 服务认证已开启
redis-cli -h 10.0.1.20 ping 2>&1 | head -1 # 应提示 NOAUTH
curl -s -m 3 -o /dev/null -w '%{http_code}\n' http://10.0.1.30:9200 # 期望 401/000
# 扫描结果清零
hydra -L /tmp/user.txt -P /tmp/weak.txt -t 4 ssh://10.0.1.10 2>/dev/null | grep -c "login:"1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
判定标准:弱口令字典扫描无命中;密码策略强制生效;中间件均已开启认证;失败登录有告警。
常见坑
扫描并发过高打挂生产服务
hydra -t 64 会把 SSH/Redis 打崩,也可能触发账号锁定影响业务。必须低并发 + 变更窗口。
只改策略不改存量
login.defs/pwquality 只约束新口令。存量弱口令必须用 chage -d 0 强制改。
中间件默认无认证被忽略
Redis/MongoDB/ES 默认无口令是最常见的入侵入口。上线检查清单里必须有这一项。
口令改了但写在配置文件里没同步
会导致服务起不来。改口令前先确认所有引用点,或从一开始就走密钥中心。
哈希字典文件留在服务器
/tmp/hashes.txt 必须 shred 删除,否则等于给攻击者送字典。