无法直接在Linux原生SSH中建立威胁情报库,因sshd仅支持静态访问控制且无API查询能力;需通过日志分析、规则引擎(如fail2ban)与防火墙联动实现情报驱动的动态封禁。

直接建立“基于威胁情报的 SSH 访问库”在 Linux 原生 SSH 服务中并不可行——SSH 守护进程(sshd)本身不支持动态加载外部威胁情报(如恶意 IP 列表、ASN 标签或 IOC 指标),也不具备实时查询威胁情报 API 的能力。它只处理静态访问控制(如 AllowUsers、Match Address)、密钥认证和协议层配置。真正的威胁情报联动,必须靠外围系统协同实现。
SSH 本身能做的:静态白名单与基础过滤
sshd 可通过以下方式实施确定性访问控制,这是后续情报联动的基础:
-
按 IP 或网段硬限制:在
/etc/ssh/sshd_config中使用AllowUsers user@192.168.1.0/24或Match Address 203.0.113.42+AllowUsers admin,仅放行已知可信源; -
按用户+来源组合控制:
Match User deploy后接AllowTcpForwarding no和ForceCommand /usr/local/bin/deploy.sh,实现最小权限落地; -
禁用高危通道:关闭
PasswordAuthentication、PermitRootLogin、X11Forwarding,消除多数自动化攻击面。
真正接入威胁情报:靠日志+规则引擎+防火墙联动
威胁情报要起效,需把“谁在扫端口、谁在爆破、谁来自已知黑产 ASN”转化为可执行动作。典型路径是:
-
采集 SSH 登录日志:解析
/var/log/auth.log或/var/log/secure中的Failed password、Invalid user、reverse mapping等模式; -
关联情报源:用脚本或工具(如
fail2ban+ 自定义正则 +abuseipdbAPI 或threatbook开放接口)比对失败 IP 是否出现在公开黑名单、扫描器指纹库或近期攻击聚合列表中; -
自动封禁落地:将确认恶意的 IP 写入
iptables、nftables或云平台安全组,例如:iptables -I INPUT -s 198.51.100.12 -j DROP; - 定期刷新与清理:设置 TTL(如 72 小时封禁),避免误杀;同时订阅
FireHOL IPset、Emerging Threats等权威 IP 黑名单,每日更新本地防火墙规则。
轻量级实战建议:Fail2ban + 自定义 jail
无需重写 SSH,就能让威胁情报快速生效:
- 安装 fail2ban 后,在
/etc/fail2ban/jail.local中新增一个 jail: - 启用
sshd默认规则,并追加自定义 filter,匹配日志中含 “Bad protocol version identification” 或 “Connection closed by authenticating user” 等异常握手行为; - 配置
action = iptables[ipset=blacklist],再配合定时任务每天从https://www.blocklist.de/lists/ssh.txt下载最新攻击 IP,导入 ipset; - 最终效果:新 IP 首次暴力尝试即触发封禁,已知扫描网段(如某 IDC 的 /24)在启动时就被预加载拦截。
进阶方向:集中式情报驱动访问控制
若需企业级能力,可构建简化的“SSH 访问决策中心”:
- 用
rsyslog将所有服务器 auth 日志转发至中央 ELK 或 Loki; - 用
Logstash或Vector提取源 IP、用户名、时间戳、失败原因,并打上地理、ASN、信誉分(来自 MISP 或商业 TI 平台)标签; - 编写轻量策略引擎(Python + SQLite),当某 IP 在 5 分钟内失败 ≥10 次,且 ASN 属于已知矿池或代理池时,自动调用 Ansible 更新各节点防火墙;
- 关键点:不修改 sshd,而是让外围控制层“替它做判断”,既保持 SSH 稳定,又获得情报响应能力。


















