SSH安全加固的必要性
SSH是Linux服务器最核心的远程管理通道,也是外部攻击者首选的突破口。根据多个安全研究机构的统计,互联网上暴露的SSH服务每分钟遭受数千次自动化扫描和暴力破解尝试。默认配置的SSH服务——密码认证、默认端口22、root远程登录——在公网环境下面临极高的被入侵风险。
服务器安全加固不是一次性动作,而是一个覆盖认证、网络层、运行时监控的纵深防御体系。以下方案从五个维度系统化加固SSH安全。
密钥认证替代密码认证
密码认证面临暴力破解和字典攻击的持续威胁。密钥认证基于非对称加密,私钥不通过网络传输,从根本上消除了暴力破解的可能性。
密钥生成与配置:
# 生成Ed25519密钥对(推荐,比RSA更短更安全)
ssh-keygen -t ed25519 -C "admin@yunthe.com" -f ~/.ssh/id_ed25519
# 将公钥部署到目标服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub matao@server-ip
# 禁用密码认证,编辑/etc/ssh/sshd_config
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
# 重启SSH服务
systemctl restart sshd
密钥管理的关键实践:私钥文件权限必须为600,禁止复制到非受控设备;为不同服务器使用不同密钥对,避免单密钥泄露导致全盘失守;密钥passphrase不要为空,丢失私钥文件时多一层保护。
SSH服务配置深度优化
sshd_config中有多项安全相关的配置容易被忽略:
# /etc/ssh/sshd_config 安全加固配置
# 禁止root远程登录
PermitRootLogin no
# 限制可登录用户
AllowUsers matao deploy
# 修改默认端口(降低自动化扫描命中率)
Port 2222
# 登录超时设置
LoginGraceTime 30
MaxAuthTries 3
MaxSessions 5
# 禁用不必要的认证方式
KbdInteractiveAuthentication no
GSSAPIAuthentication no
HostbasedAuthentication no
# 禁用端口转发(不需要时)
AllowTcpForwarding no
X11Forwarding no
AllowAgentForwarding no
# 空密码禁止登录
PermitEmptyPasswords no
# 日志级别设为VERBOSE便于审计
LogLevel VERBOSE
这些配置项组合使用,能够将SSH服务的攻击面压缩到最小。修改端口不能替代其他安全措施,但能有效减少日志噪音和自动化攻击的干扰。
网络层访问控制
即使SSH认证配置完善,网络层的限制仍然必不可少。攻击者无法连接,就无法尝试认证。
iptables/nftables防火墙规则:
# 仅允许管理网段访问SSH端口
iptables -A INPUT -p tcp --dport 2222 -s 10.0.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 2222 -j DROP
# 或使用nftables
nft add rule ip filter input tcp dport 2222 ip saddr 10.0.1.0/24 accept
nft add rule ip filter input tcp dport 2222 drop
云服务器还需要配合安全组策略,在VPC层面限制SSH端口的入站来源。安全组和系统防火墙构成双层网络防护。
Fail2ban自动封禁暴力破解IP
对于必须开放公网访问的SSH服务,Fail2ban是必备的入侵防御工具:
# 安装Fail2ban
apt install fail2ban -y
# 创建自定义配置 /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 600
bantime = 3600
action = iptables[name=SSH, port=2222, protocol=tcp]
Fail2ban监控认证日志,连续失败3次即封禁IP一小时。对于高价值服务器,bantime可设为86400(24小时)甚至更长。配合防火墙的连接速率限制(connlimit模块),可以进一步抵御分布式暴力破解。
SSH登录监控与告警
加固完成后,持续监控同样重要。每次SSH登录成功都应该触发告警,确保管理员能实时感知异常登录行为:
# /etc/profile.d/ssh-notify.sh
# SSH登录时发送通知
if [ -n "$SSH_CONNECTION" ]; then
LOGIN_IP=$(echo $SSH_CONNECTION | awk '{print $1}')
LOGIN_TIME=$(date '+%Y-%m-%d %H:%M:%S')
HOSTNAME=$(hostname)
# 发送到Webhook(企业微信/钉钉/飞书)
curl -s -X POST "https://webhook.example.com/notify" \
-H "Content-Type: application/json" \
-d "{\n \"text\": \"SSH Login Alert\",\n \"content\": \"Host: ${HOSTNAME}\nIP: ${LOGIN_IP}\nTime: ${LOGIN_TIME}\nUser: ${USER}\"\n }" &>/dev/null
fi
这套监控方案能够在第一时间发现非授权登录——无论是密钥泄露还是其他漏洞导致的入侵。收到非预期登录告警时,应当立即检查服务器状态,必要时隔离并启动应急响应流程。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-ssh-an-quan-jia-gu-shi-zhan-cong-mi-yao-ren/