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, 可视化界面, 威胁情报, 开发者工具, 测试用例, 网络流量审计, 蓝队, 蜜罐, 证书利用, 请求拦截, 通知系统