SSH 操作晋级:防范暴力破解与中间人攻击的核心技巧

SSH 操作晋级:防范暴力破解与中间人攻击的核心技巧

引言:SSH 两大致命威胁的 “隐蔽性”

你可能以为 “改了 SSH 端口、用了密钥登录” 就高枕无忧,但这两大攻击仍能突破防线:

暴力破解:黑客用工具每秒尝试数十组密码 / 密钥,即使是强密码,也可能被 “字典 + 算力” 攻破;更隐蔽的是 “分布式暴力破解”—— 多 IP 轮询尝试,绕过单 IP 封禁;中间人攻击:黑客拦截 SSH 通信(如公共 WiFi 环境),伪造服务器身份,窃取登录凭证甚至篡改数据;由于用户常忽略 “主机指纹验证”,这类攻击成功率极高。

这两类攻击的核心危害在于:暴力破解直接获取服务器权限,中间人攻击则 “悄无声息” 地窃取敏感信息。本文的核心技巧,正是针对这两类攻击的 “薄弱环节”—— 暴力破解的 “尝试频率 + 认证方式”,中间人攻击的 “身份验证 + 通信加密”,构建多层防御体系。

一、先搞懂:两种攻击的原理与突破口

在动手配置前,先明确攻击逻辑,才能针对性防御:

1. 暴力破解的原理(3 种常见类型)

攻击类型

原理

突破口

密码暴力破解

遍历字典(弱密码 + 常见组合)尝试登录

开启密码登录、弱密码、无尝试次数限制

密钥暴力破解

尝试破解无 Passphrase 的私钥,或遍历公钥

私钥无 Passphrase、公钥未限制使用范围

分布式暴力破解

多 IP 轮询尝试,绕过单 IP 封禁

无 IP 白名单、封禁策略仅针对单 IP

2. 中间人攻击的原理(核心流程)

客户端发起 SSH 连接请求(目标服务器 IP:10.0.0.10);中间人拦截请求,伪装成 “客户端” 连接真实服务器,获取服务器主机指纹;中间人同时伪装成 “服务器”(使用伪造的指纹)响应客户端,建立双向通信;客户端与服务器的所有数据均经中间人转发,黑客可窃取密码 / 密钥,甚至篡改命令。

突破口:客户端未严格验证服务器指纹、SSH 协议支持弱加密、未使用证书认证。

二、核心技巧:防范暴力破解(三重防护体系)

针对暴力破解的 “尝试频率、认证方式、IP 来源”,从工具拦截、认证限制、IP 管控三个维度构建防御。

技巧 1:用 fail2ban 自动封禁攻击 IP(基础拦截)

fail2ban 是防范暴力破解的 “必备工具”—— 通过监控 SSH 日志,识别连续失败登录行为,自动封禁攻击 IP。关键是自定义规则,应对分布式破解

实战步骤(CentOS 7 为例):

安装 fail2ban

# CentOS(需EPEL源)

sudo yum install epel-release -y

sudo yum install fail2ban -y

# Ubuntu/Debian

# sudo apt install fail2ban -y

自定义 SSH 防护规则(抗分布式破解)

复制默认配置文件,避免直接修改原文件:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

sudo vim /etc/fail2ban/jail.local

找到[sshd]模块,添加以下配置:

[sshd]

enabled = true

port = 2222  # 你的SSH端口(非默认22需修改)

filter = sshd[mode=aggressive]  # 启用激进模式,拦截密钥尝试失败

logpath = /var/log/secure  # CentOS日志路径(Ubuntu为/var/log/auth.log)

maxretry = 3  # 单IP连续3次失败封禁

bantime = 86400  # 封禁24小时(分布式破解建议设为7*86400=7天)

findtime = 600  # 10分钟内触发封禁(缩短时间,减少尝试次数)

ignoreip = 192.168.1.0/24 10.0.0.5  # 信任IP段/IP(办公网、运维IP)

# 自定义动作:封禁IP的同时,添加到IP黑名单集合(抗分布式)

action = iptables-multiport

         iptables-allports[chain=SSH_BLACKLIST,action=REJECT,blocktype=DROP,ipsetname=sshd_blacklist]

         # 可选:添加钉钉告警(攻击时实时通知)

         /etc/fail2ban/action.d/dingtalk.sh <ip> <port> <name>

配置钉钉告警(实时发现攻击)

创建告警脚本/etc/fail2ban/action.d/dingtalk.sh:

#!/bin/bash

WEBHOOK=”https://oapi.dingtalk.com/robot/send?access_token=你的钉钉机器人Token”

IP=$1

PORT=$2

SERVICE=$3

TIME=$(date “+%Y-%m-%d %H:%M:%S”)

# 发送Markdown告警

curl -s -H “Content-Type: application/json” -X POST -d '{

  “msgtype”:”markdown”,

  “markdown”:{

    “title”:”SSH暴力破解告警”,

    “text”:”### SSH暴力破解告警

    “**攻击IP**:'$IP'

    “**目标端口**:'$PORT'

    “**服务**:'$SERVICE'

    “**时间**:'$TIME'

    “**处理**:IP已封禁24小时,建议检查是否为分布式攻击”

  }

}' $WEBHOOK

赋予执行权限:

sudo chmod +x /etc/fail2ban/action.d/dingtalk.sh

启动并验证

sudo systemctl start fail2ban

sudo systemctl enable fail2ban

# 查看SSH防护状态(确认已启用)

sudo fail2ban-client status sshd

# 输出示例:Currently banned: 2(当前封禁2个IP)

避坑指南:

误封信任 IP:若ignoreip未包含办公网,可能误封运维 IP,需及时解封:

sudo fail2ban-client set sshd unbanip 192.168.1.100  # 解封指定IP

分布式破解绕过:若发现多个 IP 来自同一网段(如 203.0.113.0/24),手动封禁网段:

sudo iptables -A INPUT -s 203.0.113.0/24 -p tcp –dport 2222 -j DROP

技巧 2:限制 SSH 认证方式与尝试次数(源头防御)

暴力破解的前提是 “有足够的尝试机会” 和 “支持弱认证方式”,需通过sshd_config从源头限制。

实战配置(sshd_config):

禁用密码登录(核心!切断密码暴力破解路径)

sudo vim /etc/ssh/sshd_config

PasswordAuthentication no  # 禁用密码登录

ChallengeResponseAuthentication no  # 禁用挑战响应(如密码问答)

PubkeyAuthentication yes  # 仅启用密钥/证书认证

限制认证尝试次数(减少单 IP 尝试机会)

MaxAuthTries 3  # 连续3次认证失败断开连接(默认6次,需减少)

MaxSessions 5    # 单个用户最大会话数(防止多会话并行尝试)

禁用空密码与 root 直接登录

PermitEmptyPasswords no  # 禁用空密码

PermitRootLogin no       # 禁用root直接登录(需通过普通用户sudo提权)

重启生效并验证

sudo sshd -t  # 验证配置无错误

sudo systemctl restart sshd

# 验证密码登录已禁用:用密码尝试登录,提示Permission denied

ssh -o PreferredAuthentications=password ops@10.0.0.10

技巧 3:防火墙 IP 白名单(精准管控来源)

即使 fail2ban 被绕过,防火墙白名单仍能 “拦截非信任 IP 的连接请求”,适合 “仅办公网 / 特定 IP 需登录” 的场景。

实战步骤(iptables 为例):

清空旧规则,添加白名单

# 1. 清空现有SSH相关规则(谨慎!生产环境先备份)

sudo iptables -F INPUT -p tcp –dport 2222

# 2. 允许办公网(192.168.1.0/24)和运维IP(10.0.0.5)访问

sudo iptables -A INPUT -p tcp –dport 2222 -s 192.168.1.0/24 -m state –state NEW,ESTABLISHED -j ACCEPT

sudo iptables -A INPUT -p tcp –dport 2222 -s 10.0.0.5 -m state –state NEW,ESTABLISHED -j ACCEPT

# 3. 拒绝其他所有IP访问SSH端口

sudo iptables -A INPUT -p tcp –dport 2222 -j REJECT –reject-with icmp-port-unreachable

# 4. 保存规则(CentOS)

sudo service iptables save

# Ubuntu:sudo iptables-save > /etc/iptables/rules.v4

云服务器额外配置(安全组)

阿里云 / 腾讯云需在 “安全组” 中同步配置白名单(优先级高于主机防火墙):

入方向规则:仅允许 192.168.1.0/24 和 10.0.0.5 访问 2222 端口;删除默认的 “0.0.0.0/0” 规则(允许所有 IP 访问)。

三、核心技巧:防范中间人攻击(信任体系构建)

中间人攻击的核心是 “伪造身份” 和 “拦截通信”,防御需从 “身份验证” 和 “通信加密” 两方面入手,构建可信的 SSH 连接。

技巧 1:严格验证服务器主机指纹(基础信任)

SSH 首次连接时会显示服务器 “主机指纹”,这是服务器的 “唯一标识”—— 若指纹被篡改,说明可能存在中间人攻击。必须手动验证指纹,而非直接输入 yes

实战步骤:

获取服务器真实指纹(线下 / 可信通道)

先通过 “可信通道”(如服务器控制台、本地机房登录)获取真实指纹:

# 在服务器本地执行,获取ED25519指纹(推荐算法)

ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key.pub

# 输出示例:256 SHA256:abc123xyz… root@server (ED25519)

客户端首次连接时验证指纹

客户端连接服务器时,SSH 会显示指纹,需与真实指纹对比:

ssh ops@10.0.0.10 -p 2222

# 输出提示(需核对指纹):

The authenticity of host '[10.0.0.10]:2222 ([10.0.0.10]:2222)' can't be established.

ED25519 key fingerprint is SHA256:abc123xyz…  # 对比此指纹与真实指纹

Are you sure you want to continue connecting (yes/no/[fingerprint])?  # 仅在指纹一致时输入yes

配置 StrictHostKeyChecking(强制验证)

避免用户 “习惯性输入 yes”,通过sshd_config或客户端config强制验证指纹:

# 客户端配置(~/.ssh/config)

vim ~/.ssh/config

Host *

  StrictHostKeyChecking yes  # 指纹不匹配时拒绝连接(而非提示)

  UserKnownHostsFile ~/.ssh/known_hosts  # 存储可信指纹的文件

效果:若服务器指纹被篡改(中间人伪造),客户端直接拒绝连接,提示 “Host key verification failed”。

技巧 2:使用 SSH 证书认证(替代指纹,企业级信任)

传统指纹验证依赖 “手动核对”,易出错;SSH 证书认证通过 “CA(证书颁发机构)” 签发服务器 / 客户端证书,自动验证身份,从根本上防范中间人攻击。

实战步骤(衔接前文 CA 体系):

服务器部署 CA 签发的服务器证书

确保服务器已配置由信任 CA 签发的证书(参考前文 “SSH 证书认证系统搭建”):

# 服务器sshd_config配置

sudo vim /etc/ssh/sshd_config

HostCertificate /etc/ssh/ssh_host_ed25519_key-cert.pub  # 服务器证书

TrustedUserCAKeys /etc/ssh/ca_cert.pub  # CA根证书(信任CA)

客户端使用 CA 签发的客户端证书登录

客户端通过 “私钥 + 客户端证书” 登录,自动验证服务器证书合法性:

# 客户端登录命令(无需手动核对指纹)

ssh -i ~/.ssh/id_ed25519_ops -i ~/.ssh/id_ed25519_ops-cert.pub ops@10.0.0.10 -p 2222

原理:客户端用 CA 根证书验证服务器证书的签名,若服务器证书由信任 CA 签发且未过期,自动建立连接;否则拒绝(中间人无法伪造 CA 签名的证书)。

技巧 3:禁用弱协议与加密算法(防通信拦截)

中间人攻击可能利用弱协议(如 SSHv1)或弱加密算法(如 3DES)破解通信数据,需强制使用安全的协议和算法。

实战配置(sshd_config):

仅启用 SSHv2 协议

Protocol 2  # 禁用漏洞频发的SSHv1

禁用弱加密算法(仅保留安全算法)

# 加密算法(优先AES-GCM/ChaCha20,抗量子计算)

Ciphers -3des-cbc,aes128-cbc,aes192-cbc,arcfour

Ciphers aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr

# MAC算法(防数据篡改,仅保留SHA-2系列)

MACs -hmac-md5,hmac-sha1,hmac-sha1-96

MACs hmac-sha2-256,hmac-sha2-512,hmac-sha2-256-etm@openssh.com

# 密钥交换算法(防中间人攻击,优先椭圆曲线算法)

KexAlgorithms -diffie-hellman-group1-sha1,diffie-hellman-group14-sha1

KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256

验证算法配置

# 查看服务器支持的算法(确认无弱算法)

ssh -Q cipher 10.0.0.10 -p 2222

ssh -Q mac 10.0.0.10 -p 2222

技巧 4:监控 SSH 握手异常日志(及时发现攻击)

中间人攻击会留下 “指纹不匹配”“证书验证失败” 等日志,需定期监控并告警。

实战步骤:

开启 SSH 详细日志

sudo vim /etc/ssh/sshd_config

LogLevel VERBOSE  # 记录详细握手日志

sudo systemctl restart sshd

筛选异常日志(CentOS 为例)

# 筛选指纹不匹配的日志(中间人攻击特征)

sudo grep “Host key verification failed” /var/log/secure

# 筛选证书验证失败的日志

sudo grep “Certificate invalid” /var/log/secure

配置日志告警(脚本化)

创建监控脚本/usr/local/bin/ssh-mitm-monitor.sh:

#!/bin/bash

WEBHOOK=”https://oapi.dingtalk.com/robot/send?access_token=你的Token”

# 监控指纹不匹配日志

if grep -q “Host key verification failed” /var/log/secure; then

  IP=$(grep “Host key verification failed” /var/log/secure | tail -1 | awk '{print $11}')

  TIME=$(date “+%Y-%m-%d %H:%M:%S”)

  curl -s -H “Content-Type: application/json” -X POST -d '{

    “msgtype”:”markdown”,

    “markdown”:{

      “title”:”SSH中间人攻击告警”,

      “text”:”### SSH中间人攻击告警

      “**异常IP**:'$IP'

      “**时间**:'$TIME'

      “**原因**:主机指纹验证失败,可能存在中间人攻击”

    }

  }' $WEBHOOK

fi

定时执行(crontab):

*/10 * * * * /usr/local/bin/ssh-mitm-monitor.sh  # 每10分钟检查一次

四、最佳实践:两种攻击的 “多层防御” 组合方案

单一技巧无法完全抵御攻击,需结合场景构建组合防御:

1. 中小企业 / 个人服务器(轻量方案)

防范暴力破解:fail2ban(封禁 IP + 告警)+ 禁用密码登录 + 防火墙白名单;防范中间人攻击:StrictHostKeyChecking=yes + 禁用弱算法 + 日志监控。

2. 企业级服务器(全面方案)

防范暴力破解:fail2ban(抗分布式)+ 证书认证(禁用密钥暴力尝试)+ 云安全组白名单;防范中间人攻击:SSH CA 证书认证(自动验证身份)+ 强算法加密 + ELK 日志集中监控(实时告警)。

五、避坑指南:高频防御失误与解决方案

fail2ban 未拦截密钥暴力破解

原因:默认 filter 未监控密钥尝试失败日志,需启用aggressive模式;

解决方案:filter = sshd[mode=aggressive](在 jail.local 中配置)。

StrictHostKeyChecking 导致自动化脚本失败

原因:脚本连接新服务器时,指纹未在 known_hosts 中,强制验证导致脚本卡住;

解决方案:对脚本专用 IP 配置宽松验证(仅脚本服务器使用):

# 客户端config配置

Host script-server  # 脚本专用服务器

  StrictHostKeyChecking accept-new  # 首次连接自动接受指纹,后续验证

证书认证仍提示指纹验证

原因:服务器同时启用了 “传统指纹认证” 和 “证书认证”,客户端优先验证指纹;

解决方案:在服务器sshd_config中禁用传统主机密钥(仅保留证书):

# 注释掉传统主机密钥配置(如RSA、ECDSA)

# HostKey /etc/ssh/ssh_host_rsa_key

# HostKey /etc/ssh/ssh_host_ecdsa_key

# 仅保留证书对应的ED25519主机密钥

HostKey /etc/ssh/ssh_host_ed25519_key

HostCertificate /etc/ssh/ssh_host_ed25519_key-cert.pub

总结:SSH 安全的核心是 “信任 + 拦截”

防范暴力破解的关键是 “减少攻击机会”—— 通过 IP 封禁、认证限制、白名单,让黑客 “无从尝试”;

防范中间人攻击的关键是 “建立可信连接”—— 通过指纹验证、证书认证、强加密,让黑客 “无法伪造”。

建议定期执行以下检查,确保防御生效:

检查 fail2ban 状态,确认攻击 IP 已封禁;随机抽查服务器指纹,确认与本地 known_hosts 一致;查看 SSH 日志,确认无 “指纹不匹配”“证书无效” 等异常。

通过本文的核心技巧,你可构建一套 “拦截攻击 + 可信连接” 的 SSH 安全体系,彻底抵御暴力破解与中间人攻击。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
疯狂的野猪在的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容