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 安全体系,彻底抵御暴力破解与中间人攻击。
















暂无评论内容