# SEC — Security Architecture & Threat Model — | | | |---|---| | **Version** | 1.0 | | **Date** | YYYY-MM-DD | | **Author** | (skill sa-2-architecture) | | **Status** | 🟡 Draft | | **Approved by** | **Security: —** · Tech Lead: — | | **Source** | SAD_… v1.0 · DAT_… v1.0 · RBAC_… của BA · chính sách bảo mật … | | **Scope** | | | **Confidence** | 🟡 | ## Change Log | Version | Date | Người sửa | Thay đổi | ADR | |---|---|---|---|---| | 1.0 | | | Bản đầu | — | > 🔴 **Security có quyền phủ quyết AG2.** Tài liệu này phải được làm **cùng** người của > Security, không phải trình cho họ xem lúc cuối. Phát hiện muộn nhất và đau nhất luôn đến từ đây. --- ## 1. Ranh giới tin cậy *Nơi dữ liệu đi từ vùng ít tin cậy sang vùng tin cậy hơn. Mỗi ranh giới phải có kiểm tra đầu vào.* ```mermaid flowchart LR ``` | # | Ranh giới | Từ vùng | Sang vùng | Kiểm tra gì tại đây | `CMP` chịu trách nhiệm | |---|---|---|---|---|---| | 1 | Internet → hệ thống | không tin cậy | | xác thực, giới hạn tốc độ, kích thước payload, kiểm tra định dạng | | | 2 | Service → CSDL | | | | | ## 2. Xác thực | | Quyết định | `ADR` | |---|---|---| | **Cơ chế** | session / JWT / OAuth2 + OIDC / mTLS | | | **Nơi giữ trạng thái** | server-side / stateless token | | | **Thời hạn access token** | | | | **Refresh token** | có/không · thời hạn · xoay vòng không | | | **Cách thu hồi ngay lập tức** | *(bắt buộc trả lời — token stateless thu hồi bằng gì)* | | | **Đa yếu tố (MFA)** | với vai trò nào | | | **Nơi ký/xác minh chữ ký** | khoá ở đâu, xoay bao lâu một lần | | 🔴 **JWT stateless không thu hồi được ngay** trừ khi có danh sách chặn. Nhân viên nghỉ việc lúc 9h mà token còn hiệu lực tới 10h là rủi ro thật — quyết định ở đây, không để dev tự xử lý. ## 3. Phân quyền | | Quyết định | `ADR` | |---|---|---| | **Mô hình** | RBAC / ABAC / kết hợp | | | **Chỗ ra quyết định** | gateway / từng service / thư viện chung | | | **Nguồn sự thật của vai trò** | | | | **Ràng buộc dữ liệu (row-level)** | có/không · cơ chế | | 🔴 **Phân quyền ở gateway không đủ khi có ràng buộc dữ liệu.** "Chỉ xem cửa hàng mình phụ trách" là điều kiện trên dữ liệu — gateway không biết. Phải quyết ở service, và phải nhất quán. ### 3.1 Map `RBAC` của bộ BA xuống quyền kỹ thuật | `ROLE-nn` (BA) | Vai trò kỹ thuật | Quyền trên `IF-nnn` | Ràng buộc dữ liệu | Ai gán vai trò này | |---|---|---|---|---| | `ROLE-01` | | `IF-001` đọc | 🔶 chỉ cửa hàng phụ trách | | Mỗi `ROLE-nn` trong `RBAC` của BA phải có đúng một dòng ở đây. Thiếu ⇒ chặn AG2. ### 3.2 Phân tách nhiệm vụ (SoD) *Cho các hành động phê duyệt / chốt sổ / chuyển tiền.* | Hành động | Người thực hiện không được đồng thời là | Cơ chế cưỡng chế | |---|---|---| ## 4. Threat model — STRIDE *Làm cho mỗi luồng nhạy cảm: đăng nhập, thanh toán, dữ liệu cá nhân, thao tác quản trị, xuất dữ liệu.* ### 4.1 Luồng: | ID | Loại (STRIDE) | Mối đe doạ | Thành phần bị nhắm | Mức | Biện pháp | **Cách kiểm chứng biện pháp có hiệu lực** | `FIT`/`QAS` | |---|---|---|---|---|---|---|---| | `THR-01` | Spoofing | | | 🔴 | | pentest / kiểm thử tự động / review thủ công định kỳ | | | `THR-02` | Tampering | | | | | | | | `THR-03` | Repudiation | | | | audit log ghi … | | | | `THR-04` | Information disclosure | | | | | | | | `THR-05` | Denial of service | | | | giới hạn tốc độ … | | | | `THR-06` | Elevation of privilege | | | | | | | 🔴 **Cột "cách kiểm chứng" không được để trống.** Biện pháp không kiểm chứng được là biện pháp tồn tại trên giấy — đúng theo quy tắc `D8`. ### 4.2 Mối đe doạ đã chấp nhận | `THR` | Vì sao chấp nhận | Ai ký · ngày | Dấu hiệu cảnh báo | Kế hoạch nếu xảy ra | |---|---|---|---|---| ## 5. Bảo vệ dữ liệu | | Quyết định | |---|---| | Mã hoá in-transit | TLS … · nội bộ có mã hoá không | | Mã hoá at-rest | cấp nào (đĩa / CSDL / trường) · khoá quản lý ở đâu | | Trường nào mã hoá ở mức trường | *(tham chiếu `DAT` §5)* | | Che dữ liệu khi hiển thị / khi log | quy tắc cụ thể | | Dữ liệu ở môi trường non-prod | ẩn danh hoá / dữ liệu sinh / **cấm dùng dữ liệu thật** | 🔴 **Dữ liệu production trên môi trường dev là vi phạm phổ biến nhất và dễ tránh nhất.** Chốt rõ ở đây và cưỡng chế bằng `FIT`. ## 6. Quản lý secret | | Quyết định | |---|---| | Nơi lưu | | | Cách ứng dụng lấy | | | Xoay khoá: tần suất, tự động hay thủ công | | | **Cấm tuyệt đối** | secret trong mã nguồn, trong biến môi trường ghi vào log, trong ảnh container | | Cách phát hiện rò rỉ | quét mã nguồn: … · `FIT-nn` | ## 7. Audit log | Hành động phải ghi | Ghi những trường gì | Ai đọc được | Giữ bao lâu | Chống sửa bằng cách nào | |---|---|---|---|---| | Đăng nhập / thất bại | | | | | | Thay đổi quyền | | | | | | Truy cập dữ liệu nhạy cảm | | | | | | Phê duyệt / chốt sổ | | | | | 🔴 **Audit log mà người bị audit sửa được thì không phải audit log.** Ghi rõ cơ chế chống sửa (append-only, tài khoản riêng, hệ thống tách biệt). ## 8. Tuân thủ | Yêu cầu | Nguồn | Cách đáp ứng | Bằng chứng cho kiểm toán | Ai xác nhận | |---|---|---|---|---| | | GDPR / PCI-DSS / K-ISMS / nội bộ | | | | ## 9. Phụ thuộc & chuỗi cung ứng | | Quyết định | |---|---| | Quét lỗ hổng thư viện | công cụ · tần suất · ngưỡng chặn build | | Quét ảnh container | | | Chính sách vá lỗ hổng nghiêm trọng | trong bao lâu | | Ai duyệt thư viện mới | | ## 10. Giả định & Ngoài phạm vi **Giả định:** | ID | Giả định | Cách xác minh | Nếu sai | |---|---|---|---| **Ngoài phạm vi:** - *(ví dụ: không chống được kẻ tấn công có quyền quản trị hạ tầng — rủi ro này do quy trình nhân sự và kiểm soát truy cập cloud xử lý, không do kiến trúc ứng dụng)* ## 11. Open Questions | ID | Câu hỏi | Hỏi ai | Từ ngày | Chặn gì | Hệ quả nếu trả lời ngược | |---|---|---|---|---|---|