AI 检测攻击 → Slack 确认 → 自动在防火墙中添加封禁规则的机制已搭建完成

AI 检测攻击 → Slack 确认 → 自动在防火墙中添加封禁规则的机制已搭建完成

3 min read

2026.04 / 技术博客 / BASTION

AI 检测攻击 → Slack 确认 → 自动在防火墙中添加封禁规则 #

我们在 BASTION 原有的“检测 → 通知”流程中新增了“自动响应”功能。当 AI 检测到端口扫描时,会在 Slack 上发布封禁提案;经人工批准后,封禁规则会立即添加到 OPNsense 防火墙中。24 小时后自动解除。

仅靠检测与通知是不够的 #

此前 BASTION 的工作方式是分析日志以检测异常,并通过 Slack 发出通知(参见第一篇)。但通知之后的动作——即在防火墙中封禁攻击源 IP——此前需要人工手动打开 OPNsense 管理控制台进行操作。

凌晨 3 点收到通知,第二天早上登录后才执行封禁。在这 6 个小时里,攻击者可以自由地进行扫描。

为此,我们在 BASTION 中实现了反应式防御。当 AI 检测到攻击时,会自动提出添加防火墙封禁的提案,在 Slack 上批准后即可立即将规则应用到 OPNsense。

不过,我们并没有立即将其做成完全自动化。赋予 AI 修改防火墙规则的权限,存在因误判而封禁正常流量的风险。我们先采用 Slack 审批把关的方式(“AI 提案 → 人工批准 → 执行”),待积累一定成果后再逐步引入自主化。

整体流程 #

步骤 执行主体 操作内容
1. 攻击检测 analyze.sh(每 15 分钟) 通过日志分析检测端口扫描与暴力破解尝试,严重程度标记为 HIGH
2. 封禁提案 propose-block.sh 白名单检查 → 去重 → 将提案发布到 Slack
3. 人工批准 运维人员 Slack 命令:@OpenClaw-Monitor approve block-XXXXX
4. 执行封禁 fw-action.sh 通过 OPNsense API 将 IP 添加到 Alias(BASTION_AutoBlock)
5. 自动解除 auto-expire.sh(每小时定时任务) 24 小时后将 IP 从 Alias 中移除

实际运行情况 #

1. 封禁提案发布到 Slack #

当每 15 分钟一次的常规分析检测到 severity: HIGH 时,会自动向 Slack 发布针对攻击源 IP 的封禁提案。

incoming-webhook 13:31

🛡️ 封禁提案 [block-20260423-003]

攻击源 IP:xxx.xxx.119.51
检测原因:port_scan — 3,003 次封禁/失败
严重程度:HIGH
自动解除:24 小时后

批准:@OpenClaw-Monitor approve block-20260423-003
拒绝:@OpenClaw-Monitor reject block-20260423-003

※ 若 30 分钟内无响应,将自动拒绝。

incoming-webhook 13:31

🛡️ 封禁提案 [block-20260423-004]

攻击源 IP:xxx.xxx.47.173
检测原因:port_scan — 977 次封禁/失败
严重程度:HIGH
自动解除:24 小时后

incoming-webhook 13:31

🛡️ 封禁提案 [block-20260423-005]

攻击源 IP:xxx.xxx.102.23
检测原因:port_scan — 965 次封禁/失败
严重程度:HIGH
自动解除:24 小时后

每次分析最多发布 3 条提案。按封禁次数由多到少选取排名靠前的 IP。

2. 批准后立即反映到防火墙 #

在 Slack 上发送批准命令后,fw-action.sh 会调用 OPNsense API,将该 IP 添加到封禁列表中。

运维人员 13:37
@OpenClaw-Monitor approve block-20260423-003
incoming-webhook 13:37

✅ 封禁执行完成 [block-20260423-003]
IP:xxx.xxx.119.51
自动解除:2026-04-24T13:37:14+09:00

在 OPNsense 一侧,该 IP 会被添加到名为 BASTION_AutoBlock 的 Alias 中。系统预先配置了引用该 Alias 的 WAN 封禁规则,因此通过 API 将 IP 加入 Alias 后,封禁会立即生效。

3. 24 小时后自动解除 #

auto-expire.sh 通过每小时执行一次的定时任务,自动移除已到期的封禁。

incoming-webhook 00:00

⏰ 自动解除:xxx.xxx.119.51(已过 24 小时)

如果同一 IP 在解除后再次进行扫描,将在下一次分析中重新被提出封禁提案。

安全机制 #

由于是通过 AI 来自动化防火墙操作,因此需要有安全机制来防止误判导致封禁正常流量。我们实现了 5 层防御。

层级 内容 目的
白名单 内部 IP、DNS、公司全局 IP 永不封禁 防止封禁自身流量
Slack 审批把关 执行前由人工确认(初期阶段) 捕捉 AI 的误判
速率限制 每小时最多封禁 10 次 防止异常的大量封禁
自动解除 24 小时后自动移除封禁 即使误判也能自动恢复
紧急清空 可通过 Slack 即时移除所有封禁 业务受到影响时可紧急回滚

白名单匹配的实现 #

白名单匹配使用 Python 的 ipaddress 模块实现,支持 CIDR 表示法(如 10.0.0.0/8),并通过内置检查自动排除私有 IP、回环地址、链路本地地址、组播地址与保留地址。

# Whitelist matching flow
1. Built-in check: is_private / is_loopback / is_link_local / is_multicast / is_reserved
2. File matching: Check each line in block-whitelist.txt (single IP or CIDR)
3. Result: exit 0=block prohibited / exit 1=block allowed

OPNsense API 集成 #

封禁机制本身是一个 OPNsense Alias(IP 地址组)。我们预先创建一个名为“BASTION_AutoBlock”的 Alias,并配置一条以该 Alias 为来源的 WAN 封禁规则。

# Add IP (execute block)
curl -k -u "${API_KEY}:${API_SECRET}" \
  -X POST "${OPNSENSE}/api/firewall/alias_util/add/BASTION_AutoBlock" \
  -d '{"address":"attack_source_ip"}'

# Remove IP (remove block)
curl -k -u "${API_KEY}:${API_SECRET}" \
  -X POST "${OPNSENSE}/api/firewall/alias_util/delete/BASTION_AutoBlock" \
  -d '{"address":"attack_source_ip"}'

alias_util 会直接操作运行时表,因此仅需一次 API 调用即可立即生效,无需重新加载防火墙规则。

审计日志 #

所有的封禁、解除、批准、拒绝以及超时都会被记录到审计日志中。

2026-04-23 13:31:33 [PROPOSE] new block-20260423-003 ip=xxx.xxx.119.51 reason=port_scan count=3003
2026-04-23 13:37:14 [BLOCK]   approved block-20260423-003 ip=xxx.xxx.119.51 expires=2026-04-24T13:37:14
2026-04-24 00:00:03 [EXPIRE]  auto-expire block-20260423-003 ip=xxx.xxx.119.51 api=done

可通过标签([PROPOSE] / [BLOCK] / [EXPIRE] 等)进行 grep,仅提取特定操作。

逐步自主化 #

目前我们采用的是 Slack 审批把关的方式,但在设计上支持随着成果的积累逐步实现自主化。

阶段 模式 迁移条件
阶段 1(当前) Slack 审批把关 —
阶段 2 条件性自主 高置信度 + 达到一定封禁次数以上 → 自动执行。否则仍走审批把关
阶段 3 完全自主 连续 3 个月误判率低于 0.1%

为什么要循序渐进? #

在 BASTION 开发过程中,我们遇到过 LLM 出现幻觉、“捏造出并不存在的事件”的情况。有一个账户被报告“被锁定 18 次”,但日志中实际的事件数量为零。如果当时就已经实现了反应式防御,我们可能就会因为这些幽灵攻击而误封 IP。正是这段经历,成为我们决定“执行前先由人工确认”这一设计的依据。

Slack 审批把关的局限性已经显现 #

在通过 OpenClaw 进行 Slack 批准的过程中,我们也遇到过 LLM 在批处理中未能执行部分命令、却报告“已完成”的情况。只要中间存在基于 agent 的 LLM,这种不确定性在结构上就无法避免。而在完全自动化(直接的 analyze.sh → propose-block.sh → fw-action.sh 流水线)中,由于绕过了 LLM 的回复生成环节,这个问题就不会出现。

总结 #

BASTION 的反应式防御实现了“日志分析 → 封禁提案 → Slack 批准 → OPNsense API 封禁 → 24 小时自动解除”这一流程的全自动化。白名单、审批把关、速率限制、自动解除、紧急清空这 5 层安全机制,将误判带来的业务影响降到最低。

目前我们仍以 Slack 审批把关的方式运行,但今后会不断积累成果数据,逐步引入自主化。此前止步于“检测 → 通知”的监控系统,如今已在“检测 → 判断 → 响应 → 自动解除”这一完整闭环中运转。

BASTION 是一项在隔离环境中实现 AI 安全监控的服务。

BASTION 服务页面
联系我们

Updated on 2026年6月9日

What are your feelings

  • Happy
  • 常规
  • Sad

©2020 BESTNET.LLC . All Rights Reserved.