anas-zero/fyp-honeypot-dashboard

GitHub: anas-zero/fyp-honeypot-dashboard

基于AWS EC2部署的AI增强型SSH蜜罐系统,通过六周真实攻击数据对比规则检测与无监督机器学习的性能,发现恶意流量主导下的「污染反转」现象,并附带Streamlit交互式威胁情报仪表盘。

Stars: 0 | Forks: 0

# 用于威胁情报的 AI 增强型 SSH 蜜罐 部署在 AWS EC2 上的实时 SSH 蜜罐,结合 Python 流水线,通过手动标记的真实数据对三种检测方法进行了基准测试。在连续部署的六周内,从 40 个国家/地区的 850 个唯一 IP 中捕获了 65,172 个真实攻击会话。 索尔福德大学,2025/26 学年,计算机科学与网络安全理学学士,毕业设计。 ## 目录 - [项目概述](#project-overview) - [核心发现:污染反转](#key-finding-contamination-inversion) - [系统架构](#architecture) - [技术栈](#tech-stack) - [仪表盘功能](#dashboard-features) - [攻击者聚类](#attacker-clusters) - [运行结果](#results) - [检测性能](#detection-performance) - [安装说明](#setup-instructions) - [仓库结构](#repository-structure) - [局限性](#limitations) - [致谢](#acknowledgements) - [许可证](#license) - [联系方式](#contact) ## 项目概述 本项目探讨了无监督机器学习在真实 SSH 蜜罐数据上能否优于基于规则的检测方法。我们在 AWS EC2 上部署了 Cowrie 蜜罐,置于两层防火墙之后,并持续运行了六周。它在面向公网的端口 22 上接受连接,同时将管理员的 SSH 访问限制在受控端口 2222 上。 Python 流水线每天通过 cron 于 UTC 时间 09:00 运行。它解析 Cowrie 的 JSON 日志,为每个会话构建 20 个行为特征,并并行运行三个检测模型:基于规则的启发式基线、Isolation Forest 和 Local Outlier Factor。输出结果按会话 ID 合并,供交互式 Streamlit 仪表盘使用,将原始发现转化为防御建议。 本仓库包含供参考的仪表盘应用程序代码。为了保护部署期间观察到的受损设备的 IP,捕获的攻击数据和身份验证凭据被保密处理。 ### 目标 - 在面向公网的蜜罐上大规模捕获实时 SSH 攻击流量 - 构建足够的行为特征以区分僵尸程序与非僵尸程序会话 - 对无监督机器学习与基于规则的检测方法进行基准测试 - 通过面向技术和非技术受众的交互式仪表盘展示结果 - 基于观察到的攻击者行为,生成具体的防御建议 ## 核心发现:污染反转 最核心的结果是当恶意流量主导数据集时出现的一种违反直觉的性能模式。 诸如 Isolation Forest 和 Local Outlier Factor 等无监督异常检测算法假设异常在统计上是罕见的。它们从大多数数据中学习什么是“正常”的,并将所有偏离这一大多数的数据标记为异常。 在此数据集中,95.8% 的会话是自动化僵尸程序流量(三秒内执行脚本命令的会话)。当机器学习模型在此数据上进行训练时,它们将僵尸程序行为视为常态,并开始将罕见的非僵尸程序会话(侦察扫描器、探测流量)标记为异常,同时让明显的僵尸程序攻击被视为正常通过。 一个仅 12 行代码的基于规则的基线在 F1 分数上比两种著名的机器学习算法高出四倍多。规则基线达到了 0.64 的 F1 分数。Isolation Forest 和 Local Outlier Factor 均只达到了 0.14 的 F1 分数。 这一发现建立在 Rehman 等人 (2025) 的研究基础之上,他们在合成数据上记录了该机制。本项目在真实的面向互联网的蜜罐流量上展示了同样的效应,并提出了两阶段检测(基于规则的过滤后对残留数据应用机器学习),作为在攻击流量占主导的对抗性环境中的实用解决方案。 ## 系统架构 ``` ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ │ │ │ │ │ │ Attackers │────▶│ Cowrie │────▶│ AI Pipeline │────▶│ Dashboard │ │ (port 22) │ │ (Docker) │ │ (3 detectors)│ │ (Streamlit) │ │ │ │ │ │ │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ AWS EC2 Local machine Ubuntu 22.04 + (CSVs synced via SCP) UFW + Security Groups ``` Cowrie SSH 蜜罐运行在 AWS EC2 (Ubuntu 22.04, t3.micro) 上的 Docker 容器中。UFW 阻止除 DNS、HTTP 和 HTTPS 之外的所有出站流量。AWS 安全组将端口 2222 上的管理员 SSH 访问限制为单一源 IP。端口 22 上的公共 Cowrie 接受所有传入连接。 一个 bash 脚本 (`run_pipeline.sh`) 每天通过 cron 执行。它拼接轮换的日志、解析会话、构建特征并并行运行所有三个检测器。结果按会话 ID 合并,并使用 K-Means 进行聚类。 本地运行的 Streamlit 仪表盘读取处理后的 CSV 文件,并渲染包含概述指标、异常检查、攻击者画像、地理映射和方法解释的五个选项卡。 ## 技术栈 ### 语言与运行时 - Python 3.10+,用于流水线、机器学习和仪表盘 - Bash,用于自动化和调度 - PowerShell,用于从 AWS 进行本地数据同步 ### 蜜罐 - Cowrie,一个中等交互式的 SSH 和 Telnet 蜜罐 - Docker,用于容器隔离 ### 机器学习与数据处理 - scikit-learn (Isolation Forest、Local Outlier Factor、K-Means) - pandas,用于特征工程和合并 - NumPy,用于数值计算 ### 可视化 - Streamlit,用于仪表盘框架 - Plotly,用于交互式图表和地图 - MaxMind GeoLite2,用于离线 GeoIP 查询 ### 基础设施与运维 - AWS EC2 (Ubuntu 22.04, t3.micro) - AWS 弹性 IP,用于静态公网地址 - UFW,用于主机级防火墙 - AWS 安全组,用于网络级防火墙 - Cron,用于计划任务执行流水线 - Git 和 GitHub,用于版本控制 ## 仪表盘功能 Streamlit 仪表盘包含五个选项卡,每个选项卡旨在回答不同的问题。 ### 概述 登录首页。展示核心统计数据(捕获的会话数、唯一 IP 数、观察到的国家数、僵尸程序流量百分比)、按行为类别划分的流量分布、显示被标记会话与正常会话比例的威胁级别条形图、包含可展开命令链的前五大最危险会话,以及带有颜色编码建议的威胁情报面板。 ### 异常 每个会话按异常分数排名,并带有根据标记模型(规则、Isolation Forest、LOF)进行筛选的过滤器。每个条目可展开以显示完整的命令链、攻击者元数据和判定理由。允许对模型输出进行直接可视化比较,并演示污染反转效应。 ### 攻击者画像 前 10 名最活跃的攻击者及其自动分类的行为类型。最常被尝试的凭据(用户名和密码)。展示四个 K-Means 聚类及其百分比和特征的攻击者类型细分。 ### 地图 由离线 MaxMind GeoLite2 数据库驱动的攻击来源 GeoIP 气泡图。气泡大小按会话计数调整,颜色按流量规模以从黄色到深红色的比例尺显示。查询在本地进行,不调用外部 API。 ### 解释 为非技术读者提供通俗易懂的方法论和推理过程。包含模型比较表(规则 vs Isolation Forest vs LOF)、消融研究结果以及解释 AI 流水线每个组件的七个可展开词汇表部分。 ## 攻击者聚类 使用行为特征的子集对完整数据集应用了 k=4 的 K-Means 聚类。以下聚类名称由仪表盘根据每个聚类的平均特征值动态分配。 | 聚类 | 会话数 | 占比 | 描述 | |---------|---------|---------:|-------------| | 自动化僵尸集群 | 64,949 | 99.70% | 在 3 秒内执行脚本命令的快速自动化会话。这是互联网大规模扫描活动的主体。 | | 侦察扫描器 | 101 | 0.16% | 运行系统枚举命令(`uname`、`whoami`、`/proc`)的会话。比僵尸集群更慢、更有条理。 | | 探测会话 | 93 | 0.14% | 命令活动不符合标准攻击模式的会话。可能是新型技术或人工主导的活动。 | | 载荷下载器 | 29 | 0.04% | 通过 `wget`、`curl` 或 `tftp` 获取外部载荷的会话。尽管是最小的聚类,但却是严重级别最高的攻击。 | 自动化僵尸集群的主导地位 (99.7%) 是导致污染反转的结构性原因。从无监督算法的角度来看,这个聚类就代表了整个数据集。 ## 运行结果 | 指标 | 数值 | |--------|------:| | 捕获的会话数 | 65,172 | | 唯一源 IP 数 | 850 | | 观察到的国家数 | 40 | | 部署天数 | 42 (6 周) | | 流水线正常运行时间 | 99.9% | | 僵尸程序流量占比 | 95.8% | | 前三大国家流量占比 | 占所有流量的 94.6% | ### 主要来源国家 | 排名 | 国家 | 会话数 | 占比 | |-----:|---------|---------:|------:| | 1 | 印度尼西亚 | 39,657 | 60.9% | | 2 | 巴西 | 20,342 | 31.2% | | 3 | 美国 | 1,657 | 2.5% | 印度尼西亚和巴西合计占所有流量的 92%,尽管它们仅来自总共六个唯一的 IP。美国的流量来源分布则更广,有 300 个唯一 IP,但每个 IP 产生的会话数量相对较少。 ### 最常被尝试的凭据 被尝试最多的用户名是 `root` (62,379 次尝试),其次是 `admin` (420)、`postgres` (44) 和 `user` (40)。被尝试最多的密码是 `123456`、`password`、`admin`、`root` 和 `12345`。这种模式与针对 IoT 设备和网络设备的默认凭据填充攻击一致。 ## 检测性能 所有三个模型均根据 75 个手动标记的真实会话进行了评估,这些会话刻意平衡为 37 个僵尸程序会话和 38 个非僵尸程序会话。标签是使用 7 点行为分类系统在对每个会话进行盲评时应用的。 | 模型 | 类型 | 精确率 | 召回率 | F1 分数 | 结论 | |-------|------|----------:|-------:|---------:|---------| | 规则基线 | 启发式 | 0.55 | 0.78 | 0.64 | 表现最佳 | | Isolation Forest | 无监督机器学习 | 0.50 | 0.08 | 0.14 | 受到污染反转的影响 | | Local Outlier Factor | 基于密度的机器学习 | 0.43 | 0.08 | 0.14 | 受到污染反转的影响 | ### 规则基线逻辑 ``` # Rule A: 包含许多命令的短会话 flag_a = (duration_seconds < 30) & (command_count >= 5) # Rule B: 高命令率 flag_b = (cmds_per_sec > 0.5) # Final flag: A 或 B baseline_rule_flag = flag_a | flag_b ``` 总共 12 行代码。无论类别分布如何,都能针对已知的僵尸程序特征进行检测。30 秒的阈值刻意设定得比观察到的 3 秒僵尸程序平均值更宽,为该规则留出余量以捕获稍慢的变种,同时不会遗漏主要的僵尸程序特征。 ### 消融研究 一项特征组消融实验分离了哪些构建的特征对检测性能贡献最大。仅包含时间特征(持续时间和命令速率)在 Isolation Forest 上达到了 0.358 的最佳 F1 分数。添加行为和身份特征(命令类型计数、使用的凭据、下载标志)并未提高性能,这表明僵尸程序与非僵尸程序的可分离性主要编码在时间模式中,而非命令内容中。 ## 安装说明 ### 前置条件 - Python 3.10 或更高版本 - pip ### 代码参考 此处展示的仪表盘代码用于代码质量审查和作为作品集参考。为了保护部署期间观察到的受损设备 IP 的隐私,此公共仓库中不包含捕获的数据集和身份验证凭据。 要针对您自己的蜜罐数据运行仪表盘,您需要: - 一个 `data/` 文件夹,包含已解析的会话、基线结果、异常分数和 K-Means 聚类分配(CSV 格式) - 一个哈希凭据文件 (`data/users.json`),包含您自己的仪表盘登录信息 - MaxMind GeoLite2 国家数据库(免费,可从 MaxMind 获取) 生成这些文件(解析 Cowrie JSON 日志、构建特征、运行三个检测器、使用 K-Means 进行聚类)的流水线已在代码库中进行了内联文档说明。Cowrie 蜜罐本身是开源的,可在 https://github.com/cowrie/cowrie 获取。 ## 仓库结构 ``` . ├── README.md # This file ├── requirements.txt # Python dependencies ├── app.py # Streamlit dashboard entry point ├── auth.py # Login system (SHA-256 hashed credentials) ├── config.py # Dashboard configuration ├── data_loader.py # CSV loading and caching ├── geoip_lookup.py # MaxMind GeoLite2 wrapper ├── models.py # Cluster classification logic ├── .gitignore # Excludes data folder, SSH keys, Python cache └── LICENSE # MIT License ``` 注意:出于安全和隐私原因,此公共仓库中不包含代码中引用的捕获数据集和哈希凭据。在 AWS 上运行的流水线脚本(`parse_cowrie.py`、`detect_anomalies.py` 等)也予以保密,以避免泄露特定于服务器的配置。 ## 局限性 实事求是地说明了它确立了什么以及没有确立什么。 所有 75 个标记的会话均由一名研究人员使用固定的清单进行盲评分类。引入第二位评估者并计算 Cohen's kappa 将增强方法论的可靠性,这被建议作为未来的工作方向。 标记区分的是僵尸程序与非僵尸程序,而非恶意与良性。根据定义,所有访问蜜罐的内容都是非合法的,因此有意义的区别在于操作性。扩展到恶意与良性的分类将需要不同的真实标注方案。 该蜜罐仅部署在 eu-north-1 (斯德哥尔摩)。多区域部署将有助于确立地理分布是否具有普适性。 六周的捕获窗口是项目限制内的最大时长。更长的捕获将揭示季节性模式和攻击者的活动周期。 ## 致谢 由索尔福德大学的 Nashnush 博士(主导师)和 Bryant 博士(副导师)指导。对他们在整个项目过程中的指导表示衷心感谢。 本项目建立在 Rehman 等人 (2025) 在合成数据上记录的污染反转机制的基础之上。本工作的贡献在于在真实的面向互联网的蜜罐流量上展示了相同的效应,并提出了两阶段检测作为实用的缓解措施。 ## 许可证 在 MIT 许可证下发布。详见 `LICENSE`。 MaxMind GeoLite2 数据库包含其自身的许可证。条款请参见 https://dev.maxmind.com/geoip/geolite2-free-geolocation-data。 ## 联系方式 Anas Hussein 计算机科学与网络安全理学士 (荣誉) 索尔福德大学曼彻斯特分校,2025/26 在 LinkedIn 上建立联系:[linkedin.com/in/anas-y-hussein](https://www.linkedin.com/in/anas-y-hussein/)
标签:AI安全, Apex, AWS EC2, Chat Copilot, IoT安全, IP 地址批量处理, Isolation Forest, Kubernetes, Local Outlier Factor, PE 加载器, Python, SSH蜜罐, Streamlit, TTP分析, 威胁情报, 安全数据科学, 应用安全, 开发者工具, 异常检测, 插件系统, 攻击行为分析, 无后门, 无监督学习, 本科毕设, 机器学习, 网络安全, 网络安全实验, 网络安全监测, 访问控制, 请求拦截, 进程注入, 逆向工具, 隐私保护, 黑客攻击分析