ahmad12583719/Ubuntu-Sentinel
GitHub: ahmad12583719/Ubuntu-Sentinel
一个 100% 本地运行的 Ubuntu 主机 SOC 与 IDS 工具,利用 River 流式机器学习对 journalctl 日志进行实时异常检测并提供桌面告警和终端仪表板。
Stars: 0 | Forks: 0
# Ubuntu Sentinel - 轻量级主机 SOC 与 IDS
**Ubuntu Sentinel** 是一个 100% 本地运行的、专为 Ubuntu Linux 构建的主机安全运营中心 (SOC) 和入侵检测系统 (IDS)。它完全在您的系统上提供实时异常检测、日志分析和安全警报,无需依赖 LLM 或繁重的云服务等外部组件。
## 功能
✅ **实时日志流处理** - 零延迟从 `journalctl` 获取实时系统日志
✅ **ML 驱动的异常检测** - 使用 River 的 HalfSpaceTrees 进行增量流式机器学习
✅ **多类别分析** - 将日志分类为 AUTH、KERNEL、NETWORK、PACKAGE、SERVICE
✅ **桌面通知** - 通过 `notify-send` (libnotify) 发送即时警报
✅ **持久化存储** - 将所有 WARNING/CRITICAL 警报记录到本地 SQLite 数据库中
✅ **交互式 CLI 仪表板** - 提供带有状态和事件历史的 Rich 终端 UI
✅ **轻量且快速** - 占用空间约 50MB,可在任何 Ubuntu 系统上运行
## 技术栈
| 组件 | 技术 | 用途 |
|-----------|-----------|---------|
| ML 引擎 | River 0.25.0 | 流式异常检测 (HalfSpaceTrees) |
| CLI UI | Typer + Rich | 交互式仪表板和命令 |
| 数据库 | SQLite3 | 本地警报持久化 |
| 日志来源 | journalctl | 系统日志获取 |
| 通知 | libnotify | 桌面警报 |
## 安装
### 前置条件
- Ubuntu Linux 20.04 或更高版本
- Python 3.11+
- `libnotify-bin`(用于桌面通知)
- `systemd` 及 `journalctl`(Ubuntu 标准配置)
### 设置
```
# 克隆或下载项目
cd /path/to/ubuntu-sentinel
# 创建虚拟环境
python3 -m venv venv
source venv/bin/activate
# 安装依赖
pip install -r requirements.txt
# 安装 libnotify(用于桌面提醒)
sudo apt install libnotify-bin
# 初始化数据库
python3 -c "from db import init_db; init_db()"
```
## 快速开始
### 开始实时监控
```
source venv/bin/activate
python3 -m cli start
```
这将流式传输实时日志并在检测到时显示警报:
- 日志通过 ML 异常检测进行处理
- WARNING 和 CRITICAL 警报会触发桌面通知
- 所有事件都会保存到 `~/.sentinel/sentinel_soc.db`
- 按 `Ctrl+C` 可优雅停止
### 查看事件历史
```
python3 -m cli status
```
显示内容:
- 已记录的警报总数
- 按严重程度划分 (CRITICAL、WARNING、INFO)
- 按类别划分 (AUTH、KERNEL、NETWORK 等)
- 最近 20 条事件的表格
### 运行自检
```
python3 -m cli test
```
验证内容:
- 引擎初始化
- ML 模型功能
- 数据库 schema
- 通知系统
- 特征提取
### 清理旧警报
```
# 删除超过 7 天的提醒(默认)
python3 -m cli clear
# 仅保留最近 30 天
python3 -m cli clear --days 30
```
## 项目结构
```
ubuntu-sentinel/
├── requirements.txt # Python dependencies
├── .gitignore # Git exclusions
├── README.md # This file
│
├── db.py # SQLite database layer
│ ├── init_db() # Initialize schema
│ ├── log_alert() # Persist alerts
│ ├── get_recent_alerts() # Query alerts
│ └── get_alert_stats() # Aggregate statistics
│
├── engine.py # ML anomaly detection
│ ├── SentinelSOCEngine # Main ML class
│ ├── categorize_log() # Rules-based categorization
│ ├── extract_features() # BagOfWords feature extraction
│ ├── process_log() # Full ML pipeline
│ └── should_alert() # Alert decision logic
│
├── cli.py # Interactive CLI dashboard
│ ├── start # Stream logs & detect anomalies
│ ├── status # Show incident dashboard
│ ├── clear # Clean up old alerts
│ ├── test # Run self-tests
│ └── send_desktop_notification() # Alert delivery
│
└── test_sentinel.py # Automated test suite
├── test_engine_initialization()
├── test_log_categorization()
├── test_feature_extraction()
├── test_anomaly_scoring()
├── test_severity_calculation()
├── test_alert_should_trigger()
├── test_database_initialization()
├── test_alert_logging()
├── test_journalctl_json_parsing()
└── test_graceful_error_handling()
```
## 架构
### 日志处理 Pipeline
```
journalctl -f (JSON)
↓
Parse JSON
↓
Extract text message
↓
Categorize (rules-based)
↓
Extract BagOfWords features (string keys)
↓
Anomaly score via HalfSpaceTrees
↓
Calculate severity (INFO/WARNING/CRITICAL)
↓
Should alert? (WARNING/CRITICAL)
↓
┌─────────────────────────┐
├─ Desktop notification │
├─ SQLite persistence │
└─ Console output │
```
### ML 特征提取
- 使用 `ngram_range=(1,1)` 的 **BagOfWords** 生成 unigram 特征
- 所有特征字典的键都**严格为字符串**(防止 River 排序时崩溃)
- 特征表示日志文本的词汇频率
- 异常检测器会观察特征分布随时间的变化
### 严重程度映射
| 异常分数 | 严重程度 | 通知 |
|---|---|---|
| 0.0 - 0.49 | INFO | 无(仅记录日志) |
| 0.50 - 0.79 | WARNING | 普通紧急程度 |
| 0.80 - 1.00 | CRITICAL | 关键紧急程度 |
## 自动化测试
运行全套测试套件以验证所有组件:
```
source venv/bin/activate
python3 test_sentinel.py
```
**测试覆盖范围:**
- ✓ 引擎初始化和 ML 模型设置
- ✓ 跨所有 5 个类别的日志分类
- ✓ 带有字符串键验证的特征提取
- ✓ 异常分数计算及其有效性 (0.0-1.0)
- ✓ 严重程度级别映射
- ✓ 警报触发逻辑
- ✓ 数据库 schema 和持久化
- ✓ 警报记录和检索
- ✓ JSON 解析 (journalctl 格式)
- ✓ 优雅的错误处理(格式错误的输入)
**预期输出:**
```
======================================================================
Ubuntu Sentinel - Automated Test Suite
======================================================================
TEST 1: Engine Initialization...
✓ Engine initialized successfully
TEST 2: Log Categorization...
✓ All logs categorized correctly
[... 8 more tests ...]
======================================================================
Test Results: 10/10 passed
======================================================================
[✓] ALL TESTS PASSED!
```
## 配置
### 数据库位置
警报存储于:`~/.sentinel/sentinel_soc.db`
要指定自定义位置,请修改 `db.py`:
```
DB_PATH = Path("/custom/path/sentinel_soc.db")
```
### ML 模型参数
在 `engine.py` 中,调整 `SentinelSOCEngine` 的初始化:
```
engine = SentinelSOCEngine(
window_size=1000 # Sliding window for anomaly detector
)
```
### 日志优先级过滤器
目前过滤优先级 6 及以上的日志(即 Info 及以上)。要在 `cli.py` 中进行更改:
```
["journalctl", "-f", "-o", "json", "-p", "6"] # Change 6 to 0-7
```
## 故障排除
### 没有出现桌面通知?
确保已安装 `libnotify-bin`:
```
sudo apt install libnotify-bin
```
测试通知:
```
notify-send "Test" "Ubuntu Sentinel is working"
```
### 数据库文件未被创建?
检查 `~/.sentinel/` 的权限:
```
mkdir -p ~/.sentinel
chmod 700 ~/.sentinel
```
### journalctl 访问被拒绝?
将您的用户添加到 `systemd-journal` 组:
```
sudo usermod -a -G systemd-journal $USER
# 注销并重新登录
```
### 出现大量误报警报?
ML 模型会随着时间进行学习。初始运行时可能具有较高的敏感度。请让其运行处理超过 100 条日志以建立基线。您也可以在 `engine.py` 中调整 `window_size` 以加快或减慢学习速度。
## 性能
| 指标 | 数值 |
|--------|-------|
| 内存 (空闲) | ~15 MB |
| 内存 (流式传输) | ~30-50 MB |
| CPU (每条日志) | <1 ms |
| 数据库写入 (每次警报) | ~2 ms |
| 警报延迟 | <100 ms |
## 安全说明
⚠️ **本地执行**:Sentinel 完全在您的机器上运行,不进行任何云端或外部服务调用
⚠️ **数据库存储**:警报历史记录以明文 SQLite 存储。请相应地保护 `~/.sentinel/` 的权限
⚠️ **Journalctl 访问**:需要读取系统日志的权限(可能需要群组成员资格)
## 作者
- **Ubuntu Sentinel 团队** - 网络安全工程
## 免责声明
Ubuntu Sentinel 是一款检测和警报工具,不能替代:
- 专业的安全监控服务
- 全面的安全审计
- 事件响应程序
- 安全强化措施
请将其作为纵深防御策略的一部分使用。
**最后更新**:2026-07-24
**版本**:1.0.0
**Python 兼容性**:3.11+
**Ubuntu 兼容性**:20.04+
### 🔑 所需系统权限(日志访问)
为了让 Ubuntu Sentinel 能够读取系统日志而无需以 `root` (`sudo`) 身份运行,您的 Linux 用户必须属于 `systemd-journal` 组。
在您的终端中运行以下命令:
```
# 将您的用户添加到 systemd-journal 组
sudo usermod -a -G systemd-journal $USER
```
### 💡 为什么这对您的项目很重要
* **无需 `sudo`:** 将用户添加到 `systemd-journal` 允许您的工具以普通用户身份通过 `python3 cli.py start` 干净地运行,而无需 `sudo`。
* **保证日志遥测:** 它确保 `journalctl -f -o json -p 6` 能将实时系统日志直接送入您的 River ML pipeline 中!
标签:Apex, PB级数据处理, Python, SQLite, 主机入侵检测, 安全运维, 异常检测, 无后门, 机器学习, 逆向工具