Lucy-dot-dot/ssh-honeypot

GitHub: Lucy-dot-dot/ssh-honeypot

一款基于 Rust 构建的 SSH 蜜罐服务器,通过模拟逼真的 Ubuntu 环境并集成威胁情报,安全地捕获和分析恶意连接行为。

Stars: 2 | Forks: 0

# SSH 蜜罐服务器 ## 关于 一个使用 Rust 编写的高级 SSH 蜜罐服务器,它模拟类似 Ubuntu 的环境来捕获和记录恶意活动。该服务器接受或拒绝 SSH 身份验证尝试,并提供一个虚假的 shell 界面,而不会执行任何实际命令,这使其非常适合用于安全研究和威胁情报收集。 ## 功能 ### 核心蜜罐功能 - **安全的命令模拟**:模拟 Ubuntu 环境,不执行真实命令 - **灵活的身份验证**:可以接受所有尝试(蜜罐模式)或拒绝所有尝试(日志记录模式) - **会话记录**:跟踪完整的 SSH 会话,包括时间和命令历史 - **SFTP 支持**:捕获上传的文件并进行全面的威胁分析 - **Tarpit 模式**:可选的慢响应模式,用于拖延和干扰攻击者 ### IP 情报集成 - **AbuseIPDB 集成**:自动进行威胁情报查询和置信度评分 - **IPAPI 地理定位**:为连接的 IP 提供地理位置和 ISP 信息 - **双层缓存**:为两个服务提供内存 + 数据库缓存(24 小时 TTL) - **速率限制处理**:通过重试逻辑优雅地处理 API 速率限制 ### 高级监控 - **文件上传分析**:分析 SFTP 上传文件的文件类型、熵和威胁 - **会话跟踪**:包含开始/结束时间和持续时间的完整会话生命周期 - **命令记录**:记录所有输入的命令并与会话相关联 - **连接跟踪**:基本的连接尝试记录 ### 数据库功能 - **PostgreSQL 后端**:具有适当索引的专业级数据库 - **富集视图**:`auth_enriched` 视图将身份验证与 IP 情报相结合 - **自动清理缓存**:可配置的过期缓存条目清理 - **迁移支持**:结构化的数据库 schema 演进 ## 用法 ### 基本操作 ``` # 使用默认设置运行(接受所有 auth,监听 0.0.0.0:2222 和 [::]:2222) cargo run # 显示所有可用选项 cargo run -- --help # 以 reject-all 模式运行(记录尝试但拒绝访问) cargo run -- --reject-all-auth # 启用 tarpit 模式以减缓攻击者速度 cargo run -- --tarpit ``` ### 配置文件 ``` # 使用自定义配置文件 cargo run -- --config /path/to/config.toml # 查看 config.toml.example 以获取完整配置选项 ``` ### 高级选项 ``` # 自定义 interface 和 database cargo run -- --interface 127.0.0.1:2223 --database-url postgresql://user:pass@host/db # 启用 AbuseIPDB 集成 cargo run -- --abuse-ip-db-api-key YOUR_API_KEY # 禁用 IPAPI geolocation(如果您不想发送 HTTP 请求) cargo run -- --disable-ipapi # 自定义 SSH keys 目录 cargo run -- --key-folder /secure/keys # 禁用 SFTP 支持 cargo run -- --disable-sftp ``` ## 命令行选项 | 标志 | 描述 | 环境变量 | |------|-------------|---------------------| | `-f, --config` | 配置文件路径 | `CONFIG_FILE` | | `-i, --interface` | 监听地址/端口 | `INTERFACE` | | `-d, --database-url` | PostgreSQL 连接 URL | `DATABASE_URL` | | `-c, --disable-cli-interface` | 仅记录身份验证,不进行 shell 模拟 | `DISABLE_CLI_INTERFACE` | | `-a, --authentication-banner` | 自定义 SSH banner 文本 | `AUTHENTICATION_BANNER` | | `-t, --tarpit` | 启用慢响应模式 | `TARPIT` | | `-g, --disable-base-tar-gz-loading` | 跳过文件系统加载 | `DISABLE_BASE_TAR_GZ_LOADING` | | `-b, --base-tar-gz-path` | 自定义文件系统归档路径 | `BASE_TAR_GZ_PATH` | | `-k, --key-folder` | SSH 密钥目录 | `KEY_FOLDER` | | `--enable-sftp` | 启用 SFTP 子系统(默认禁用) | `ENABLE_SFTP` | | `--abuse-ip-db-api-key` | AbuseIPDB API 密钥 | `ABUSE_IP_DB_API_KEY` | | `--abuse-ip-cache-cleanup-hours` | 缓存清理间隔 | `ABUSE_IP_CACHE_CLEANUP_HOURS` | | `--reject-all-auth` | 拒绝所有身份验证尝试 | `REJECT_ALL_AUTH` | | `--disable-ipapi` | 禁用 IPAPI 地理定位 | `DISABLE_IPAPI` | ## 配置 ### 目录结构 ``` ~/.config/ssh-honeypot/ # Configuration directory (XDG compliant) ├── config.toml # Main configuration file └── keys/ # SSH server keys ├── ed25519 ├── rsa └── ecdsa ~/.local/share/ssh-honeypot/ # Data directory └── base.tar.gz # Filesystem archive ``` ### 配置优先级 1. 命令行参数(最高优先级) 2. 配置文件值 3. 环境变量 4. XDG 目录默认值 5. 硬编码默认值(最低优先级) ## 数据库 schema ### 核心表 - **`auth`**:包含凭证的所有 SSH 身份验证尝试 - **`commands`**:SSH 会话期间输入的命令 - **`sessions`**:包含开始/结束时间的会话元数据 - **`uploaded_files`**:包含威胁分析的 SFTP 上传 - **`conn_track`**:基本的连接尝试记录 ### 缓存表 - **`abuse_ip_cache`**:AbuseIPDB 威胁情报缓存 - **`ipapi_cache`**:IPAPI 地理定位数据缓存 ### 视图 - **`auth_enriched`**:将身份验证尝试与来自 AbuseIPDB 和 IPAPI 的 IP 情报合并的全面视图,对于重叠字段,以 AbuseIPDB 为准 ## 安全功能 ### 威胁检测 - **文件上传分析**:基于 Magic 的 MIME 检测、熵分析、格式不匹配检测 - **IP 信誉**:带有置信度评分的自动 AbuseIPDB 查询 - **Tor 检测**:通过 AbuseIPDB 识别 Tor 出口节点 - **地理画像**:通过 IPAPI 识别国家和 ISP ### 配置安全 - **符合 XDG 标准**:使用具有适当权限的标准系统目录 - **密钥管理**:SSH 密钥安全地存储在专用目录中 - **无秘密暴露**:配置文件不包含敏感数据 - **路径验证**:所有文件路径都经过验证并安全解析 ### 操作模式 - **蜜罐模式**(默认):接受所有身份验证,提供交互式 shell - **日志记录模式**(`--reject-all-auth`):拒绝所有身份验证,仅记录尝试 - **Tarpit 模式**(`--tarpit`):故意放慢响应速度以浪费攻击者的时间 ## 要求 - **Rust 1.70+**:现代 Rust 工具链 - **PostgreSQL**:用于存储蜜罐数据的数据库后端 - **网络访问**:用于 IP 情报 API(可选) - **提升的权限**:用于绑定小于 1000 的端口(使用 `setcap cap_net_bind_service`) ## 安装 ``` # Clone 代码库 git clone # 将目录切换到代码库根目录 cd ssh-honeypot # 从示例创建配置文件(根据需要进行编辑) cp config.toml.example config.toml # 拉取当前 image docker compose pull # 运行服务器 docker compose up -d && docker compose logs -f ssh-honeypot ``` ### IPv6 支持 默认的 `config.toml.example` 启用了 IPv4 (`0.0.0.0`) 和 IPv6 (`[::]`) 监听器。如果容器或主机未启用 IPv6,绑定 `[::]` 接口将失败并记录错误 — **这是无害的**,服务器将继续仅在 IPv4 接口上运行。 要在 Docker 内部启用适当的 IPv6 支持,您需要做两件事: **1. 在主机上更新 `/etc/docker/daemon.json`:** ``` { "ipv6": true, "fixed-cidr-v6": "fd00:1::/64" } ``` 然后重启 Docker daemon(`sudo systemctl restart docker`)。 **2. 取消注释 `docker-compose.yml` 底部的网络块:** ``` networks: default: enable_ipv6: true ipam: config: - subnet: 172.21.0.0/16 - subnet: fd00:2::/64 ``` 如果没有这两项更改,无论蜜罐绑定到什么地址,Docker 容器都无法接收 IPv6 流量。 ## 开发 ### 构建命令 ``` cargo build # Debug build cargo build --release # Optimized build cargo check # Quick compilation check cargo run -- --help # Show all options ``` ### 配置 请参阅 `config.toml.example` 获取包含所有可用选项的完整配置文件说明。 ### 数据库迁移 - `001_initial_schema.sql`:核心表(auth、commands、sessions、uploaded_files、abuse_ip_cache) - `002_conn_track.sql`:连接跟踪表 - `003_ipapi_cache.sql`:IPAPI 地理定位缓存表 - `004_auth_enriched_view.sql`:富集身份验证视图 ## 架构 ### 核心组件 1. **SSH 服务器**(`src/server.rs`):处理 SSH 连接和身份验证 2. **数据库层**(`src/db.rs`):基于异步消息的数据库操作 3. **SFTP 处理程序**(`src/sftp.rs`):文件上传捕获和分析 4. **Shell 模拟**(`src/shell/`):虚拟文件系统和命令响应 5. **IP 情报**(`src/abuseipdb.rs`、`src/ipapi.rs`):威胁和地理定位 API 6. **配置**(`src/app.rs`):多层配置系统 ### 关键设计模式 - **异步架构**:基于 Tokio 的异步处理 - **消息传递**:通过 mpsc channel 进行数据库操作 - **虚拟文件系统**:从 base.tar.gz 加载以获取逼真的内容 - **双重缓存**:为 API 响应提供内存 + 数据库缓存 - **符合 XDG 标准**:具有回退机制的标准目录结构 ## API 集成 ### AbuseIPDB - **目的**:威胁情报和滥用置信度评分 - **缓存**:具有内存 + 数据库层的 24 小时 TTL - **速率限制**:通过 retry-after 逻辑进行优雅处理 - **数据**:置信度分数、国家代码、Tor 检测、报告计数 ### IPAPI - **目的**:地理和 ISP 信息 - **缓存**:具有内存 + 数据库层的 24 小时 TTL - **注意**:免费层使用 HTTP(无 HTTPS)- 使用 `--disable-ipapi`、`DISABLE_IPAPI` 环境变量或 toml 配置文件中的 `disable_ipapi = true` 禁用 - **数据**:国家、地区、城市、坐标、时区、ISP、组织 ## 安全注意事项 这是一个专为**防御性安全研究**设计的蜜罐。该代码故意模拟漏洞,同时通过从不执行实际命令来维护实际的系统安全。 ### 数据隐私 - 应根据适用的隐私法律处理所有捕获的数据(凭证、命令、文件) - 考虑数据保留策略和安全销毁程序 - 确保遵守有关数据收集的当地法规 ### 网络安全 - 尽可能部署在隔离的网络段中 - 监控可能表明遭到破坏的异常流量模式 - 定期审查日志以发现意外行为 ## 法律免责声明 本软件按“原样”提供,不附带任何种类的明示或暗示的保证或担保。此 SSH 蜜罐服务器的作者不对因使用本软件而产生的任何损害、攻击、安全漏洞、数据丢失、系统入侵或其他负面后果承担责任。 安装和使用本软件即表示您承认: 1. 您需自担使用本软件的风险 2. 作者对代码中可能存在的任何安全漏洞不承担任何责任 3. 作者对因使用本软件而针对您的系统发起的任何攻击不承担责任 4. 不保证适销性或特定用途的适用性 5. 作者不对收集数据的任何 misuse 承担责任 本工具仅供安全研究和教育目的使用。用户有责任确保其部署符合其司法管辖区的所有适用法律和法规。 ## 许可证 采用 MIT 和 UNLICENSE 双重许可 - 选择您的律师满意的任何许可证。
标签:PostgreSQL, Rust, SSH, 可视化界面, 威胁情报, 开发者工具, 测试用例, 网络流量审计, 蓝队, 蜜罐, 证书利用, 请求拦截, 通知系统