SSH暴力破解仍是服务器安全头号威胁
服务器安全加固的第一道防线是SSH访问控制。根据公开蜜罐数据,一台公网暴露22端口的Linux服务器平均每分钟遭受超过50次暴力破解尝试,弱密码机器被攻破的平均时间不到8小时。暴力破解成功后攻击者通常植入挖矿木马、建立持久化后门、横向移动内网,造成的损失远超服务器本身价值。
本文从SSH服务配置、认证策略、入侵检测三个层面,给出一套可直接落地的服务器安全加固方案。
SSH服务端核心安全配置
编辑/etc/ssh/sshd_config,逐项调整以下参数:
# 禁止root直接登录
PermitRootLogin no
# 禁用密码认证,仅允许密钥
PasswordAuthentication no
PubkeyAuthentication yes
# 限制可登录用户组
AllowGroups ssh-users
# 修改默认端口(降低自动扫描命中率)
Port 2222
# 禁用空密码
PermitEmptyPasswords no
# 限制认证尝试次数
MaxAuthTries 3
# 登录超时断开
LoginGraceTime 30
# 禁用不安全的转发功能
X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no
# 会话超时自动断开
ClientAliveInterval 300
ClientAliveCountMax 2
# 仅允许SSH协议版本2
Protocol 2
修改后执行sshd -t验证配置语法无误,再systemctl reload sshd生效。
密钥认证配置
客户端生成密钥对:
ssh-keygen -t ed25519 -C "deploy@prod-server" -f ~/.ssh/id_ed25519_prod
推荐ed25519而非RSA,同等安全强度下密钥更短、签名更快。将公钥上传到服务器:
ssh-copy-id -i ~/.ssh/id_ed25519_prod.pub -p 2222 user@server-ip
服务端确认~/.ssh/authorized_keys权限为600,~/.ssh目录权限为700。
Fail2Ban自动封禁暴力破解IP
Fail2Ban通过解析SSH日志识别失败登录模式,自动触发iptables/nftables封禁规则:
# CentOS/RHEL
yum install fail2ban fail2ban-firewalld
# Ubuntu/Debian
apt install fail2ban
创建本地配置覆盖默认值,/etc/fail2ban/jail.local:
[DEFAULT]
bantime = 86400
findtime = 600
maxretry = 3
banaction = firewallcmd-rich-rules
action = %(action_mwl)s
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/secure
maxretry = 3
bantime = 86400
参数解释:
– bantime:封禁时长,86400秒即24小时,对持续扫描的僵尸网络建议设更长
– findtime:检测窗口,600秒内触发maxretry次失败即封禁
– maxretry:最大重试次数,3次足够严格
启动服务:
systemctl enable fail2ban
systemctl start fail2ban
查看封禁状态:
fail2ban-client status sshd
两步验证与证书固定增强认证
在密钥认证基础上叠加Google Authenticator TOTP两步验证:
yum install google-authenticator # CentOS
apt install libpam-google-authenticator # Debian/Ubuntu
用户初始化:
google-authenticator -t -d -r3 -R30
# 扫描二维码绑定手机Authenticator应用
# 保存emergency scratch codes到安全位置
PAM配置,编辑/etc/pam.d/sshd,在文件顶部添加:
auth required pam_google_authenticator.so nullok
sshd_config启用ChallengeResponse认证:
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
此配置要求同时满足密钥认证和TOTP验证,单一因素泄露不会导致服务器被入侵。
SSH日志监控与入侵检测
1. 实时监控异常登录
使用journalctl持续监控SSH事件:
# 监控成功登录
journalctl -u sshd -f | grep "Accepted"
# 监控失败登录
journalctl -u sshd -f | grep "Failed"
# 统计今日失败登录IP Top10
journalctl -u sshd --since today | grep "Failed password" | \
awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -10
2. OSSEC/HIDS主机入侵检测
OSSEC是轻量级主机入侵检测系统,专注于日志分析和文件完整性校验:
# 安装OSSEC服务端
wget https://github.com/ossec/ossec-hids/releases/download/3.7.0/ossec-hids-3.7.0.tar.gz
tar xzf ossec-hids-3.7.0.tar.gz
cd ossec-hids-3.7.0
./install.sh
OSSEC对SSH的默认规则已覆盖:
– 多次认证失败(规则5710-5716)
– 非法用户尝试登录(规则5718)
– 认证成功后异常命令执行(规则5302)
触发告警后OSSEC通过邮件或Webhook通知运维人员。
网络层防护:防火墙与端口敲门
firewalld限制SSH来源
# 仅允许办公网段访问SSH
firewall-cmd --permanent --add-rich-rule='
rule family="ipv4" source address="10.0.1.0/24" \
port protocol="tcp" port="2222" accept'
# 拒绝其他所有来源
firewall-cmd --permanent --remove-port=2222/tcp
firewall-cmd --reload
Port Knocking端口敲门
对于极高安全要求的服务器,SSH端口默认关闭,只有按特定顺序访问一组端口后才临时开放:
yum install knockd
# /etc/knockd.conf
[openSSH]
sequence = 7000,8000,9000
seq_timeout = 15
command = /sbin/firewall-cmd --add-port=2222/tcp
tcpflags = syn
[closeSSH]
sequence = 9000,8000,7000
seq_timeout = 15
command = /sbin/firewall-cmd --remove-port=2222/tcp
tcpflags = syn
客户端敲门后连接:
knock server-ip 7000 8000 9000
ssh -p 2222 user@server-ip
# 用完后关闭
knock server-ip 9000 8000 7000
安全配置自查清单
逐项检查确认以下加固措施已生效:
1. SSH默认端口已修改,22端口已关闭
2. root直接登录已禁止
3. 密码认证已禁用,仅允许密钥
4. AllowGroups限制了可登录用户组
5. MaxAuthTries设为3次以内
6. Fail2Ban运行正常,封禁规则生效
7. 两步验证已启用(生产环境必选)
8. 防火墙规则限制SSH来源IP段
9. SSH日志监控告警链路正常
10. 定期轮换密钥对,清理离职人员authorized_keys
以上措施全部到位后,SSH暴力破解攻破概率趋近于零。唯一需要持续关注的是密钥泄露风险,建议每90天轮换一次密钥对,并对authorized_keys文件配置inotify监控变更。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-ssh-an-quan-jia-gu-yu-bao-li-po-jie-fang-hu/