- 实现基于 Laravel 11 和 Filament 3.X 的文档管理系统 - 添加用户认证和分组管理功能 - 实现文档上传、分类和权限控制 - 集成 Word 文档自动转换为 Markdown - 集成 Meilisearch 全文搜索引擎 - 实现文档在线预览功能 - 添加安全日志和审计功能 - 完整的简体中文界面 - 包含完整的项目文档和部署指南 技术栈: - Laravel 11.x - Filament 3.X - Meilisearch 1.5+ - Pandoc 文档转换 - Redis 队列系统 - Pest PHP 测试框架
190 lines
4.8 KiB
Markdown
190 lines
4.8 KiB
Markdown
# 安全日志记录
|
||
|
||
## 概述
|
||
|
||
知识库系统实现了全面的安全日志记录功能,用于记录所有未授权访问尝试和安全相关事件。
|
||
|
||
## 功能特性
|
||
|
||
### 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` 中:
|
||
|
||
```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` 调整:
|
||
|
||
```env
|
||
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..."}
|
||
```
|
||
|
||
### 使用命令行查看日志
|
||
|
||
查看最新的安全日志:
|
||
|
||
```bash
|
||
tail -f storage/logs/security.log
|
||
```
|
||
|
||
查看今天的安全日志:
|
||
|
||
```bash
|
||
cat storage/logs/security-$(date +%Y-%m-%d).log
|
||
```
|
||
|
||
搜索特定用户的未授权访问:
|
||
|
||
```bash
|
||
grep "user_id\":2" storage/logs/security.log
|
||
```
|
||
|
||
搜索特定文档的访问尝试:
|
||
|
||
```bash
|
||
grep "document_id\":5" storage/logs/security.log
|
||
```
|
||
|
||
## 安全监控建议
|
||
|
||
### 1. 定期审查
|
||
|
||
建议定期审查安全日志,特别关注:
|
||
|
||
- 频繁的未授权访问尝试
|
||
- 来自异常 IP 地址的访问
|
||
- 针对敏感文档的访问尝试
|
||
- 同一用户的大量失败尝试
|
||
|
||
### 2. 告警设置
|
||
|
||
可以配置日志监控工具(如 ELK Stack、Graylog 等)来:
|
||
|
||
- 实时监控安全日志
|
||
- 设置告警规则
|
||
- 生成安全报告
|
||
- 可视化安全事件
|
||
|
||
### 3. 日志分析
|
||
|
||
使用日志分析工具可以:
|
||
|
||
- 识别攻击模式
|
||
- 发现潜在的安全威胁
|
||
- 追踪用户行为
|
||
- 生成合规报告
|
||
|
||
## 扩展功能
|
||
|
||
### SecurityLogger 服务
|
||
|
||
系统提供了 `SecurityLogger` 服务类,可以用于记录其他安全事件:
|
||
|
||
```php
|
||
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 配置
|