BrandoBank/sentinel
GitHub: BrandoBank/sentinel
轻量级零依赖认证日志安全分析器,帮助快速发现暴力破解与权限滥用等威胁。
Stars: 0 | Forks: 0
# sentinel — 认证日志安全分析器
一个命令行工具,用于解析 Linux `/var/log/auth.log` 文件并识别安全威胁:暴力破解攻击、凭证填充、用户名枚举、权限提升和后门账户创建。
零外部依赖 — 纯 Python 3.8+ 标准库。在任何能运行 Python 的地方都能运行。
## 检测内容
| 检测 | 严重性 | 检测方式 |
|------|--------|----------|
| SSH 暴力破解 | 高 | 基于源 IP 的失败尝试滑动窗口阈值 |
| 成功后登录 | 严重 | 同一 IP 先失败 N 次后成功认证 — 凭证填充信号 |
| 用户名枚举 | 中 | 单个 IP 探测多个不同的无效用户名 |
| 新建本地账户 | 中 | `useradd` 事件 — 常见攻击者持久化手段 |
| 权限提升(sudo) | 高 / 低 | 所有 sudo 事件;若命令为 Shell、凭证文件或网络工具则标记为高 |
## 快速开始
```
# 克隆并立即运行 — 无需安装
git clone https://github.com/BrandoBank/sentinel.git
cd sentinel
# 分析包含的示例日志
python3 sentinel.py sample-logs/sample-auth.log
# 分析您自己的 auth.log(需要读取权限)
sudo python3 sentinel.py /var/log/auth.log
# 直接从远程服务器管道传输
ssh user@host 'sudo cat /var/log/auth.log' | python3 sentinel.py -
# 导出结果为 JSON(用于 SIEM 摄取或脚本编写)
python3 sentinel.py auth.log --json > findings.json
# 调整检测灵敏度
python3 sentinel.py auth.log --brute-threshold 3 --window 30
```
## 示例输出
针对内置的 `sample-logs/sample-auth.log` 运行:
```
──────────────────────────────────────────────────────────────
SENTINEL — Auth Log Security Report
──────────────────────────────────────────────────────────────
Lines analyzed : 25
Events parsed : 25
Findings : 6 (1 critical 2 high 2 medium 1 low)
──────────────────────────────────────────────────────────────
[CRITICAL] Successful Login After Failures
IP had 6 failed attempt(s) before successful login as 'ec2-user'
ip: 185.220.101.45
user: ec2-user
failure_count: 6
login_time: 2025-04-19T03:14:26
[HIGH] Brute Force Attempt
14 failed attempts total; 6 within 60s window starting 03:12:01
ip: 185.220.101.45
count: 14
window_hits: 6
[HIGH] Privilege Escalation (sudo)
'ec2-user' executed sudo: /bin/bash
user: ec2-user
command: /bin/bash
[MEDIUM] New Local Account Created
New OS account created: 'svc_backup' — verify this was intentional
[MEDIUM] Username Enumeration
8 attempts with 8 distinct invalid usernames from 185.220.101.45
[LOW] Privilege Escalation (sudo)
'alice' executed sudo: /usr/bin/apt update
```
## 退出代码
| 代码 | 含义 |
|------|------|
| `0` | 无严重或高危发现 |
| `1` | 存在一个或多个严重或高危发现 |
| `2` | 文件未找到或参数错误 |
这使得 sentinel 可在 Shell 脚本和 CI 流水线中直接使用:
```
python3 sentinel.py /var/log/auth.log || alert_security_team.sh
```
## 检测逻辑
### 暴力破解(滑动窗口)
按时间戳排序失败记录。使用 `--window` 秒(默认 60)滑动窗口。若 `--brute-threshold` 次或以上失败(默认 5)落在同一窗口内,则判定为发现。
这避免了因用户数日忘记密码而产生的误报,仅在失败时间集中时触发。
### 失败后登录
对所有包含 `Accepted` 事件的源 IP 与失败集合进行交叉引用。任何匹配均为严重 — 即使仅有一条先前的失败记录,随后成功登录也值得调查。
### 用户名枚举
统计每个 IP 下的不同无效用户名数量。若一个 IP 尝试了三个或更多不同的无效名称,则认为是单词表扫描。发现结果会列出尝试次数最多的用户名。
## JSON 输出
`--json` 标志输出机器可读的结果,适用于 SIEM 导入、Splunk 或脚本处理:
```
{
"stats": {
"lines": 25,
"events": 25
},
"findings": [
{
"severity": "CRITICAL",
"type": "Successful Login After Failures",
"ip": "185.220.101.45",
"user": "ec2-user",
"failure_count": 6,
"login_time": "2025-04-19T03:14:26",
"detail": "IP had 6 failed attempt(s) before successful login as 'ec2-user'"
}
]
}
```
## 实际使用示例
```
# Cron 作业:夜间运行,发现关键问题时发出警报
0 2 * * * python3 /opt/sentinel/sentinel.py /var/log/auth.log --json \
| jq '.findings[] | select(.severity == "CRITICAL")' \
| mail -s "sentinel alert" security@company.com
# 实时监控(尾随模式)
tail -f /var/log/auth.log | python3 sentinel.py -
# 检查多台服务器
for host in web01 web02 db01; do
echo "=== $host ===" && ssh $host 'sudo cat /var/log/auth.log' | python3 sentinel.py -
done
```
## 测试的日志格式
- Ubuntu / Debian:`/var/log/auth.log`
- RHEL / CentOS / Amazon Linux:`/var/log/secure`(相同格式)
- macOS:`/var/log/system.log`(部分 — 仅 SSHD 事件)
## 构建动机
希望有一个轻量级、无依赖的替代方案,无需将日志发送到完整 SIEM 即可回答“昨晚该服务器是否被探测过?”。从零开始构建以理解基于日志的威胁检测原理,然后将其应用于实际服务器。
## 许可证
MIT
标签:CSV导出, Linux日志分析, PB级数据处理, PoC, SSH安全, syslog解析, URL发现, 凭证填充, 协议分析, 后门账户, 威胁情报, 子域名变形, 安全检测, 安全运维, 开发者工具, 开源安全工具, 持续监控, 日志取证, 暴力破解, 权限提升, 用户枚举, 纯Python, 网络安全审计, 认证日志, 逆向工具, 逆向工程平台, 零依赖