ozan2003/sdn_intrusion_mitigation

GitHub: ozan2003/sdn_intrusion_mitigation

一个基于SDN的自动化入侵检测与缓解系统,用于实时检测网络威胁并自动实施OpenFlow反制措施。

Stars: 0 | Forks: 0

# 基于SDN的自动化入侵检测与缓解系统 一个概念验证系统,能够通过 Suricata 检测网络威胁(SYN洪泛攻击、端口扫描),并自动在 Ryu 控制器管理的 SDN 骨干交换机上安装 OpenFlow 丢弃/限速规则。 ## 前置条件 - Linux(已在 Linux Mint 22 上测试) - [Mininet](http://mininet.org/) - [Open vSwitch](https://www.openvswitch.org/) (全局安装,非虚拟环境中) - [Suricata](https://suricata.io/) >= 6 (全局安装,非虚拟环境中) - Python >= 3.12 - [uv](https://docs.astral.sh/uv/) (推荐)或 pip ## 设置 ``` git clone cd sdn_threat_detection ``` ### 方式 A:uv(推荐) ``` uv sync ``` ### 方式 B:pip ``` python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt pip install -r requirements-dev.txt # linters, test runner ``` ### 验证系统工具 ``` ovs-vsctl --version suricata --build-info mn --version ``` ## 使用方法 ### 运行完整演示 ``` sudo ./src/scripts/start.sh ``` 此操作将: 1. 清理任何残留的 Mininet/Suricata 状态。 2. 在后台启动 Ryu 控制器。 3. 启动 Mininet 拓扑,配置 OVS 镜像 + VLAN,启动 Suricata。 4. 进入 Mininet 命令行界面。 ### 仅可视化拓扑 ``` .venv/bin/python3 src/scripts/visualize_topo.py ``` 此操作将在 Matplotlib 窗口中打开拓扑图,而不启动 Ryu、Mininet 运行时服务或 Suricata。 ### 模拟攻击 从 Mininet 命令行界面: ``` # SYN 洪水攻击 (每秒200个数据包,持续30秒) mininet> hacker .venv/bin/python3 src/scripts/syn_flood.py 10.0.3.10 -d 30 -p 200 # 端口扫描 (端口1-1024) mininet> hacker .venv/bin/python3 src/scripts/port_scan.py 10.0.3.10 -s 1 -e 1024 # ICMP 洪水攻击 (每秒200个数据包,持续30秒) mininet> hacker .venv/bin/python3 src/scripts/icmp_flood.py 10.0.3.10 -d 30 -p 200 # UDP 洪水攻击针对 DNS 端口53 (每秒200个数据包,持续30秒) mininet> hacker .venv/bin/python3 src/scripts/udp_flood.py 10.0.3.10 -P 53 -d 30 -p 200 # 水平扫描 (单个端口,多个主机) mininet> hacker .venv/bin/python3 src/scripts/horizontal_scan.py -P 22 10.0.3.10 10.0.3.20 10.0.3.30 # ARP 欺骗模式 (从 Mininet 提供实时受害主机 MAC 地址) mininet> hacker .venv/bin/python3 src/scripts/arp_spoof.py --victim-a-ip 10.0.3.10 --victim-a-mac --victim-b-ip 10.0.3.20 --victim-b-mac -d 30 -p 10 # MAC 洪泛模式 (大量 ARP 流量) mininet> hacker .venv/bin/python3 src/scripts/mac_flood.py -i hacker-eth0 -T 10.0.3.10 -d 30 -p 500 # SSH 暴力破解流量模式桩 (仅重复 TCP 连接尝试) mininet> hacker .venv/bin/python3 src/scripts/ssh_bruteforce_stub.py 10.0.3.10 -a 200 -r 10 ``` ### SDN 平面演示(控制/数据平面) SDN 平面演示(控制平面 `PACKET_IN` 压力和数据平面流表压力)直接记录在 `src/scripts/mac_flood.py` 中。 在几秒钟内,Suricata 应将警报写入 `logs/` 目录,Ryu 控制器会监控 `logs/eve.json`,并可能在骨干交换机 `s1_omurga` 上实施缓解措施。下面的小节详细解释了如何逐层验证。 ### 验证检测与缓解 在此设计中,检测与执行是分离的: - **Suricata** 监听镜像接口(在 `ids/suricata.yaml` 中配置为 `mirror0`),**仅记录**警报。它不会在实际数据路径上丢弃数据包(被动 IDS,而非在线 IPS)。 - **Ryu** 读取这些警报,并针对已知签名 ID,向 **`s1_omurga`**(数据通路 ID 为 `1`)发送 **OpenFlow 1.3** 的 `FlowMod` / `MeterMod` 消息。这才是实际的缓解措施。大多数规则在 Internet VLAN(`15`)上匹配攻击者的**源 IPv4 地址**,但 ARP/MAC 签名通过丢弃 **ARP**(可选限定于特定 VLAN)来缓解。 将验证视为三层:Suricata 日志、控制器日志,然后是交换机流水线。 #### 1. Suricata:证明 IDS 看到了流量 以下所有路径均相对于**项目根目录**(即运行 `sudo ./src/scripts/start.sh` 的目录)。`start.sh` 会在每次运行时截断部分日志,以便您看到该会话的清晰片段。 | 日志文件 | 作用 | |----------|------| | `logs/eve.json` | JSON 行格式:包含 `event_type: "alert"` 记录,记录中有 `src_ip`, `dest_ip`, `proto`, `alert.signature_id` 等字段。是自动化处理和匹配控制器读取内容的最佳来源。 | | `logs/fast.log` | 每个警报一行(传统的 Suricata 快速日志)。便于人工快速查看(`tail -f`, `grep`)。 | | `logs/suricata.log` | 引擎和统计消息,日志级别已配置。 | | `logs/suricata_stderr.log` | Suricata 进程的启动/运行时错误。 | **示例**(在攻击期间或之后,从另一个终端,在仓库根目录执行): 如果 `eve.json` 和 `fast.log` 显示有警报,但交换机上未发生任何变化,说明 Suricata 工作正常;请继续检查第 2 层和第 3 层。 #### 2. Ryu:证明控制器做出了反应 `start.sh` 使用 `--log-file logs/ryu.log` 启动 Ryu。在 Suricata 将匹配的警报追加到 `logs/eve.json` 后,控制器应记录: - 一条包含签名文本、源、目的和 SID 的 **`ALERT:`** 行。 - 一条 **`DROP 规则已安装`**、**`RATE-LIMIT 规则已安装`** 或 **`DROP ARP 规则已安装`**(来自 `FlowManager`)的消息,具体取决于 SID 和控制器对该警报的处理逻辑。 **示例:** ``` tail -f logs/ryu.log grep -E 'ALERT:|DROP rule|DROP ARP rule|RATE-LIMIT rule' logs/ryu.log ``` **缓解措施映射**(仅 `src/controller/alert_parser.py` 中 `_SID_ACTION_MAP` 列出的 SID 会触发 OpenFlow 缓解):SYN洪泛、ICMP洪泛、UDP洪泛和 HTTP 速率滥用使用**限速**;端口扫描、水平扫描、SSH暴力破解存根、HTTP SQLi URI 和 Web 端口扫描使用**丢弃**。ARP欺骗(`sid:1000006`)和 MAC 洪泛(`sid:1000007`)由控制器作为特殊情况处理:它在 Internet VLAN 上安装一条 **DROP ARP** 缓解流。 **重复警报**将被忽略,直到缓解措施的**硬超时**(默认在 `FlowManager` 中为 300 秒)到期。对于大多数签名,去重键是攻击者的 `src_ip`。对于 ARP/MAC 签名,控制器按区域(Internet VLAN)去重,因为这些模式无法可靠地归属于一个稳定的源 IP。 **如果 Ryu 记录了 `ALERT` 但从未安装规则**,请检查 `logs/ryu.log` 中是否有 **`s1_omurga (dpid=1) not connected`**。缓解措施仅应用于该数据通路。 #### 3. Open vSwitch:证明数据平面存在规则 日志可以显示意图;**`ovs-ofctl`** 则显示 OVS 实际持有的内容。以 **root** 身份从任意工作目录运行: ``` ovs-ofctl -O OpenFlow13 dump-flows s1_omurga ovs-ofctl -O OpenFlow13 dump-meters s1_omurga ``` - **丢弃缓解**:查找优先级为 **`100`**(缓解优先级)的流,匹配字段包括 **`ipv4_src=<攻击者IP>`**(L3/L4 攻击)或 **`eth_type=0x0806`**(基于 ARP 的攻击),可选地限定于 Internet 区域的 VLAN,**无转发动作**(匹配该流的数据包将不会被输出)。 - **限速缓解**:在优先级 `100` 上采用相同的匹配模式,另外 **`dump-meters`** 应列出流引用的一个**计量表**(控制器以配置的 kbps 速率安装一个丢弃带)。 在攻击前后进行比较:当缓解措施触发时,应出现新的高优先级流或计量表;在流**硬超时**过后(除非流量使条目保持相关),它们应消失。 #### 4. 端到端健全性检查 从 Mininet 中,在缓解措施(尤其是**丢弃**)实施后,当规则生效时,来自被阻止源地址、发往受监控目标的流量可能会停滞或失败;几分钟后(默认硬超时),除非有新的警报到达,否则行为应恢复正常。 ### 停止 在 Mininet 命令行界面中输入 `exit`。`start.sh` 的 EXIT 陷阱会终止 Suricata、Ryu 控制器,并运行 `mn -c`。 ## 开发 ### 使用 uv ``` uv run ruff check uv run ty check uv run pytest ``` ### 使用 pip(在已激活的虚拟环境中) ``` ruff check ty check pytest ``` ## 参考文献 - 计算机网络 Kim, J., Seo, M., Lee, S., Nam, J., Yegneswaran, V., Porras, P., Gu, G., & Shin, S. (2024). Enhancing security in SDN: Systematizing attacks and defenses from a penetration perspective. Computer Networks, 241, 110203.
标签:ICMP洪泛攻击, Metaprompt, Mininet, OpenFlow, Ryu控制器, SDN安全, Suricata, SYN洪泛攻击, UDP洪泛攻击, 入侵检测系统, 安全数据湖, 实时攻击检测, 插件系统, 攻击模拟, 数据统计, 流量监控, 现代安全运营, 端口扫描, 网络威胁检测, 网络安全, 网络防护, 自动化缓解, 规则自动化, 软件定义网络, 逆向工具, 隐私保护, 驱动签名利用