SSH是Linux服务器远程管理的核心通道,也是攻击者最常利用的入侵入口。默认SSH配置存在密码认证弱、端口暴露、无登录限制等问题,暴力破解攻击在公网服务器上每小时可达数千次。服务器安全加固需要从SSH配置优化、密钥认证、入侵检测三个层面构建防护体系。Fail2ban通过监控日志自动封禁异常IP,是SSH入侵检测的常用方案。
SSH服务安全风险评估与加固思路
SSH安全风险主要来自三个方面:弱密码导致的暴力破解、默认端口22被自动化扫描工具批量探测、以及root账户直接暴露带来的提权风险。加固策略遵循最小权限原则:禁用密码认证、限制root登录、修改默认端口、配置IP白名单、部署自动封禁机制。
加固前的基线评估很重要。通过分析SSH日志了解当前攻击态势:
# 统计SSH暴力破解尝试次数
grep "Failed password" /var/log/auth.log | wc -l
# 查看攻击来源IP分布
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -20
# 检查成功登录的IP(确认无异常)
grep "Accepted" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn
如果Failed password记录超过数百条/天,说明服务器已暴露在自动化扫描中,必须尽快完成加固。
SSH配置文件关键参数调优
SSH服务端配置文件位于/etc/ssh/sshd_config,关键安全参数如下:
# /etc/ssh/sshd_config 安全加固配置
Port 22222
PermitRootLogin no
PasswordAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
PubkeyAuthentication yes
HostKeyAlgorithms rsa-sha2-512,rsa-sha2-256,ecdsa-sha2-nistp521
AllowUsers deploy admin
AllowGroups sshusers
LoginGraceTime 30
MaxAuthTries 3
MaxSessions 2
ClientAliveInterval 300
ClientAliveCountMax 2
X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no
LogLevel VERBOSE
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org
修改配置后先验证语法再重启服务,避免配置错误导致无法登录:
sshd -t
systemctl restart sshd
Port修改为非标准端口后,连接时需指定端口号:ssh -p 22222 user@server。此操作能有效减少90%以上的自动化扫描流量。
SSH密钥认证配置与密码登录禁用
密钥认证使用非对称加密,安全性远高于密码认证。Ed25519密钥是目前推荐的密钥类型,相比RSA更短更快更安全:
# 客户端生成Ed25519密钥对
ssh-keygen -t ed25519 -C "admin@workstation" -f ~/.ssh/server_ed25519
# 将公钥上传到服务器
ssh-copy-id -i ~/.ssh/server_ed25519.pub -p 22222 deploy@server
# 或手动添加公钥
cat ~/.ssh/server_ed25519.pub | ssh -p 22222 deploy@server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
密钥认证配置完成后,先测试能否用密钥登录,确认成功后再在sshd_config中禁用PasswordAuthentication。如果密钥登录失败就禁用密码认证,会导致服务器被锁死无法访问。
密钥安全同样需要管理。建议为每台服务器使用不同密钥对,避免一把钥匙开所有锁。密钥文件权限必须为600:
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh/
chmod 600 ~/.ssh/server_ed25519
对于多人管理同一台服务器的情况,使用SSH CA签名证书替代静态密钥。CA签名证书支持过期时间和权限限制,比静态密钥更安全:
# 服务器端配置CA信任
TrustedUserCAKeys /etc/ssh/ca.pub
# 客户端用CA签发用户证书
ssh-keygen -s ~/.ssh/ca_key -I "deploy-access" -n deploy -V +1w ~/.ssh/deploy_ed25519.pub
Fail2ban安装配置与入侵检测规则
Fail2ban通过扫描系统日志,匹配预定义的失败模式,自动将频繁失败的IP加入iptables封禁列表。安装与基本配置:
# 安装Fail2ban
apt update && apt install fail2ban -y
# 主配置文件 /etc/fail2ban/jail.local
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
banaction = iptables-multiport
destemail = admin@yunthe.com
sender = fail2ban@yunthe.com
mta = sendmail
action = %(action_mwl)s
[sshd]
enabled = true
port = 22222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
配置参数说明:bantime=3600表示封禁1小时,findtime=600表示10分钟内失败3次触发封禁。对高安全性场景,可以将bantime设为-1(永久封禁)或86400(封禁24小时)。
启动Fail2ban并验证:
systemctl enable fail2ban
systemctl start fail2ban
fail2ban-client status
fail2ban-client status sshd
Fail2ban自定义过滤规则与告警通知
除了SSH,Fail2ban还可以防护Nginx、MySQL等服务的暴力攻击。自定义过滤规则示例:
# /etc/fail2ban/filter.d/nginx-noscript.conf
[Definition]
failregex = ^<HOST> -.*GET .*\.(asp|exe|dll|bat|cmd).* HTTP.*$
ignoreregex =
# /etc/fail2ban/jail.local
[nginx-noscript]
enabled = true
port = http,https
filter = nginx-noscript
logpath = /var/log/nginx/access.log
maxretry = 2
bantime = 7200
对WordPress管理后台的暴力登录防护:
# /etc/fail2ban/filter.d/wp-login.conf
[Definition]
failregex = ^<HOST> -.*POST /wp-login.php.* HTTP.*$
ignoreregex =
[wp-login]
enabled = true
filter = wp-login
logpath = /var/log/nginx/access.log
maxretry = 5
bantime = 86400
findtime = 300
封禁通知配置。通过webhook发送到企业IM:
# /etc/fail2ban/action.d/notify.conf
[Definition]
actionstart = curl -s -X POST "https://hook.example.com/notify" -H "Content-Type: application/json" -d '{"text":"Fail2ban started"}'
actionban = curl -s -X POST "https://hook.example.com/notify" -H "Content-Type: application/json" -d '{"text":"Banned IP: <ip> service: <name>"}'
actionunban = curl -s -X POST "https://hook.example.com/notify" -H "Content-Type: application/json" -d '{"text":"Unbanned IP: <ip>"}'
SSH安全加固效果验证与监控
加固完成后,验证防护效果:
# 确认密码认证已禁用
ssh -p 22222 wrongpass@server
# 应提示: Permission denied (publickey)
# 用nmap扫描确认端口修改和算法限制
nmap -p 22222 -sV server
nmap --script ssh2-enum-algos -p 22222 server
# 查看Fail2ban封禁效果
fail2ban-client status sshd
# 使用ssh-audit工具进行完整安全审计
ssh-audit -p 22222 server
长期监控方面,建议将Fail2ban状态和SSH日志接入Prometheus监控。通过fail2ban-exporter采集封禁数据,设置告警规则:当日封禁IP数超过50或连续3天有同一IP段被封禁时触发告警,提示可能存在有针对性的攻击行为。
定期审查SSH配置也是必要的。OpenSSH版本更新可能引入新的安全选项或废弃不安全的算法。建议每季度执行一次ssh-audit审计,及时调整算法配置。对于不需要SSH访问的运维人员账户,及时清理authorized_keys和删除系统账户,减少攻击面。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-ssh-an-quan-jia-gu-yu-fail2ban-ru-qin-jian/