方法一:修改默认SSH端口 🔧

这是最基础但最有效的防护手段之一。

# 编辑SSH配置文件
sudo vim /etc/ssh/sshd_config

# 修改端口号(建议使用1024-65535之间的端口)
Port 2022

# 重启SSH服务
sudo systemctl restart sshd

为什么有效?

  • • 99%的自动化攻击工具只扫描默认22端口

  • • 仅此一步就能过滤掉95%以上的暴力破解尝试

运维小贴士: 选择端口时避免使用常见服务端口(如80、443、3306等),推荐使用4位数端口。

方法二:禁用密码登录,启用密钥认证 🔐

密钥认证是目前最安全的SSH认证方式。

生成SSH密钥对

# 客户端生成密钥对
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

# 将公钥复制到服务器
ssh-copy-id -p 2022 user@server_ip

配置服务器禁用密码登录

# 编辑SSH配置
sudo vim /etc/ssh/sshd_config

# 禁用密码认证
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

# 重启服务
sudo systemctl restart sshd

安全级别提升: 从密码的10^8种可能性提升到2048位RSA密钥的2^2048种可能性,几乎不可能被暴力破解。

方法三:配置Fail2ban动态防护 🛡️

Fail2ban是一个实时监控和自动封禁恶意IP的神器。

安装配置Fail2ban

# Ubuntu/Debian
sudo apt install fail2ban

# CentOS/RHEL
sudo yum install fail2ban

创建SSH防护配置

# 创建自定义配置文件
sudo vim /etc/fail2ban/jail.local

[sshd]
enabled = true
port = 2022
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600

实战效果: 配置后,任何IP在10分钟内尝试登录失败3次,将被自动封禁1小时。

常用管理命令

# 查看封禁状态
sudo fail2ban-client status sshd

# 手动解封IP
sudo fail2ban-client set sshd unbanip 192.168.1.100

# 查看封禁日志
sudo fail2ban-client get sshd banip

方法四:设置SSH登录白名单 📝

通过iptables或云服务商安全组限制SSH访问来源。

使用iptables配置

# 清空现有规则(谨慎操作)
sudo iptables -F

# 允许本地访问
sudo iptables -A INPUT -i lo -j ACCEPT

# 允许已建立的连接
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 只允许特定IP访问SSH
sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 2022 -j ACCEPT

# 拒绝其他SSH连接
sudo iptables -A INPUT -p tcp --dport 2022 -j DROP

# 保存规则
sudo iptables-save > /etc/iptables/rules.v4

适用场景: 固定办公网络环境,或通过VPN访问的场景。

方法五:启用双因子认证(2FA) 🔒

即使密钥被泄露,2FA也能提供额外保护层。

安装Google Authenticator

# Ubuntu/Debian
sudo apt install libpam-google-authenticator

# CentOS/RHEL
sudo yum install google-authenticator

配置2FA

# 运行配置向导
google-authenticator

# 编辑PAM配置
sudo vim /etc/pam.d/sshd

# 添加以下行
auth required pam_google_authenticator.so

修改SSH配置

sudo vim /etc/ssh/sshd_config

# 启用挑战响应认证
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive

用户体验: 登录时需要输入手机APP生成的6位动态验证码,安全性大幅提升。

方法六:配置SSH连接限制 ⚡

通过限制连接数和超时时间,降低暴力破解成功率。

sudo vim /etc/ssh/sshd_config

# 限制最大连接数
MaxSessions 3
MaxStartups 3:30:10

# 设置连接超时
ClientAliveInterval 300
ClientAliveCountMax 2

# 限制登录时间
LoginGraceTime 30

# 限制用户
AllowUsers admin operator
DenyUsers root guest

# 重启服务
sudo systemctl restart sshd

参数说明:

  • • MaxSessions: 单个连接的最大会话数

  • • MaxStartups: 并发未认证连接的最大数量

  • • ClientAliveInterval: 服务器向客户端发送心跳的间隔

  • • LoginGraceTime: 用户登录的最长时间

方法七:部署SSH蜜罐监控 🍯

高级防护手段,用于监控和分析攻击行为。

使用Cowrie蜜罐

# 克隆项目
git clone https://github.com/cowrie/cowrie.git
cd cowrie

# 安装依赖
pip install -r requirements.txt

# 配置蜜罐
cp etc/cowrie.cfg.dist etc/cowrie.cfg
vim etc/cowrie.cfg

# 修改配置
[ssh]
listen_endpoints = tcp:2222:interface=0.0.0.0

监控脚本示例

#!/bin/bash
# 实时监控SSH登录尝试

tail -f /var/log/auth.log | while read line; do
    if echo "$line" | grep -q "Failed password"; then
        ip=$(echo "$line" | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}')
        echo "$(date): 检测到暴力破解尝试,来源IP: $ip" >> /var/log/ssh_attacks.log
        
        # 发送告警(可接入钉钉、企业微信等)
        curl -X POST "https://your-webhook-url" \
             -d "{'text': 'SSH攻击告警: $ip 正在尝试暴力破解'}"
    fi
done

🎯 终极安全配置模板

基于以上方法,这是我在生产环境中使用的SSH终极安全配置:

# /etc/ssh/sshd_config 最佳实践配置

# 基础安全配置
Port 2022
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

# 认证配置
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
PermitRootLogin no
AuthenticationMethods publickey

# 连接限制
MaxAuthTries 3
MaxSessions 3
MaxStartups 3:30:10
LoginGraceTime 30
ClientAliveInterval 300
ClientAliveCountMax 2

# 用户限制
AllowUsers admin operator
DenyUsers root guest nobody

# 其他安全选项
X11Forwarding no
AllowTcpForwarding no
GatewayPorts no
PermitTunnel no
Banner /etc/ssh/banner.txt
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐