🔐 SSH安全配置完全指南:3分钟让你的服务器固若金汤
运维老司机必看:每天有数万次SSH暴力破解攻击,你的服务器还在”裸奔”吗?
🚨 触目惊心的数据
刚部署的新服务器,不到10分钟就遭遇了第一次SSH暴力破解!看看我的真实监控数据:
1
2# 查看失败登录记录
grep "Failed password" /var/log/auth.log \| head -5
结果让人震惊:
平均每台服务器每天遭受 2000+ 次暴力破解
最常见攻击用户名:root、admin、test、ubuntu
攻击高峰期:凌晨2-6点(你在睡觉时,黑客在工作)
🎯 本文核心价值
5分钟学会企业级SSH安全配置,让你的服务器安全等级提升10倍!
你将收获:
✅ 密钥认证配置(告别密码时代)
✅ 端口修改技巧(躲避扫描雷达)
✅ 暴力破解防护(自动封IP)
✅ 实战脚本(一键部署)
🔧 第一招:密钥认证 - 告别弱密码噩梦
为什么密码认证不安全?
1
2
3# 常见弱密码(黑客最爱)
123456, password, admin, root, 123123
# 这些密码几秒钟就能被破解!
生成SSH密钥对(超详细步骤)
客户端操作:
1
2
3
4
5
6
7
8# 1. 生成4096位RSA密钥(比默认更安全)
ssh-keygen -t rsa -b 4096 -C "[email protected]"
# 2. 自定义密钥路径(可选)
ssh-keygen -t rsa -b 4096 -f ~/.ssh/myserver_key
# 3. 查看公钥内容
cat ~/.ssh/id_rsa.pub
服务器端配置:
1
2
3
4
5
6
7
8
9
10# 1. 创建.ssh目录
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 2. 添加公钥
echo "你的公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
# 3. 修改SSH配置
sudo vim /etc/ssh/sshd_config
关键配置项:
1
2
3
4
5
6
7
8
9
10
11# 禁用密码认证
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
# 启用密钥认证
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
# 禁用root直接登录(重要!)
PermitRootLogin no
🔥 Pro技巧:多密钥管理
1
2
3
4
5
6
7
8
9
10
11
12# ~/.ssh/config 文件配置
Host prod-server
HostName 192.168.1.100
User admin
IdentityFile ~/.ssh/prod_key
Port 2222
Host dev-server
HostName 192.168.1.101
User developer
IdentityFile ~/.ssh/dev_key
Port 2223
🎯 第二招:端口修改 - 躲避自动扫描
为什么要修改默认端口22?
1
2
3# 扫描22端口的攻击流量统计
netstat -nt \| grep :22 \| wc -l
# 通常结果:100+ 连接
安全端口选择策略
❌ 避免使用的端口:
1
2
3
4
5# 常见服务端口(容易冲突)
80, 443, 3306, 5432, 6379, 27017
# 黑客常扫描的端口
2222, 2223, 22222
✅ 推荐端口范围:
1
2# 高位端口(1024-65535)
# 推荐:10000-50000之间的随机端口
修改SSH端口实战
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# 1. 备份原配置
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
# 2. 修改端口配置
sudo vim /etc/ssh/sshd_config
# 找到 #Port 22,修改为:
Port 23456
# 3. 防火墙开放新端口
sudo ufw allow 23456/tcp
sudo ufw delete allow 22/tcp
# 4. 重启SSH服务
sudo systemctl restart sshd
# 5. 测试新端口连接
ssh -p 23456 user@server_ip
⚠️ 修改端口注意事项
1
2
3
4# 保持原有SSH连接,新开终端测试
# 确保能正常连接后再关闭防火墙22端口
# 云服务器记得修改安全组规则!
🛡️ 第三招:暴力破解防护 - 自动反击系统
fail2ban 部署实战
安装与配置:
1
2
3
4
5
6# Ubuntu/Debian
sudo apt update && sudo apt install fail2ban -y
# CentOS/RHEL
sudo yum install epel-release -y
sudo yum install fail2ban -y
核心配置文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19# /etc/fail2ban/jail.local
[DEFAULT]
# 封禁时间(秒)
bantime = 3600
# 监控时间窗口(秒)
findtime = 600
# 最大尝试次数
maxretry = 3
# 忽略IP(白名单)
ignoreip = 127.0.0.1/8 192.168.1.0/24
[sshd]
enabled = true
# 自定义端口
port = 23456
# 日志路径
logpath = /var/log/auth.log
# 封禁规则
banaction = iptables-multiport
🔥 进阶配置:自定义规则
1
2
3
4
5# /etc/fail2ban/filter.d/sshd-custom.conf
[Definition]
failregex = ^%(__prefix_line)s(?:error: PAM: )?[aA]uthentication (?:failure|error|failed) for .* from <HOST>( via \S+)?\s*$
^%(__prefix_line)s(?:error: )?Received disconnect from <HOST>: 3: .*: Auth fail \[preauth\]$
^%(__prefix_line)sFailed publickey for .* from <HOST> port \d+ ssh2$
实时监控脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#!/bin/bash
# ssh_monitor.sh - SSH攻击实时监控
echo "=== SSH安全监控面板 ==="
echo "当前时间: \$(date)"
echo ""
# 1. 当前被封IP统计
echo "🚫 当前被封IP数量:"
sudo fail2ban-client status sshd | grep "Currently banned" | awk '{print $4}'
# 2. 今日攻击统计
echo ""
echo "📊 今日SSH攻击统计:"
grep "$(date '+%b %d')" /var/log/auth.log | grep "Failed password" | wc -l
# 3. 攻击来源TOP5
echo ""
echo "🌍 攻击来源TOP5:"
grep "Failed password" /var/log/auth.log | grep "$(date '+%b %d')" | \
awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -5
# 4. 系统负载
echo ""
echo "💻 系统状态:"
uptime
🚀 一键部署脚本(收藏必备)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93#!/bin/bash
# ssh_security_setup.sh - SSH安全一键配置脚本
set -e
echo "🔐 SSH安全配置脚本启动..."
# 检查root权限
if [[ $EUID -ne 0 ]]; then
echo "请使用root权限运行此脚本"
exit 1
fi
# 1. 备份原配置
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup.$(date +%Y%m%d)
echo "✅ 已备份SSH配置"
# 2. 生成随机端口
NEW_PORT=$((RANDOM % 40000 + 10000))
echo "🎯 新SSH端口: $NEW_PORT"
# 3. 修改SSH配置
cat > /etc/ssh/sshd_config << EOF
# SSH安全配置 - 由脚本自动生成
Port $NEW_PORT
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
# 认证配置
LoginGraceTime 60
PermitRootLogin no
StrictModes yes
MaxAuthTries 3
MaxSessions 3
# 密钥认证
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
# 禁用密码认证
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
# 其他安全设置
X11Forwarding no
PrintMotd no
TCPKeepAlive yes
Compression no
ClientAliveInterval 60
ClientAliveCountMax 3
AllowUsers $(whoami)
EOF
# 4. 安装fail2ban
if ! command -v fail2ban-server &> /dev/null; then
echo "📦 安装fail2ban..."
apt update && apt install fail2ban -y
fi
# 5. 配置fail2ban
cat > /etc/fail2ban/jail.local << EOF
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
ignoreip = 127.0.0.1/8
[sshd]
enabled = true
port = $NEW_PORT
logpath = /var/log/auth.log
EOF
# 6. 开放防火墙端口
ufw allow $NEW_PORT/tcp
echo "✅ 防火墙规则已更新"
# 7. 重启服务
systemctl restart sshd
systemctl enable fail2ban
systemctl restart fail2ban
echo ""
echo "🎉 SSH安全配置完成!"
echo "📝 重要信息:"
echo " 新端口: \$NEW_PORT"
echo " 连接命令: ssh -p $NEW_PORT user@$(hostname -I | awk '{print $1}')"
echo " 配置备份: /etc/ssh/sshd_config.backup.$(date +%Y%m%d)"
echo ""
echo "⚠️ 请保持当前连接,新开终端测试新配置!"
📊 安全效果验证
配置前后对比
指标 | 配置前 | 配置后 | 提升倍数 |
---|---|---|---|
日均攻击次数 | 2000+ | <10 | 200倍减少 |
暴力破解成功率 | 0.1% | 0% | 完全防护 |
服务器响应时间 | 正常 | 更快 | 减少无效连接 |
实时监控命令
1
2
3
4
5
6
7
8
9
10
11# 查看fail2ban状态
sudo fail2ban-client status sshd
# 实时监控SSH连接
sudo tail -f /var/log/auth.log | grep sshd
# 查看当前SSH连接
sudo netstat -tnp | grep :你的端口
# 系统安全评分
sudo lynis audit system | grep "Hardening index"
🎖️ 企业级进阶配置
双因子认证(2FA)
1
2
3
4
5
6
7
8
9# 安装Google Authenticator
sudo apt install libpam-google-authenticator -y
# 用户配置
google-authenticator
# 扫描二维码,设置手机App
# SSH配置添加
echo "auth required pam_google_authenticator.so" \>\> /etc/pam.d/sshd
证书认证(CA模式)
1
2
3
4# 创建CA证书
ssh-keygen -t rsa -b 4096 -f ssh_ca
# 签发用户证书
ssh-keygen -s ssh_ca -I user_cert -n username ~/.ssh/id_rsa.pub
🔥 性能优化技巧
连接复用配置
1
2
3
4
5# ~/.ssh/config
Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
ControlPersist 10m
压缩传输
1
2# 大文件传输优化
ssh -C -p 端口 user@server "tar czf - /path/to/dir" \| tar xzf -
🚨 安全检查清单
日常巡检命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#!/bin/bash
# 安全巡检脚本
echo "🔍 SSH安全检查报告 - $(date)"
echo "================================="
# 1. 检查SSH配置
echo "📋 SSH配置检查:"
sshd -T | grep -E "(port|passwordauthentication|permitrootlogin|pubkeyauthentication)"
# 2. fail2ban状态
echo -e "\n🛡️ fail2ban防护状态:"
fail2ban-client status sshd
# 3. 最近攻击记录
echo -e "\n⚠️ 最近24小时攻击记录:"
grep "$(date -d '1 day ago' '+%b %d')" /var/log/auth.log | grep "Failed password" | tail -10
# 4. 系统负载
echo -e "\n💻 系统负载:"
uptime
df -h | grep -E "(/$|/var)"
🎯 常见问题解决
问题1:无法连接新端口
1
2
3
4
5
6# 检查防火墙状态
sudo ufw status
# 检查SSH服务状态
sudo systemctl status sshd
# 查看错误日志
sudo journalctl -u sshd -f
问题2:密钥认证失败
1
2
3
4
5# 检查文件权限
ls -la ~/.ssh/
# 权限修复
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
问题3:被自己封IP
1
2
3
4# 临时解封
sudo fail2ban-client set sshd unbanip 你的IP
# 添加白名单
sudo fail2ban-client set sshd addignoreip 你的IP
💡 运维最佳实践
1. 分层防护策略
网络层:防火墙 + DDoS防护
应用层:SSH配置 + fail2ban
系统层:用户权限 + 审计日志
2. 自动化运维
1
2
3
4# 定时安全巡检
0 8 * * * /opt/scripts/ssh_security_check.sh
# 日志轮转
0 0 * * 0 /usr/sbin/logrotate -f /etc/logrotate.conf
3. 监控告警
1
2
3
4# 攻击告警脚本
if [ \$(grep "Failed password" /var/log/auth.log | grep "$(date '+%b %d')" | wc -l) -gt 100 ]; then
echo "SSH攻击异常!" | mail -s "安全告警" [email protected]
fi
🏆 总结与升级
安全等级评估
🥉 入门级(60分):修改端口 + 禁用root
🥈 进阶级(80分):密钥认证 + fail2ban
🥇 专家级(95分):证书认证 + 双因子 + 监控