# 安全日志记录

## 概述

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

## 功能特性

### 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 配置
