neha1411-2004/Threat-Intelligence-Platform
GitHub: neha1411-2004/Threat-Intelligence-Platform
为威胁情报后端 API 提供基于 JWT 与 RBAC 的完整身份认证和访问控制层。
Stars: 0 | Forks: 0
安全分析师身份验证与威胁访问控制
在第 6 天的威胁情报后端基础上添加了完整的身份验证层(bcrypt 密码哈希、JWT 会话、RBAC、账户锁定、基于 IP 的登录限制和身份验证日志记录),并利用它来保护每一个威胁 API。
## 项目结构
```
day7_secure_auth/
├── app.py Main Flask app — wires auth + threat-intel APIs together
├── auth/
│ ├── register.py User registration + bcrypt password hashing
│ ├── login.py Login validation, failed-attempt tracking, account
│ │ locking, IP-based login restriction, suspicious-
│ │ auth-pattern detection
│ ├── logout.py Secure logout (server-side session revocation)
│ ├── session_manager.py JWT issuance/validation, session timeout, active
│ │ session tracking
│ ├── role_manager.py RBAC role definitions (admin / analyst / monitor)
│ └── access_control.py @jwt_required decorator — protects every route
├── auth/auth_logs.py Authentication timeline / audit logging
├── templates/dashboard.html Live dashboard with a real login screen
├── requirements.txt
├── test_auth.py 23-test automated suite -> AUTH_TEST_REPORT.md
└── README.md
```
## 如何运行
```
pip install -r requirements.txt
python app.py
```
打开仪表板:
```
http://127.0.0.1:5000/dashboard
```
你会进入一个真实的登录界面。首次运行时会自动创建三个演示账户:
| 用户名 | 密码 | 角色 |
|---|---|---|
| `admin` | `AdminPass123` | 威胁管理员 |
| `analyst1` | `AnalystPass123` | 安全分析师 |
| `monitor1` | `MonitorPass123` | 监控人员 |
运行自动化测试套件:
```
python test_auth.py
```
## 各作业要求与代码的映射关系
| 要求 | 实现位置 |
|---|---|
| 用户注册 | `auth/register.py` → `POST /api/auth/register` |
| 安全密码哈希 | `register.py` 中的 `bcrypt.hashpw()` — 密码绝不会以明文形式存储或返回 |
| 登录验证 | `auth/login.py` → `POST /api/auth/login` |
| 会话创建 | `auth/session_manager.py` → `create_session()` 签发签名后的 JWT |
| 会话超时 | JWT `exp` 声明,30 分钟(`SESSION_TIMEOUT_MINUTES`) |
| 基于角色的授权 | `auth/role_manager.py` 以及通过 `access_control.jwt_required` 在每个路由上设置的 `roles=[...]` |
| 失败登录追踪 | `login.py` 中每个用户的 `failed_attempts` 计数器 |
| 账户锁定 | 5 次失败尝试 → 账户锁定 5 分钟(`MAX_FAILED_ATTEMPTS_PER_USER`) |
| 登出机制 | `auth/logout.py` → `POST /api/auth/logout`,在服务器端撤销会话 |
| 身份验证日志记录 | `auth/auth_logs.py` — 每个事件都在同一个时间线中 |
| 受 JWT 保护的威胁 API | 所有 `/api/*` 威胁情报路由均使用 `@jwt_required(roles=[...])` |
| 多角色访问限制 | admin / analyst / monitor 各自看到的内容不同(见下表) |
| 限制事件/证据访问 | `/api/incident/` → 仅限 `roles=["admin","analyst"]`;拒绝监控人员访问 |
| 分析师重复登录失败 | 相同的账户锁定逻辑适用于每个角色,包括分析师 |
| 基于 IP 的登录限制 | `login.py` → `_register_failed_ip_attempt()`,在 5 分钟内出现 8 次失败登录后阻止该 IP 10 分钟 |
| 会话过期系统 | JWT `exp` + 服务器端 `active_sessions` 白名单(登出时立即失效,而不仅是在过期时) |
| 身份验证时间线日志 | `GET /api/auth/logs`(仅限管理员)+ 在仪表板中实时可见 |
| 可疑身份验证检测 | `login.py` 标记从一个 IP 尝试 4 个或更多不同用户名的情况(撞库模式) |
| 限制被封禁的分析师 | `POST /api/auth/users//lock`(管理员)设置 `disabled=True`,撤销其所有会话,并阻止登录 |
| 证据访问审计跟踪 | 每次 `/api/incident/` 调用都会记录一条包含操作人/时间的 `RESOURCE_ACCESS` 条目 |
## 角色权限一览
| Endpoint | admin | analyst | monitor |
|---|:---:|:---:|:---:|
| `/api/threat-summary` | ✅ | ✅ | ✅ |
| `/api/suspicious-ips` | ✅ | ✅ | ✅ |
| `/api/attack-logs` | ✅ | ✅ | ✅ |
| `/api/incident/` (evidence) | ✅ | ✅ | ❌ |
| `/api/block-ip` | ✅ | ❌ | ❌ |
| `/api/auth/logs` (auth timeline) | ✅ | ❌ | ❌ |
| `/api/auth/users/*` (lock/unlock) | ✅ | ❌ | ❌ |
## API 快速参考
### 注册
```
curl -X POST http://127.0.0.1:5000/api/auth/register \
-H "Content-Type: application/json" \
-d '{"username":"newanalyst","password":"SecurePass123","role":"analyst"}'
```
### 登录(返回 JWT)
```
curl -X POST http://127.0.0.1:5000/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"AdminPass123"}'
```
### 调用受保护的 API
```
curl http://127.0.0.1:5000/api/threat-summary \
-H "Authorization: Bearer "
```
### 登出
```
curl -X POST http://127.0.0.1:5000/api/auth/logout \
-H "Authorization: Bearer "
```
## 供您报告参考的安全说明
- 密码使用 **bcrypt** 进行哈希处理(包含其自身针对每个密码的盐值)— 绝不以明文形式存储或记录。
- JWT 经过签名(HS256)且具有较短的有效期;登出时还会在服务器端撤销会话,因此即使 token 在技术上尚未过期,也无法在登出后被重用。
- 账户锁定(5 次失败尝试)和基于 IP 的封禁(来自同一 IP 的任意用户名下 8 次失败登录)可分别防御暴力破解和撞库攻击。
- `app.py` / `session_manager.py` 中的 `SECRET_KEY` 值为占位符 — 在实际部署中,这些值必须来自环境变量,切勿提交到源代码控制中。
标签:Flask, JWT, RBAC, Streamlit, Syscall, Web开发, 访问控制, 逆向工具