文档目录
安全监控与审计

简介

本指南面向 DouPHP 的安全监控与审计体系建设,围绕以下目标展开:

  • 安全日志收集配置:访问日志、错误日志与安全事件日志的记录格式与存储策略。
  • 安全事件监控:异常行为检测、入侵尝试识别与实时告警建议。
  • 审计日志分析工具:日志查询、报表生成与趋势分析方法。
  • 安全扫描工具集成:漏洞扫描、代码审计与依赖检查的落地建议。
  • 安全指标与性能监控:登录失败率、异常请求统计等关键指标采集。
  • 安全事件响应流程与自动化处置脚本:从发现到处置的闭环方案。

项目结构

DouPHP 在安全与可观测性方面提供了分层能力:

  • 安全配置集中管理于配置文件,涵盖可信代理、Host 白名单、安全响应头与会话硬化。
  • 通用日志记录器提供分级日志、上下文自动补全、敏感信息脱敏、采样与限流。
  • 审计服务统一写入用户、预约与后台操作审计日志,保证来源 IP、模块与结果一致性。
  • 中间件层提供定向限流与安全响应头下发,覆盖前台与 API 端。
  • 登录流程在前后端均会记录成功/失败审计日志,并配合限流与告警。
graph TB
A["前端/客户端"] --> B["路由与中间件<br/>限流/安全头"]
B --> C["业务控制器/服务"]
C --> D["审计服务<br/>user_log/book_log/admin_log"]
C --> E["系统日志<br/>Log::info/error/warning"]
D --> F["数据库表"]
E --> G["storage/log/*.log"]

核心组件

  • 安全配置中心:定义可信代理、可信 Host、安全响应头与会话 Cookie 硬化参数。
  • 日志记录器:分级日志、自动上下文(请求 ID、IP、路由、用户/管理员/工作身份)、敏感字段脱敏、采样与每分钟限流。
  • 审计服务:统一写入会员、预约与后台操作审计日志,强制 action 字典校验,自动回退来源 IP。
  • 中间件:
    • 定向限流:对登录、注册、验证码、公共写接口等进行按 IP 配额限制。
    • 安全响应头:基线安全头(X-Frame-Options、X-Content-Type-Options、Referrer-Policy、Permissions-Policy)与 HSTS。
  • 登录流程:前后端登录失败/成功均记录审计日志,结合限流与告警。

架构总览

下图展示一次典型登录请求在安全与审计层面的流转:

sequenceDiagram
participant Client as "客户端"
participant MW as "中间件<br/>限流/安全头"
participant Svc as "登录服务"
participant Audit as "审计服务"
participant DB as "数据库"
participant Log as "系统日志"
Client->>MW : 提交登录请求
MW-->>Client : 命中限流则返回429
MW->>Svc : 通过则进入业务
Svc->>Audit : writeUserLog(登录成功/失败)
Audit->>DB : 插入 user_log
Svc->>Log : info/warning/error(可选)
Log-->>Log : storage/log/*.log
Svc-->>Client : 返回登录结果

详细组件分析

安全日志收集与存储策略

  • 访问日志
    • 使用系统日志记录器进行结构化记录,自动附加 request_id、scene、ip、route、request_uri、method、module、action、user_id、admin_id、work_id 等上下文。
    • 输出为每日文件 storage/log/log_YYYY-MM-DD.log,支持级别过滤、通道过滤、采样与每分钟同 key 限流。
    • 敏感字段自动脱敏,URL 查询串中的敏感键值会被掩码。
  • 错误日志
    • 通过 error/critical/alert/emergency 级别记录异常;生产环境建议提高最小级别以减少噪音。
    • 可在关键路径(如登录失败、鉴权失败、限流拒绝)记录 warning/error,便于告警。
  • 安全事件日志
    • 审计服务将登录成功/失败、后台操作等写入数据库表(user_log、book_log、admin_log),包含 action、details、result、ip、created_at 等字段。
    • 后台操作日志支持 module 维度,便于按功能域筛选。
flowchart TD
Start(["记录入口"]) --> Level{"日志级别是否允许?"}
Level -- 否 --> Drop["丢弃"]
Level -- 是 --> Channel{"通道是否允许?"}
Channel -- 否 --> Drop
Channel -- 是 --> AutoCtx["自动补全上下文"]
AutoCtx --> Redact["敏感字段脱敏"]
Redact --> Sample{"采样/限流命中?"}
Sample -- 是 --> Drop
Sample -- 否 --> Write["写入 storage/log/log_YYYY-MM-DD.log"]
Write --> End(["完成"])

安全事件监控与告警

  • 异常行为检测
    • 基于审计日志的 action/details 组合识别异常:如 LOGIN_FAIL + ACCOUNT_NOT_FOUND/PASSWORD_WRONG/IP_RATE_LIMITED。
    • 结合系统日志中 warning/error 的 channel 与上下文,定位异常来源 IP、路由与用户。
  • 入侵尝试识别
    • 定向限流中间件对登录、注册、验证码、公共写接口按 IP 限流,超限返回 429 并附带 Retry-After。
    • 登录失败时调用方会记录审计日志,便于后续聚合分析。
  • 实时告警建议
    • 对 storage/log/*.log 与数据库审计表建立监控:
      • 登录失败率阈值(例如 5 分钟内同一 IP 超过 N 次)。
      • 429 限流触发频率。
      • 高危 action(如批量删除、参数修改)与失败结果。
    • 可通过日志采集器(如 Filebeat/Fluent Bit)将日志推送到 ELK/Loki,并结合规则引擎触发告警。
sequenceDiagram
participant Attacker as "攻击者"
participant MW as "限流中间件"
participant Svc as "登录服务"
participant Audit as "审计服务"
participant Mon as "监控系统"
Attacker->>MW : 高频登录请求
MW-->>Attacker : 429 限流(含Retry-After)
Note over MW,Mon : 记录限流事件并上报
Attacker->>Svc : 绕过限流后尝试登录
Svc->>Audit : 记录LOGIN_FAIL
Audit-->>Mon : 推送审计事件
Mon-->>Mon : 计算失败率/阈值告警

审计日志分析工具

  • 日志查询
    • 系统日志:按日期查看 storage/log/log_YYYY-MM-DD.log,结合 grep/awk 或日志平台检索 level、channel、ip、route、user_id、admin_id。
    • 审计日志:通过后台管理界面查询 user_log/admin_log/book_log,支持按 action、module、ip、时间范围筛选。
  • 报表生成
    • 基于数据库视图或定时任务汇总:
      • 登录成功率/失败率(按日/小时)。
      • 各 action 分布(LOGIN_SUCCESS/LOGIN_FAIL/EDIT_INFO/PASSWORD_CHANGE)。
      • 后台操作统计(UPDATE/DELETE/LOGIN_FAIL 等)。
  • 趋势分析
    • 观察登录失败率、429 限流次数、高危操作失败率的趋势变化,识别潜在攻击或异常流量。
    • 结合渠道(channel)与场景(scene)区分 front/api/admin 三端的差异。

安全扫描工具集成

  • 漏洞扫描
    • 建议在 CI/CD 中集成静态扫描(如 PHPStan/PSalm)与依赖漏洞扫描(如 Composer audit、Dependabot)。
    • 对模板与静态资源进行 XSS/注入风险扫描。
  • 代码审计
    • 结合安全规则(如自定义 PSR 规则)检查敏感字段落盘、SQL 拼接、未授权访问等问题。
  • 依赖检查
    • 定期更新依赖,关注 CVE 公告,启用自动 PR 修复。

说明:本节为通用实践建议,不直接对应具体源码文件。

安全指标收集与性能监控

  • 指标定义
    • 登录失败率 = LOGIN_FAIL / (LOGIN_SUCCESS + LOGIN_FAIL)。
    • 异常请求统计 = 429 次数、error/warning 日志条数、高危 action 失败次数。
    • 会话安全指标 = 未命中安全头的请求比例、非 HTTPS 访问比例。
  • 采集方式
    • 系统日志:通过采集器抓取 storage/log/*.log,解析 JSON 上下文提取指标。
    • 审计日志:从 user_log/admin_log 聚合统计。
    • 限流指标:API 端 429 响应计数。
  • 可视化与告警
    • 在仪表盘展示趋势图与阈值告警,设置环比/同比异常检测。

安全事件响应流程与自动化处置

  • 事件分类
    • 暴力破解:连续 LOGIN_FAIL + IP_RATE_LIMITED。
    • 账号锁定:ACCOUNT_LOCKED。
    • 高危操作失败:后台 DELETE/UPDATE 失败且 details 为敏感对象。
  • 处置步骤
    • 自动封禁:对命中阈值的 IP 临时封禁(通过防火墙/WAF 或应用层黑名单)。
    • 通知告警:邮件/短信/IM 通知安全团队。
    • 人工复核:确认是否为误报,必要时扩大封禁范围。
    • 复盘改进:调整限流阈值、增加验证码强度、优化告警规则。
  • 自动化脚本建议
    • 定时任务:读取审计日志与系统日志,计算指标并执行封禁/解封。
    • 钩子:在登录失败达到阈值时触发封禁;在 429 频繁触发时提升限流等级。

说明:本节为流程与脚本设计建议,不直接对应具体源码文件。

依赖关系分析

  • 安全配置依赖
    • 安全响应头由 AbstractSecurityHeadersMiddleware 读取 config/security.php 的 headers 配置下发。
    • 会话 Cookie 硬化由 InitTrait 在 session_start() 前应用 security.session 配置。
  • 日志与审计依赖
    • 审计服务依赖 Request 注入的 IP 与 routeModule,确保审计记录的准确性。
    • 系统日志依赖容器中的 Request 以获取当前路由字符串。
  • 中间件依赖
    • 限流中间件依赖安全配置的 throttle.store 与默认配额。
    • API 端限流在 reject 时返回 429 并附带 Retry-After。
graph LR
CFG["security.php"] --> SHM["SecurityHeadersMiddleware"]
CFG --> TH["ThrottleMiddleware"]
REQ["Request"] --> AUD["AuditService"]
AUD --> DB["user_log/admin_log/book_log"]
LOG["Log"] --> FILE["storage/log/*.log"]

性能考虑

  • 日志写入性能
    • 使用每日文件追加写入,避免频繁打开关闭文件。
    • 开启采样与每分钟同 key 限流,降低高并发下的 I/O 压力。
    • 生产环境提高最小级别,减少 debug 日志。
  • 审计写入性能
    • 审计日志为关键数据,建议异步化或批处理写入,避免阻塞主流程。
    • 对高频 action(如登录失败)进行合并或采样。
  • 限流性能
    • 限流存储建议使用高性能后端(如 Redis),当前实现使用文件存储,适合中小规模。
    • 合理设置 window 与 max,避免误伤正常用户。

故障排查指南

  • 无法写入日志
    • 检查 storage/log 目录权限与磁盘空间。
    • 确认日志开关与最小级别配置。
  • 审计日志缺失
    • 检查审计服务构造注入的 IP 与 Request 是否正确。
    • 确认数据库连接与表结构。
  • 限流误判
    • 检查 trusted_proxies 配置,确保反向代理 IP 被信任。
    • 调整限流配额与窗口时间。
  • 安全头未生效
    • 确认中间件已挂载到管道,且仅在命中路由时运行。
    • 检查 HSTS 仅对 HTTPS 生效的配置。

结论

DouPHP 提供了完善的安全监控与审计基础:

  • 安全配置集中、日志记录结构化、审计写入规范化。
  • 中间件层提供限流与安全头,覆盖前台与 API。
  • 登录流程贯穿审计与限流,便于异常检测与告警。 建议在此基础上:
  • 建立日志采集与可视化平台,制定告警规则。
  • 集成安全扫描与依赖检查,形成 DevSecOps 闭环。
  • 完善事件响应流程与自动化处置脚本,提升响应效率。

附录

  • 关键常量与字典
    • 用户审计 action:登录成功/失败、资料编辑、密码修改。
    • 用户审计详情:空输入、格式非法、IP 限流、账号不存在、账号锁定、密码错误、验证码无效、图形验证码过期、微信小程序相关标签。
  • 安全响应头
    • X-Frame-Options、X-Content-Type-Options、Referrer-Policy、Permissions-Policy、HSTS。
  • 限流端点示例
    • 登录、注册、手机号登录、找回密码、验证码、公共写接口、防伪查询、LLM 成本端点。
添加日期:2026-10-05