API Sentinel 是一个基于 FastAPI 的后端 API 安全审计与异常访问检测系统。
项目目标不是替代 Prometheus / Grafana 这类通用监控工具,而是聚焦在应用层 API 安全审计:记录请求行为,识别异常访问,并生成安全事件,帮助管理员追踪接口访问风险。
API Sentinel 关注的问题是:
- 谁访问了系统
- 从哪个 IP 访问
- 访问了哪个接口
- 返回了什么状态码
- 请求耗时多久
- 是否发生异常访问行为
- 是否需要生成安全事件供管理员查看
当前项目已经实现从用户认证到请求审计,再到异常登录检测的基础闭环。
- Python
- FastAPI
- MySQL
- SQLAlchemy
- Alembic
- Pydantic
- JWT
- passlib + bcrypt
- Docker MySQL
- Swagger UI
- FastAPI 应用骨架
/health健康检查接口- 分层目录结构
- 配置文件管理
- Docker MySQL 本地数据库
已通过 SQLAlchemy + Alembic 管理数据库结构。
当前主要数据表:
usersrequest_logssecurity_eventsalembic_version
已实现:
- 用户注册
/auth/register - 用户登录
/auth/login - 密码哈希存储
- 密码校验
- JWT 生成与解析
- OAuth2 Password Flow
- Swagger Authorize 登录
get_current_user/users/me获取当前用户信息
认证流程:
用户注册
↓
密码哈希后写入 users 表
↓
用户登录
↓
校验密码
↓
签发 JWT
↓
后续请求携带 Bearer Token
↓
后端解析 JWT 并识别当前用户
系统已支持基于角色的权限控制。
当前用户角色:
MEMBERADMIN
管理员接口需要 ADMIN 权限。
权限判断逻辑:
请求携带 JWT
↓
get_current_user 解析当前用户
↓
get_current_admin_user 检查 role
↓
非 ADMIN 用户返回 403
系统已实现请求日志中间件,会自动记录 API 请求行为。
记录字段包括:
user_idip_addressmethodpathstatus_codelatency_mscreated_at
示例:
GET /health 200
POST /auth/login 401
GET /admin/request-logs 403
RequestLog 的作用是记录事实:
谁
从哪里
访问了什么接口
结果是什么
耗时多久
已实现管理员查询请求日志接口:
GET /admin/request-logs支持分页参数:
limit: 1~100
offset: >=0
该接口仅允许 ADMIN 用户访问。
系统已实现安全事件表与管理员查询接口。
安全事件字段包括:
request_log_iduser_idevent_typerisk_levelsource_ipdescriptioncreated_at
管理员查询接口:
GET /admin/security-events该接口仅允许 ADMIN 用户访问。
当前已实现第一条安全检测规则:
同一 IP
5 分钟内
/auth/login 登录失败次数 >= 5
↓
生成 LOGIN_BRUTE_FORCE 安全事件
生成事件示例:
{
"event_type": "LOGIN_BRUTE_FORCE",
"risk_level": "MEDIUM",
"source_ip": "127.0.0.1",
"description": "IP 127.0.0.1 failed login 5 times within 5 minutes."
}第一条完整安全检测链路:
登录失败
↓
RequestLog 记录 401
↓
Detector 统计失败次数
↓
SecurityEvent 生成安全事件
↓
Admin API 查询事件
Client
↓
FastAPI
↓
Middleware
↓
RequestLog
↓
Security Detector
↓
SecurityEvent
↓
Admin API
认证链路:
/auth/register
/auth/login
/users/me
审计链路:
Request
↓
RequestLogMiddleware
↓
request_logs
检测链路:
request_logs
↓
security_detector
↓
security_events
管理链路:
ADMIN User
↓
/admin/request-logs
/admin/security-events
GET /health
POST /auth/register
POST /auth/loginGET /users/meGET /admin/request-logs
GET /admin/security-events.\.venv\Scripts\activate复制 .env.example 为 .env,并按本机数据库信息修改:
DATABASE_URL=mysql+pymysql://root:password@127.0.0.1:3307/api_sentinel
SECRET_KEY=change-me-in-production
docker start <mysql-container-name>alembic upgrade headuvicorn app.main:app --reloadhttp://127.0.0.1:8000/docs
项目已包含认证、健康检查、管理员请求日志、登录爆破安全事件等核心链路测试。测试环境使用临时 SQLite 数据库,不需要启动本地 MySQL。
python -m pytestPOST /auth/register请求体:
{
"username": "lrr",
"password": "123456"
}POST /auth/login或使用 Swagger 右上角 Authorize。
GET /users/me在数据库中执行:
UPDATE users
SET role = 'ADMIN'
WHERE username = 'lrr';重新登录后访问管理员接口。
GET /admin/request-logs连续 5 次使用错误密码登录:
POST /auth/login然后查看安全事件:
GET /admin/security-events已完成:
- FastAPI 项目骨架
- MySQL 数据库连接
- SQLAlchemy ORM
- Alembic 迁移
- 用户注册与登录
- 密码哈希
- JWT 认证
- 当前用户识别
- RBAC 管理员权限
- RequestLog 请求审计日志
- 请求日志中间件
- 管理员日志查询接口
- SecurityEvent 安全事件表
- 登录爆破检测规则
- 管理员安全事件查询接口
当前进度:MVP 核心链路基本完成。
计划增加:
- 普通用户访问
/admin/*被 403 时生成安全事件 - 同 IP 高频请求检测
- 高频 401 / 403 检测
- 慢接口异常检测
- 敏感接口访问检测
当前安全事件通过时间窗口减少重复生成。
后续可增加:
dedup_key- 时间窗口去重
- 数据库唯一约束
- 事件状态字段
计划增加:
test_request_log.pytest_security_event.py- Docker Compose 一键启动
- README 架构图
- API 示例
- 错误码说明
后期可考虑接入:
- Prometheus
- Grafana
- OpenTelemetry Collector
- Loki / Elasticsearch / ClickHouse
当前项目核心不是通用监控平台,而是应用层 API 安全审计系统。
API Sentinel 当前已经实现从认证、请求记录、权限控制到异常登录检测的基础安全审计闭环。
一个围绕 API 访问行为构建的后端安全平台雏形。