🔐 SSH安全配置完全指南:3分钟让你的服务器固若金汤

Lear 2025-08-05 10:00:00
Categories: > > Tags:

🔐 SSH安全配置完全指南:3分钟让你的服务器固若金汤

运维老司机必看:每天有数万次SSH暴力破解攻击,你的服务器还在”裸奔”吗?

🚨 触目惊心的数据

刚部署的新服务器,不到10分钟就遭遇了第一次SSH暴力破解!看看我的真实监控数据:

1
2
# 查看失败登录记录  
grep "Failed password" /var/log/auth.log \| head -5

结果让人震惊

🎯 本文核心价值

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. 分层防护策略

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分):证书认证 + 双因子 + 监控