# 風險評估模組實作完成報告

## 📅 完成日期
2025-10-31

## 🎯 實作目標
根據 ISO 27001 規範，建立完整的風險評估與管理系統，對應階段二的第一個核心功能：**風險評估模型 (2.1.1)**

## ✅ 完成項目

### 1. 資料模型 (Models)

#### 核心模型
- **Risk (風險登記表)**
  - 支援完整的風險生命週期管理
  - 自動計算風險值（可能性 × 影響度）
  - 自動判定風險等級（低/中/高/極高）
  - 支援殘餘風險評估
  - 關聯資產、威脅、脆弱性

- **RiskCategory (風險類別)**
  - 資訊安全、營運風險、法規遵循、技術風險、人員風險

- **ThreatSource (威脅來源)**
  - 6種威脅類型：自然災害、技術故障、人為疏失、惡意攻擊、外部威脅、內部威脅
  - 包含威脅描述與範例

- **Vulnerability (脆弱性)**
  - 系統脆弱性資料庫
  - 支援多種資產類型關聯

#### 管理模型
- **RiskAssessment (風險評估記錄)**
  - 追蹤歷史評估
  - 記錄評估理由與備註

- **RiskTreatmentAction (風險處理行動)**
  - 處理行動追蹤
  - 進度管理
  - 成本追蹤
  - 驗證流程

- **RiskReview (風險審查記錄)**
  - 定期審查記錄
  - 控制措施有效性評估
  - 建議事項追蹤

### 2. API 端點 (APIs)

#### 基礎 CRUD API
```
GET    /api/risks/categories/          # 風險類別列表
POST   /api/risks/categories/          # 新增類別
GET    /api/risks/categories/{id}/     # 類別詳情
PUT    /api/risks/categories/{id}/     # 更新類別
DELETE /api/risks/categories/{id}/     # 刪除類別

GET    /api/risks/threats/             # 威脅來源列表
POST   /api/risks/threats/             # 新增威脅
...

GET    /api/risks/vulnerabilities/     # 脆弱性列表
POST   /api/risks/vulnerabilities/     # 新增脆弱性
...

GET    /api/risks/risks/               # 風險列表
POST   /api/risks/risks/               # 新增風險
GET    /api/risks/risks/{id}/          # 風險詳情
PUT    /api/risks/risks/{id}/          # 更新風險
DELETE /api/risks/risks/{id}/          # 刪除風險
```

#### 進階功能 API
```
GET    /api/risks/risks/statistics/    # 風險統計
       返回：
       - 總風險數量
       - 各等級風險數量 (critical/high/medium/low)
       - 按狀態分組統計
       - 按處理方式分組統計
       - 按類別分組統計
       - 平均風險值
       - 平均殘餘風險值
       - 待審查風險數量
       - 逾期處理行動數量

GET    /api/risks/risks/risk_matrix/   # 風險矩陣 (5x5)
       返回：
       - 矩陣數據 (5x5 陣列)
       - 各格風險詳情

POST   /api/risks/risks/{id}/assess/   # 新增評估記錄
POST   /api/risks/risks/{id}/add_treatment_action/  # 新增處理行動
POST   /api/risks/risks/{id}/review/   # 新增審查記錄
POST   /api/risks/risks/{id}/close/    # 關閉風險

POST   /api/risks/treatment-actions/{id}/update_progress/  # 更新進度
POST   /api/risks/treatment-actions/{id}/verify/           # 驗證完成
```

#### 查詢參數支援
- **風險列表篩選**：
  - `status`: 按狀態篩選 (identified/assessed/treated/monitored/closed)
  - `risk_level`: 按風險等級篩選 (low/medium/high/critical)
  - `treatment_option`: 按處理方式篩選 (accept/mitigate/transfer/avoid)
  - `category`: 按類別ID篩選
  - `owner`: 按負責人ID篩選
  - `high_risk=true`: 只顯示高風險
  - `pending_review=true`: 只顯示待審查風險
  - `search`: 搜尋風險編號、標題、描述

- **威脅來源篩選**：
  - `threat_type`: 按威脅類型篩選

- **處理行動篩選**：
  - `risk`: 按風險ID篩選
  - `status`: 按狀態篩選
  - `responsible_person`: 按負責人篩選
  - `my_actions=true`: 我負責的行動
  - `overdue=true`: 逾期的行動

### 3. 序列化器 (Serializers)

- `RiskListSerializer`: 列表用（精簡版）
- `RiskDetailSerializer`: 詳情用（完整版，包含關聯資料）
- `RiskCreateUpdateSerializer`: 創建/更新用（含驗證）
- `RiskStatisticsSerializer`: 統計資料用
- `RiskMatrixSerializer`: 風險矩陣用

### 4. Django Admin 管理介面

完整的後台管理功能：
- 風險類別管理
- 威脅來源管理
- 脆弱性管理
- 風險管理（含內嵌評估記錄和處理行動）
- 風險評估記錄管理
- 風險處理行動管理
- 風險審查記錄管理

### 5. 測試資料

建立了 `seed_risk_data` 管理命令，自動創建：
- ✅ 5 個風險類別
- ✅ 5 個威脅來源範例
- ✅ 4 個脆弱性範例
- ✅ 3 個風險記錄範例（不同風險等級）

執行方式：
```bash
docker compose exec backend python manage.py seed_risk_data
```

## 📊 資料模型關係圖

```
┌─────────────────┐
│  RiskCategory   │
│  (風險類別)      │
└────────┬────────┘
         │
         │ 1:N
         ▼
┌─────────────────┐         ┌──────────────┐
│  ThreatSource   │         │ Vulnerability│
│  (威脅來源)      │         │ (脆弱性)      │
└────────┬────────┘         └──────┬───────┘
         │                         │
         │ 1:N                     │ 1:N
         ▼                         ▼
    ┌────────────────────────────────┐
    │          Risk (風險)            │
    │  ─────────────────────────     │
    │  • 基本資訊                     │
    │  • 威脅與脆弱性                 │
    │  • 風險評估 (可能性×影響度)     │
    │  • 風險處理                     │
    │  • 殘餘風險                     │
    │  • 責任與狀態                   │
    └────┬────────┬─────────┬────────┘
         │        │         │
         │ 1:N    │ 1:N     │ N:M
         ▼        ▼         ▼
    ┌─────────┐ ┌─────────┐ ┌────────┐
    │RiskAssmt│ │RiskTreat│ │ Asset  │
    │(評估記錄)│ │(處理行動)│ │(資產)  │
    └─────────┘ └─────────┘ └────────┘
         │
         │ 1:N
         ▼
    ┌─────────┐
    │RiskReview│
    │(審查記錄)│
    └─────────┘
```

## 🎨 風險計算邏輯

### 風險值計算
```
風險值 = 可能性 × 影響度

可能性等級 (1-5):
1 = 極不可能 (< 10%)
2 = 不太可能 (10-30%)
3 = 可能     (30-50%)
4 = 很可能   (50-80%)
5 = 幾乎確定 (> 80%)

影響度等級 (1-5):
1 = 微不足道 (< 10萬損失)
2 = 輕微     (10-50萬)
3 = 中等     (50-200萬)
4 = 嚴重     (200-1000萬)
5 = 災難性   (> 1000萬)
```

### 風險等級判定
```python
def calculate_risk_level(score):
    if score <= 5:
        return 'low'       # 低風險 (綠色)
    elif score <= 12:
        return 'medium'    # 中風險 (黃色)
    elif score <= 20:
        return 'high'      # 高風險 (橘色)
    else:
        return 'critical'  # 極高風險 (紅色)
```

### 風險矩陣示意圖
```
影響度 ↑
  5 │  5   10   15   20   25
  4 │  4    8   12   16   20
  3 │  3    6    9   12   15
  2 │  2    4    6    8   10
  1 │  1    2    3    4    5
    └──────────────────────→ 可能性
      1    2    3    4    5

顏色標示：
■ 1-5:   綠色 (低風險)
■ 6-12:  黃色 (中風險)
■ 13-20: 橘色 (高風險)
■ 21-25: 紅色 (極高風險)
```

## 📋 使用範例

### 1. 創建風險

```http
POST /api/risks/risks/
Content-Type: application/json
Authorization: Bearer {token}

{
  "risk_number": "RSK-004",
  "title": "雲端服務供應商中斷",
  "description": "AWS 區域故障導致服務無法使用",
  "category": "{category_uuid}",
  "threat_source": "{threat_uuid}",
  "vulnerability": "{vulnerability_uuid}",
  "likelihood": 2,
  "impact": 4,
  "treatment_option": "mitigate",
  "treatment_plan": "1. 使用多區域部署\n2. 建立備援方案",
  "owner": "{user_uuid}",
  "status": "identified"
}
```

### 2. 查詢高風險項目

```http
GET /api/risks/risks/?high_risk=true
Authorization: Bearer {token}
```

### 3. 取得風險統計

```http
GET /api/risks/risks/statistics/
Authorization: Bearer {token}
```

響應範例：
```json
{
  "total_risks": 10,
  "critical_risks": 1,
  "high_risks": 3,
  "medium_risks": 4,
  "low_risks": 2,
  "risks_by_status": {
    "identified": 3,
    "assessed": 4,
    "treated": 2,
    "monitored": 1
  },
  "average_risk_score": 12.5,
  "pending_reviews": 2,
  "overdue_treatments": 1
}
```

### 4. 新增風險評估

```http
POST /api/risks/risks/{risk_id}/assess/
Authorization: Bearer {token}

{
  "likelihood": 3,
  "impact": 4,
  "likelihood_rationale": "過去一年發生過2次類似事件",
  "impact_rationale": "會影響主要業務系統運作",
  "notes": "需要密切監控"
}
```

## 🔧 技術實作細節

### 權限控制
- 所有 API 都需要認證 (`IsAuthenticated`)
- 使用 JWT Token 認證
- 後續可擴展為 RBAC（角色基礎存取控制）

### 資料驗證
- 可能性和影響度範圍驗證 (1-5)
- 風險編號唯一性驗證
- 業務邏輯驗證

### 效能優化
- 使用 `select_related` 和 `prefetch_related` 優化查詢
- 支援分頁
- 支援排序和篩選

### 擴展性設計
- 模型欄位保留擴展空間
- 預留控制措施關聯（待 controls app 完成）
- 支援自訂風險類別和威脅來源

## 📂 檔案結構

```
backend/risks/
├── __init__.py
├── models.py                    # 7個資料模型
├── serializers.py               # 完整的序列化器
├── views.py                     # ViewSets + 進階功能
├── urls.py                      # URL 路由配置
├── admin.py                     # Django Admin 配置
├── apps.py
├── tests.py
├── migrations/
│   └── 0001_initial.py          # 初始遷移
└── management/
    └── commands/
        └── seed_risk_data.py    # 測試資料生成命令
```

## 🎯 下一步計劃

根據 plan.md 的規劃，接下來的核心功能是：

### 2.1.2 資產 CIA 評估 (未開始)
- [ ] 機密性 (Confidentiality) 評估介面
- [ ] 完整性 (Integrity) 評估介面
- [ ] 可用性 (Availability) 評估介面
- [ ] 自動風險等級計算

### 2.1.3 風險報告生成 (未開始)
- [ ] 個別資產風險報告
- [ ] 整體風險評估報告
- [ ] 風險趨勢分析圖表
- [ ] PDF 報告匯出

### 2.1.4 風險監控儀表板 (未開始)
- [ ] 前端儀表板實作
- [ ] 高風險資產警示
- [ ] 風險分佈統計圖
- [ ] 風險變化趨勢
- [ ] 待處理風險清單

## ✨ 總結

本次實作完成了完整的風險評估模型和 API，包含：
- ✅ 7個資料模型
- ✅ 15+ API端點
- ✅ 風險自動計算邏輯
- ✅ 完整的CRUD操作
- ✅ 進階統計和矩陣功能
- ✅ Django Admin管理介面
- ✅ 測試資料生成命令

這為後續的風險管理功能（CIA評估、報告生成、儀表板）建立了堅實的基礎。

---

**完成時間**: 2025-10-31 16:40 UTC
**開發者**: AI Assistant
**狀態**: ✅ 已完成並測試
