Files
KnowledgeBase/docs/security-logging.md
Knowledge Base System acf549c43c feat: 初始化知识库系统项目
- 实现基于 Laravel 11 和 Filament 3.X 的文档管理系统
- 添加用户认证和分组管理功能
- 实现文档上传、分类和权限控制
- 集成 Word 文档自动转换为 Markdown
- 集成 Meilisearch 全文搜索引擎
- 实现文档在线预览功能
- 添加安全日志和审计功能
- 完整的简体中文界面
- 包含完整的项目文档和部署指南

技术栈:
- Laravel 11.x
- Filament 3.X
- Meilisearch 1.5+
- Pandoc 文档转换
- Redis 队列系统
- Pest PHP 测试框架
2025-12-05 14:44:44 +08:00

4.8 KiB
Raw Blame History

安全日志记录

概述

知识库系统实现了全面的安全日志记录功能,用于记录所有未授权访问尝试和安全相关事件。

功能特性

1. 自动记录未授权访问

系统会自动记录以下未授权访问尝试:

  • 查看文档 (view):用户尝试查看无权访问的专用文档
  • 下载文档 (download):用户尝试下载无权访问的文档
  • 更新文档 (update):用户尝试更新不属于自己的文档
  • 删除文档 (delete):用户尝试删除不属于自己的文档
  • 恢复文档 (restore):用户尝试恢复不属于自己的文档
  • 永久删除 (forceDelete):用户尝试永久删除不属于自己的文档

2. 记录的信息

每条安全日志包含以下信息:

  • 事件类型 (event)unauthorized_access
  • 操作类型 (action)view, download, update, delete 等
  • 用户信息
    • 用户 ID (user_id)
    • 用户名 (user_name)
    • 用户邮箱 (user_email)
  • 文档信息
    • 文档 ID (document_id)
    • 文档标题 (document_title)
    • 文档类型 (document_type)
    • 文档分组 ID (document_group_id)
  • 请求信息
    • IP 地址 (ip_address)
    • 时间戳 (timestamp)
    • 用户代理 (user_agent)

日志配置

日志通道

安全日志使用独立的 security 通道,配置在 config/logging.php 中:

'security' => [
    'driver' => 'daily',
    'path' => storage_path('logs/security.log'),
    'level' => env('LOG_LEVEL', 'info'),
    'days' => env('LOG_SECURITY_DAYS', 90),
    'replace_placeholders' => true,
],

日志保留期

默认情况下,安全日志保留 90 天。可以通过环境变量 LOG_SECURITY_DAYS 调整:

LOG_SECURITY_DAYS=90

查看日志

日志文件位置

安全日志存储在:storage/logs/security.log

每天会自动创建新的日志文件,格式为:security-YYYY-MM-DD.log

日志格式示例

[2024-12-04 10:30:45] local.WARNING: 未授权访问尝试 {"event":"unauthorized_access","action":"view","user_id":2,"user_name":"张三","user_email":"zhangsan@example.com","document_id":5,"document_title":"机密文档","document_type":"dedicated","document_group_id":3,"ip_address":"192.168.1.100","timestamp":"2024-12-04T10:30:45+08:00","user_agent":"Mozilla/5.0..."}

使用命令行查看日志

查看最新的安全日志:

tail -f storage/logs/security.log

查看今天的安全日志:

cat storage/logs/security-$(date +%Y-%m-%d).log

搜索特定用户的未授权访问:

grep "user_id\":2" storage/logs/security.log

搜索特定文档的访问尝试:

grep "document_id\":5" storage/logs/security.log

安全监控建议

1. 定期审查

建议定期审查安全日志,特别关注:

  • 频繁的未授权访问尝试
  • 来自异常 IP 地址的访问
  • 针对敏感文档的访问尝试
  • 同一用户的大量失败尝试

2. 告警设置

可以配置日志监控工具(如 ELK Stack、Graylog 等)来:

  • 实时监控安全日志
  • 设置告警规则
  • 生成安全报告
  • 可视化安全事件

3. 日志分析

使用日志分析工具可以:

  • 识别攻击模式
  • 发现潜在的安全威胁
  • 追踪用户行为
  • 生成合规报告

扩展功能

SecurityLogger 服务

系统提供了 SecurityLogger 服务类,可以用于记录其他安全事件:

use App\Services\SecurityLogger;

// 记录未授权访问
$securityLogger->logUnauthorizedAccess($user, $document, 'view');

// 记录权限验证失败
$securityLogger->logAuthorizationFailure($user, 'Document', $documentId, 'view', '用户不在分组中');

// 记录可疑活动
$securityLogger->logSuspiciousActivity($user, '短时间内大量下载尝试', [
    'attempts' => 50,
    'timeframe' => '5分钟'
]);

合规性

安全日志记录有助于满足以下合规要求:

  • 数据保护法规:记录数据访问和使用情况
  • 审计要求:提供完整的访问审计轨迹
  • 安全标准:符合 ISO 27001 等安全标准
  • 内部政策:支持组织的安全政策执行

注意事项

  1. 隐私保护:日志中包含用户信息,需要妥善保管
  2. 存储空间:定期清理旧日志以节省存储空间
  3. 性能影响:日志记录对性能影响很小,但在高并发场景下需要监控
  4. 日志轮转:使用 daily 驱动自动进行日志轮转

故障排查

日志未生成

  1. 检查 storage/logs 目录权限
  2. 确认日志配置正确
  3. 检查 LOG_CHANNEL 环境变量

日志文件过大

  1. 调整 LOG_SECURITY_DAYS 减少保留天数
  2. 配置日志轮转策略
  3. 使用外部日志管理系统

无法写入日志

  1. 检查文件系统权限
  2. 确认磁盘空间充足
  3. 检查 SELinux 或 AppArmor 配置