81 KiB
SEC — Security Architecture & Threat Model — e-commerce
| Version | 1.1 |
| Date | 2026-09-15 |
| Author | SA (skill sa-2-architecture, chế độ go, hoạt động sec) |
| Status | 🟡 Draft (duyệt từng phần — xem Approved by; AG2 cần cả ba vai trò Tech Lead/Security/Ops-SRE ký, mới có một chữ ký thay có điều kiện — chưa đủ điều kiện chuyển 🔵 Approved) |
| Approved by | Tech Lead: Điều phối dự án (uỷ quyền, chế độ chạy thử — ký thay theo ngoại lệ DEC-01, không phải chữ ký Tech Lead thật) — duyệt từng phần bản v1.0 · 2026-09-15: ghi nhận nội dung 31 THR STRIDE (§4), map ROLE-01/02 (§3.1), mô hình authn/authz đề xuất (§2, §3), SAQ A (§8.1), đề xuất rate limit 30/10/10 req/phút (§5.3, ASM-40), quản lý secret/scanning (§6), audit log theo phương án (a) (§7). Chốt TẠM hướng OQ-050: chọn PA-3 (service JWT ngắn hạn ký bởi Identity & Access) cho service-to-service authn (§2.4) — yêu cầu SA viết ADR-015 (Proposed) ở lượt hoạt động adr kế tiếp, cùng lúc với ADR-014 (Outbox) đang nợ; OQ-050 giữ nguyên mở, chờ Security + Ops/SRE thật xác nhận trước khi Accepted. KHÔNG ký thay Security — mọi kết luận PII/residency/retention (§5, §8.2) vẫn là đề xuất chờ Legal/Security, chưa có hiệu lực. Ghi thêm DEC-28. Security: — (chưa có người được chỉ định — OQ-007, mở từ GĐ1. SEC CHƯA CÓ HIỆU LỰC PHỦ QUYỀN AG2 cho tới khi có người này; không ký thay ở lượt này) · Ops/SRE: — (chưa ký). OQ-004 (tính hợp lệ ký thay) vẫn mở. Confidence giữ nguyên 🔴 — duyệt từng phần không phải bằng chứng nguồn mới. Status giữ 🟡 Draft — AG2 chưa đủ ba chữ ký thật/hợp lệ. |
| Source | 02-architecture/SAD_e-commerce_v1.0.md v1.3 §3, §4, §4.1, §7 · 02-architecture/DAT_e-commerce_v1.0.md v1.0 §1, §5, §5.1, §5.2, §6, §9 · 02-architecture/ICD_e-commerce_v1.0.md v1.0 §1, §2, §3.1–§3.7 · 02-architecture/FAIL_e-commerce_v1.0.md v1.1 §1, §5 (FM-06 ownership fail-closed, E-CART-0007) · 02-architecture/QAS_e-commerce_v1.0.md QAS-010/011/012 · 02-architecture/ASR_e-commerce_v1.0.md ASR-002/004/007/008/009 · 02-architecture/adr/ADR-002_*.md, ADR-004_*.md, ADR-007_*.md, ADR-008_*.md, ADR-009_*.md, ADR-011_*.md, ADR-015_*.md · 01-context/CTX_e-commerce_v1.0.md §4.2 (đối tác ngoài) · 01-context/ARISK_e-commerce_v1.0.md §3 (ARISK-03/04/06) · 00-index/OQ_e-commerce.md v1.21 · 00-index/DEC_e-commerce.md v1.24 · ba-output/e-commerce/02-analysis/RBAC_CartCheckout_v1.0.md §1, §2, §4, §5, §6, §8 · ba-output/e-commerce/03-specification/NFR_US002-003_v1.0.md §3 · e-commerce/docs/sections/08-bao-mat.md (P1, chỉ tham khảo — xem cảnh báo §0.2, KHÔNG kế thừa kiến trúc ~10 microservices/Kafka của tài liệu đó) |
| Scope | Toàn sàn e-commerce theo P2 (SAD v1.3, 15 CMP). Chi tiết nhất: Cart & Order (CMP-04), Payment (CMP-11/CMP-14), Identity & Access (CMP-02), và luồng chia sẻ PII cho seller khi tách đơn (ADR-008, DAT §5). Các CMP còn lại (Seller Mgmt, Commission, Promotion, Review, Notification, Shipping) ở mức ranh giới tin cậy + authz tổng quát, không đào sâu threat model riêng — đây là hoạt động 6/9 (sec) của sa-2-architecture. |
| Confidence | 🔴 Giả định chưa xác minh — theo yêu cầu điều phối, tiếp nối Confidence 🔴 của SAD/ICD/DAT/FAIL/ASR/QAS. AG1 chưa ký thật; AG2 chưa tới hạn; ADR-002/004/007/008/009/011 đều Proposed (chưa Accepted); ADR-008 (PII) chặn hoàn toàn vì chưa có đại diện Pháp chế/Bảo mật (OQ-007); không đối tác ngoài nào (VNPay/Momo/GHN/GHTK) có sandbox/tài liệu API thật (ARISK-03/04) để xác minh cơ chế chữ ký webhook thật. Mọi ngưỡng rate-limit/circuit/authn trong tài liệu này là đề xuất SA, chưa Security/Tech Lead xác nhận. |
Change Log
| Version | Date | Người sửa | Thay đổi | ADR/DEC |
|---|---|---|---|---|
| 1.0 | 2026-09-15 | SA (qua skill sa-2-architecture, chế độ go, hoạt động sec) |
Bản đầu — hoạt động 6/9 của GĐ2. Threat model STRIDE cho 8 ranh giới tin cậy (client↔ALB/WAF, ALB↔Nhóm Giao dịch, Nhóm Giao dịch↔Nhóm Hỗ trợ cross-network IF-021/022, Cart&Order↔Payment IF-006, Payment↔VNPay/Momo + webhook inbound, Shipping↔GHN/GHTK webhook, app↔RDS/Redis/SQS, Admin console) — 28 THR-01…28, mỗi cái truy về QAS/ASR/ADR nguồn. Mô hình authn cho Guest/Customer/Seller/Admin + đề xuất mới cho service-to-service (Nhóm Giao dịch↔Nhóm Hỗ trợ↔Payment — chưa có cơ chế, radar ước lượng ~6, ADR ứng viên chưa viết). Mô hình authz: map đủ ROLE-01/02 của RBAC_CartCheckout xuống quyền kỹ thuật, fail-closed cho ownership check (E-CART-0007, theo FAIL). Phân loại PII/mã hoá/masking/residency — toàn bộ đánh dấu "đề xuất chờ Legal/Security" (OQ-007). PCI-DSS SAQ A: xác nhận ranh giới ADR-002, đề xuất bắt buộc tích hợp dạng redirect (chưa xác nhận với đối tác thật — OQ-048 mới); webhook: cơ chế chữ ký thật chưa biết (chưa bịa — OQ-049 mới, ARISK-03/04), chống replay theo ADR-004. Đề xuất số cụ thể cho rate limit Guest cart (OQ-023), login brute-force (OQ-052 mới), checkout. Quản lý secret (Secrets Manager, rotation), quét dependency/container (Trivy/Snyk), pentest năm + ASV quý (OQ-017 đã mở ở TCO). Audit log theo phương án (a) đã chốt TẠM ở OQ-047 (mỗi module tự ghi) — chốt trường bắt buộc + retention. Đối chiếu docs/sections/08-bao-mat.md chỉ tham khảo (P1, §0.2). Đề xuất FIT-29…33 cho GĐ3 (authz test tự động, secret scan, service-authn test, webhook signature test, audit completeness test). Thêm OQ-048…053, cập nhật OQ-007/023/024, ASM-39…41. Ghi ngoại lệ tiếp tục gate ở DEC-27 (00-index/DEC_e-commerce.md), tiếp nối DEC-01…26. Không sửa SAD/ICD/DAT/FAIL/ADR đã có. Confidence 🔴 toàn bộ. |
DEC-27 |
| 1.0 | 2026-09-15 | Điều phối dự án (thay mặt Tech Lead, ngoại lệ DEC-01) — tác vụ sign/approve |
Duyệt từng phần: ghi nhận nội dung 31 THR STRIDE (§4), map ROLE-01/02 (§3.1), mô hình authn/authz đề xuất (§2, §3), SAQ A (§8.1), đề xuất rate limit 30/10/10 req/phút (§5.3, ASM-40), quản lý secret/scanning (§6), audit log theo phương án (a) (§7). Chốt TẠM OQ-050: chọn PA-3 (service JWT ngắn hạn) cho service-to-service authn (§2.4) — yêu cầu SA viết ADR-015 (Proposed) ở lượt hoạt động adr kế tiếp cùng ADR-014; OQ-050 giữ nguyên mở, chờ Security + Ops/SRE. KHÔNG ký thay Security — header Approved by → Security giữ —, SEC chưa có hiệu lực phủ quyết AG2 (OQ-007); mọi kết luận PII/residency/retention (§5, §8.2) vẫn là đề xuất chờ Legal/Security, không phải quyết định cuối. Không đổi nội dung chuyên môn nào của tài liệu. Ops/SRE chưa ký; Confidence giữ 🔴; Status giữ 🟡 Draft; AG2 chưa ký. Ghi thêm DEC-28. |
DEC-28 |
| 1.1 | 2026-09-15 | SA (qua skill sa-2-architecture, chế độ go, hoạt động adr) |
Chỉ link ADR, không đổi nội dung. ADR-015 (Service JWT ngắn hạn service-to-service, Proposed) vừa được viết theo hướng PA-3 đã chọn TẠM ở §2.4/OQ-050/DEC-28 — thay các dòng "chưa viết ADR" ở §2.4 và THR-09/THR-13 (§4.3/§4.4) bằng đường dẫn adr/ADR-015_service-jwt-xac-thuc-service-to-service.md. OQ-050 giữ nguyên mở (chặn cứng bởi OQ-007 — Security chưa có người, xem ADR-015 §0/§3). Không sửa nội dung chuyên môn nào khác của SEC. Ghi DEC-31 (tiếp nối DEC-01…30). |
ADR-015, DEC-31 |
Sơ đồ thắng về quan hệ và luồng (ai gọi ai, qua ranh giới nào). Bảng/văn bản thắng về ràng buộc và con số (ngưỡng rate-limit, TTL token, mức che dữ liệu). Mâu thuẫn ngoài hai loại trên là lỗi tài liệu, phải sửa chứ không chọn bên (
D12).
0. Ghi chú Preflight & phạm vi — bắt buộc đọc trước
0.1 Ngoại lệ gate
AG1 vẫn chưa ký thật; AG2 (gate của chính GĐ2) chưa tới hạn. Theo SKILL.md, hoạt động 1
(QAS) → 2 (ASR) → 3 (SAD) đã hoàn tất và được duyệt từng phần (DEC-12/14/16); hoạt động 4
(ICD), 5 (DAT), 8 (FAIL) đã chạy (DEC-18…25), ADR-001…013 đã viết (tất cả Proposed).
Điều kiện đầu vào cho hoạt động 6 (SEC) — SAD, DAT, RBAC của BA — đã đủ. Người dùng (vai
điều phối dự án chạy thử) đã được cảnh báo lại và khẳng định muốn tiếp tục.
DEC-27 (SA) — Tiếp tục
sa-2-architecture(hoạt động 6 —SEC) cho e-commerce trong khi AG1 chưa ký thật và AG2 chưa tới hạn — tiếp nốiDEC-01…26. Quyết định: Dựng threat model STRIDE + mô hình authn/authz + phân loại PII cho toàn sàn P2 dựa trênSAD v1.3/DAT v1.0/ICD v1.0/FAIL v1.1/RBAC_CartCheckoutđã có, giữConfidence 🔴cho tới khi: (a) AG1/AG2 ký thật, (b) có đại diện Pháp chế/Bảo mật thật (OQ-007) — điều kiện chặn cứng nhất, không cóSECnào có hiệu lực phủ quyết PII/residency nếu thiếu người này, (c) đối tác VNPay/Momo/GHN/GHTK có tài liệu/sandbox thật để xác minh cơ chế chữ ký webhook (ARISK-03/04), (d) Tech Lead xác nhận các đề xuất mới (service-to-service authn, ngưỡng rate-limit, account lockout). Người quyết: Điều phối dự án (đại diện PO, dự án chạy thử). Radar (ước lượng cho việc tiếp tục dưới ngoại lệ): ~4 — chi phí đảo ngược thấp (ghi tài liệu threat model, chưa có dòng code phụ thuộc) · bán kính ảnh hưởng: hoạt độnginfkế tiếp và toàn bộ dev dùngSEClàm nguồn sự thật authn/authz/PII, nhưng bản thân việc ghi tài liệu dưới ngoại lệ thì nhỏ · có chạmQAS-010/011/012Must trực tiếp (đang thiết kế cách đạt chúng) nhưng chưa phải cam kết thi công (chưaFITnào chạy) · không ràng buộc dài hạn tự thân (văn bảnSECsửa được qua version mới) · không tranh cãi mới, tiếp nối tiền lệDEC-11…26→ ghiDEC-nn, không cầnADRcho việc chạy dưới ngoại lệ (decision-radar.md §1–§2). Hệ quả nếu không chấp nhận ngoại lệ: hoạt độnginf(hoạt động 7) không có mô hình threat/ authn/authz để thiết kế network segmentation và secret management thật — chậm tiến độ chạy thử tương ứng thời gian xử lý cácOQđang mở, đặc biệtOQ-007(chặnADR-008và phần lớn §5).
0.2 Đối chiếu docs/sections/08-bao-mat.md — chỉ tham khảo, không kế thừa
docs/sections/08-bao-mat.md (P1, status: approved, version: 2) là thiết kế bảo mật cho
kiến trúc ~10 microservices + Kafka/MSK + database-per-service — kiến trúc đó đã bị loại
ở OPT §5 (GĐ1), thay bằng P2 (modular monolith + managed AWS, Payment tách riêng). Tài liệu này
chỉ tái dùng: (a) quy ước đặt tên mã lỗi (403 ERR_FORBIDDEN_OWNERSHIP, 423 ERR_ACCOUNT_LOCKED), (b) ý tưởng chính sách khoá tài khoản theo vai trò (§8.1.1a), (c) ý tưởng
redact PII trong audit log (§8.2.5a), (d) danh mục OWASP Top 10 rà theo endpoint — không kế
thừa cấu trúc scope customer:*/seller:*/admin:* gắn với 10 service riêng, không kế thừa
giả định Kafka/MSK ACL (P2 dùng SQS FIFO/EventBridge, đã có ở ADR-005), không kế thừa bảng
audit_log tập trung một Service Audit & Compliance (P2 chọn phương án (a) — mỗi module tự ghi,
OQ-047). Mọi chỗ tái dùng được đánh dấu rõ "tham khảo P1" trong bảng tương ứng bên dưới.
🔴 Nhắc quan trọng: INF (hoạt động 7) chưa được tạo. Tài liệu này là input trực tiếp cho
INF — đặc biệt network segmentation (§1), secret management (§6), và ngưỡng alerting an ninh.
1. Ranh giới tin cậy
8 ranh giới theo yêu cầu người duyệt. Mỗi ranh giới phải có kiểm tra đầu vào tại đúng điểm giao.
flowchart LR
subgraph NET["Internet — không tin cậy"]
U["Guest/Customer/Seller/Admin"]
VNP["VNPay"]
MOMO["Momo"]
GHN["GHN"]
GHTK["GHTK"]
end
subgraph EDGE["Vùng biên — TB1"]
WAF["WAF + ALB (CMP-01)"]
end
subgraph GD["Nhóm Giao dịch — TB2 (tin cậy vừa)"]
ID["Identity & Access (CMP-02)"]
CAT["Catalog & Inventory (CMP-03)"]
CO["Cart & Order (CMP-04)"]
end
subgraph HT["Nhóm Hỗ trợ — tin cậy vừa (khác network TB2)"]
PROMO["Promotion & Loyalty (CMP-07)"]
SELLER["Seller Mgmt (CMP-05)"]
SHIP["Shipping & Fulfillment (CMP-10)"]
end
subgraph PAY["Payment Service — TB4 (cô lập PCI, tin cậy cao nhất nội bộ)"]
PS["Payment (CMP-11)"]
end
subgraph DATA["Vùng dữ liệu — TB5"]
RDS[("RDS chính")]
RDSPAY[("RDS Payment")]
REDIS[("Redis")]
SQS[("SQS/EventBridge")]
end
subgraph ADMIN["Admin console — TB6"]
ADM["Admin Backoffice"]
end
U -->|"TB1 · HTTPS, WAF+TLS termination"| WAF
WAF -->|"TB2 · HTTPS, authn JWT/Guest"| ID
WAF -->|"TB2"| CAT
WAF -->|"TB2"| CO
WAF -->|"TB4 · HTTPS, cô lập mạng"| PS
ADM -->|"TB6 · HTTPS, MFA + IP allowlist (đề xuất)"| ID
CO -->|"TB3 · REST cross-network, chưa có service-authn"| PROMO
CO -->|"TB3 · REST cross-network"| SELLER
CO -->|"TB4 · REST, chưa có service-authn"| PS
PS -->|"TB-ext · REST sync + webhook async"| VNP
PS -->|"TB-ext"| MOMO
SHIP -->|"TB-ext · REST sync + webhook async"| GHN
SHIP -->|"TB-ext"| GHTK
ID -->|"TB5 · TLS, IAM theo schema"| RDS
CO -->|"TB5"| RDS
CO -->|"TB5"| REDIS
CO -->|"TB5 · publish"| SQS
PS -->|"TB5 · TLS, IAM riêng biệt"| RDSPAY
SQS -->|"TB5 · consume"| HT
Legend: ▭ vùng tin cậy khác nhau bằng subgraph · mũi tên ghi giao thức + loại kiểm tra tại
ranh giới đó · TBn tham chiếu đúng số ranh giới ở bảng dưới.
| # | Ranh giới | Từ vùng | Sang vùng | Kiểm tra gì tại đây | CMP chịu trách nhiệm |
|---|---|---|---|---|---|
| TB1 | Client → ALB/WAF | Internet (không tin cậy) | Biên hệ thống | TLS 1.2+ termination, WAF (OWASP Core Rule Set), rate-limit L7, giới hạn kích thước payload, chặn IP theo reputation (đề xuất) | CMP-01 |
| TB2 | ALB → Nhóm Giao dịch | Biên | Nội bộ tin cậy vừa | Authn hợp lệ (JWT Customer / X-Guest-Session-Id Guest) — KHÔNG authz chi tiết theo dữ liệu (đúng SAD §4.1 "cái CMP-01 KHÔNG làm") |
CMP-01 → CMP-02/03/04 |
| TB3 | Nhóm Giao dịch ↔ Nhóm Hỗ trợ (IF-021/IF-022) |
Nội bộ tin cậy vừa | Nội bộ tin cậy vừa (network khác — 2 ECS Fargate service riêng, OQ-026) |
🔴 Chưa có cơ chế xác thực service-to-service — hiện chỉ có network reachability (security group nội bộ VPC), chưa xác thực danh tính bên gọi. Xem §2.5, THR-09…12 |
CMP-04 ↔ CMP-07/CMP-05 |
| TB4 | Cart & Order → Payment (IF-006) |
Nội bộ tin cậy vừa | Vùng cô lập PCI cao nhất | Tương tự TB3 — chưa có service-authn; đây là ranh giới nhạy cảm nhất vì Payment giữ tiền thật (ASR-002) |
CMP-04 → CMP-11 |
| TB5 | Payment ↔ VNPay/Momo (init sync + webhook inbound async) | Vùng cô lập PCI | Internet (đối tác bên thứ ba) | Chữ ký/HMAC theo tài liệu đối tác (🔴 chưa có, ARISK-03), chống replay (ADR-004, lệch ≤5 phút), TLS |
CMP-11 |
| TB6 | Shipping & Fulfillment ↔ GHN/GHTK webhook | Nhóm Hỗ trợ | Internet (đối tác) | Chữ ký/token theo tài liệu đối tác (🔴 chưa có, ARISK-04), không ghi đè trạng thái thụt lùi (FAIL FM-03/04) |
CMP-10 |
| TB7 | App (mọi CMP) ↔ RDS/Redis/SQS |
Nội bộ tin cậy vừa/cao | Vùng dữ liệu | TLS in-transit, IAM/network ACL theo schema-per-module (ADR-006) — không module nào được truy cập schema của module khác, RDS Payment tách hoàn toàn (ADR-002) |
mọi CMP ứng dụng → CMP-13/14/15/12 |
| TB8 | Admin console → Identity & Access + toàn hệ thống | Internet (giới hạn, đề xuất VPN/IP allowlist) | Nội bộ tin cậy cao | MFA bắt buộc (ASR-009), IP allowlist/VPN (đề xuất — tham khảo P1 §3.3, chưa quyết định hạ tầng cho P2, OQ-050), audit toàn bộ hành động |
CMP-02 (phần Admin) |
🔴 TB3 và TB4 là phát hiện mới của hoạt động sec — SAD/ICD/FAIL đã ghi nhận đây là
cross-network call (OQ-026/028) nhưng chưa từng thiết kế cơ chế xác thực danh tính bên gọi,
chỉ có network reachability. Một service nào đó trong cùng VPC (kể cả bị compromise) có thể gọi
thẳng IF-006/IF-021/IF-022 nếu không có kiểm soát bổ sung. Xem §2.5 (đề xuất) và THR-09/13.
2. Xác thực (Authentication)
| Quyết định | ADR/Nguồn |
|
|---|---|---|
| Cơ chế (Customer) | Bearer JWT | ICD §1 mục 9 — kế thừa 04-api-design.md §4.2, chưa có ADR riêng |
| Cơ chế (Guest) | Header X-Guest-Session-Id (giá trị CSPRNG ≥128-bit) + cookie HttpOnly; Secure; SameSite=Lax |
ICD §1 mục 10 |
| Cơ chế (Seller/Admin) | Bearer JWT (kế thừa cùng cơ chế Customer, khác role claim) |
Suy từ CMP-02, chưa có tài liệu riêng ngoài phạm vi US-002/003 |
| Nơi giữ trạng thái | Stateless (JWT) cho Customer/Seller/Admin · Stateful cho Guest (session lưu ở Redis, CMP-15, theo DAT §1.1) |
DAT §1.1 |
| Thời hạn access token | 🔴 Chưa chốt số cụ thể cho P2 — ICD §1 mục 9 chỉ ghi "~15-60 phút (kế thừa 04-api-design.md §4.2)"; đây là khoảng tham khảo P1, chưa xác nhận cho P2. Đề xuất SA: 15 phút (an toàn hơn, giảm cửa sổ lợi dụng token bị đánh cắp) — xem OQ-051 |
— |
| Refresh token | 🔴 Chưa chốt — đề xuất SA: có, TTL 14 ngày, không áp dụng rotation phức tạp kiểu P1 (docs/08 §8.1.1 refresh token rotation + reuse detection) ở MVP P2 vì tăng độ phức tạp mà chưa có bằng chứng cần thiết cho quy mô hiện tại; ghi nhận là điểm có thể nâng cấp khi có sự cố thật — xem OQ-051 |
Tham khảo P1, không kế thừa nguyên trạng |
| Cách thu hồi ngay lập tức | 🔴 Chưa có cơ chế — JWT stateless không có denylist. Đề xuất SA: denylist Redis theo jti, TTL = thời hạn còn lại của token, tra cứu tại middleware authn mỗi request (thêm ~1 Redis lookup, chấp nhận được vì Redis đã là phụ thuộc sẵn có, CMP-15) — áp dụng khi: đổi mật khẩu, Admin khoá tài khoản, logout (tuỳ chọn). Chưa Tech Lead xác nhận |
OQ-051 (mới) |
| Đa yếu tố (MFA) | Bắt buộc cho Admin, khuyến khích (không bắt buộc) cho Seller (ASR-009, QAS-012). Phương thức: TOTP app (RFC 6238) — chốt TẠM theo OQ-024/DEC-14/ASM-20, chưa Security thật xác nhận, OQ-024 vẫn mở |
ASR-009 |
| Backup code khi mất thiết bị MFA | 🔴 Chưa thiết kế — đề xuất 10 mã dùng một lần khi enroll (tham khảo P1 §8.1.1, không sao chép nguyên bản vì P1 gắn với endpoint /v1/auth/mfa/enroll cụ thể chưa xác nhận tồn tại ở P2) |
OQ-024 |
| Nơi ký/xác minh chữ ký JWT | Identity & Access (CMP-02) ký bằng khoá riêng; các CMP khác chỉ xác minh (không tự ký) |
CMP-02 |
| Xoay khoá ký JWT | 🔴 Chưa chốt tần suất — đề xuất tham khảo chung ngành: 90 ngày, dùng kid trong header JWT để hỗ trợ 2 khoá song song trong giai đoạn chuyển tiếp |
OQ-051 |
2.1 Guest session — chi tiết
| TTL | 30 ngày không hoạt động (ICD §1 mục 10, DAT §1.1) |
| Rotation | 🔴 Không có — cùng một X-Guest-Session-Id dùng suốt vòng đời phiên, không xoay định kỳ. Rủi ro: nếu giá trị bị lộ (session fixation qua log/URL), kẻ tấn công giữ quyền truy cập tới hết TTL. Đề xuất SA: xoay giá trị session tại thời điểm Guest chuyển đổi thành Customer (đăng ký/đăng nhập) — chưa thiết kế chi tiết, ghi OQ-051 |
| Nơi giữ | Redis (CMP-15), là nguồn sự thật của session (không có bản ghi RDS song song, DAT §1.1) |
| Hết hạn | Guest mất phiên, phải tạo giỏ mới (BR-CART §3, đúng thiết kế) |
2.2 Customer JWT — chi tiết
| Thuật toán | 🔴 Chưa chốt — đề xuất RS256 (asymmetric, cho phép các CMP khác chỉ cần public key để verify, không cần chia sẻ secret) thay vì HS256 (symmetric, mọi service verify phải giữ cùng secret — rủi ro lan rộng nếu 1 service bị lộ secret) |
| Claims tối thiểu | sub (customerId), role, iat, exp, jti (phục vụ denylist §2 trên) — chưa chốt scope claim chi tiết, xem §3 |
| TTL access/refresh | Xem bảng §2 trên — cả hai chưa chốt số cuối, OQ-051 |
2.3 Seller / Admin — chi tiết
Ngoài phạm vi chi tiết hoá của module Giỏ hàng & Checkout (RBAC_CartCheckout §1 cố ý không đưa
Seller/Admin vào ma trận) — SEC chỉ ghi nhận yêu cầu tối thiểu do ASR-009 ép ra:
| Seller | JWT giống Customer, role=seller, MFA khuyến khích không bắt buộc |
| Admin | JWT giống Customer, role=platform_admin, MFA bắt buộc (TOTP, ASM-20); đề xuất bổ sung giới hạn mạng (VPN/IP allowlist) — tham khảo P1 docs/08 §3.3, chưa quyết định hạ tầng cho P2 vì INF (hoạt động 7) chưa chạy — ghi OQ-050 |
| Account lockout (brute-force) | 🔴 Chưa thiết kế cho P2 — đề xuất SA (tham khảo ý tưởng P1 docs/08 §8.1.1a, số ngưỡng đề xuất lại cho P2, chưa kế thừa nguyên bản): customer/seller 5 lần sai liên tiếp → khoá 15 phút; platform_admin 3 lần sai liên tiếp → khoá 30 phút (ngưỡng thấp hơn vì quyền hạn cao hơn). Chưa Security/Tech Lead xác nhận — OQ-052 (mới) |
2.4 Service-to-service (Nhóm Giao dịch ↔ Nhóm Hỗ trợ ↔ Payment)
🔴 Đây là khoảng trống kiến trúc phát hiện bởi hoạt động sec — chưa ADR nào (ADR-002,
ADR-007) quyết định cơ chế xác thực giữa hai service nội bộ (chỉ quyết định xác thực
người dùng cuối tới service). IF-006/IF-021/IF-022 hiện chỉ dựa vào network reachability
(security group VPC) — không có gì ngăn một service khác trong cùng VPC giả danh gọi thẳng các
endpoint này nếu security group bị cấu hình sai hoặc một service bị compromise.
Ba phương án đã cân nhắc (quy tắc D3 — chưa viết ADR chính thức, đề xuất cho hoạt động
adr kế tiếp):
| Phương án | Mô tả | Ưu | Nhược |
|---|---|---|---|
| PA-1 — Chỉ dựa network (security group) | Giữ nguyên hiện trạng — không thêm gì | Không tốn công triển khai | Không đáp ứng "defense in depth" cho dữ liệu PII/tiền đi qua TB3/TB4; một security group cấu hình sai = không còn ranh giới nào |
| PA-2 — mTLS qua service mesh (AWS App Mesh/Private CA) | Mỗi ECS task có chứng chỉ riêng, xác thực lẫn nhau ở tầng TLS | Mạnh nhất, chuẩn ngành cho zero-trust nội bộ | Thêm hạ tầng mới (App Mesh) — SAD §7 v1.2 đã ghi rõ "không tự thêm hạ tầng mới (VD internal ALB/App Mesh) vào sơ đồ vì đó là quyết định kiến trúc mới, ngoài phạm vi" — mâu thuẫn trực tiếp với ghi chú đó nếu chọn ngay bây giờ; cần quyết định lại ở inf/adr |
| PA-3 — Service JWT ngắn hạn ký bởi Identity & Access + giữ nguyên security group (đề xuất SA) | Mỗi service tự xin "service token" (JWT riêng, sub=service-name, TTL ngắn ~5 phút) từ Identity & Access qua IAM role (không cần secret tĩnh), đính kèm header khi gọi IF-006/IF-021/IF-022; bên nhận verify chữ ký giống verify JWT người dùng (tái dùng hạ tầng ký/verify đã có) |
Không cần hạ tầng mới ngoài quy ước header + logic verify (tái dùng key JWT của CMP-02); tương thích với ghi chú "không thêm hạ tầng mới" của SAD |
Cần Identity & Access cấp phát token cho service (thêm luồng nội bộ mới, nhỏ); vẫn phụ thuộc network layer làm lớp phòng thủ đầu (không phải mTLS full zero-trust) |
Đề xuất SA: PA-3, vì tương thích với ràng buộc đã ghi ở SAD §7 v1.2 (không thêm hạ tầng mới
ở lượt này) trong khi vẫn nâng được một lớp phòng thủ so với hiện trạng thuần network. Ước lượng
radar theo decision-radar.md §2: chi phí đảo ngược trung bình (đổi cơ chế sau khi đã code tốn
sửa cả hai đầu gọi)=1 · bán kính: mọi lời gọi cross-network nội bộ (TB3, TB4) + tiền lệ cho các
IF tương lai=2 · chạm gián tiếp QAS-002/QAS-010 (thêm bước xin token có thể ăn vào ngân sách
latency đã eo hẹp, cần đo lại)=1 · ràng buộc ≥1 năm (chuẩn nội bộ cho service-to-service)=1 · chưa
tranh cãi=0 → ~5, ở ngưỡng "ADR bắt buộc". Xem
adr/ADR-015_service-jwt-xac-thuc-service-to-service.md
(Proposed, viết ở hoạt động adr kế tiếp). OQ-050 giữ nguyên mở — chặn cứng bởi OQ-007
(Security chưa có người được chỉ định; ADR bảo mật chỉ chuyển Accepted khi có Security thật ký,
xem ADR-015 §0/§3).
🔴 Đây là quyết định chạm cả QAS-002 (latency) lẫn ranh giới hạ tầng — ADR-015 ghi rõ điều
kiện Accepted cần cả Tech Lead lẫn Security (phủ quyết) cùng xác nhận trước khi chốt.
3. Phân quyền (Authorization)
| Quyết định | ADR |
|
|---|---|---|
| Mô hình | RBAC đơn giản (2 vai trò trong phạm vi Cart&Checkout: Guest, Customer) + ABAC nhẹ cho ownership (đối chiếu session_id/customer_id với dữ liệu) |
ADR-007 |
| Chỗ ra quyết định | Service (Cart & Order tự kiểm tra), không phải gateway — CMP-01 chỉ chuyển token/session xuống, đúng SAD §4.1 |
ADR-007 |
| Nguồn sự thật của vai trò | Identity & Access (CMP-02) — role claim trong JWT (Customer/Seller/Admin); Guest không có "vai trò" theo nghĩa RBAC, chỉ có session_id |
CMP-02 |
| Ràng buộc dữ liệu (row-level) | Có — ownership theo customer_id/session_id, cache Redis TTL ngắn, fallback query DB khi cache miss |
ADR-007 |
| Hành vi khi không xác định được quyền (lỗi kỹ thuật, không phải "không có quyền") | Fail-closed — trả 503 (không phải 403), mã lỗi đề xuất E-CART-0007 (theo FAIL §5, chưa có trong SRS/API của BA — OQ-040) khi cả Redis lẫn DB đều lỗi lúc kiểm tra ownership. Không bao giờ mặc định cho phép truy cập khi không kiểm tra được |
FAIL FM-06, OQ-040 |
🔴 Fail-closed là quyết định bảo mật, không phải quyết định hiệu năng — nếu Tech Lead/Dev sau này "tối ưu" bằng cách coi lỗi kỹ thuật = cho phép (fail-open) để giảm tỷ lệ lỗi 503, đó là một lỗ hổng nghiêm trọng (bất kỳ ai cũng xem được giỏ/đơn của người khác khi hệ thống đang có sự cố). Ghi rõ ở đây để Security có căn cứ phủ quyết nếu phát hiện vi phạm khi review code.
3.1 Map RBAC của bộ BA xuống quyền kỹ thuật
RBAC_CartCheckout_v1.0.md §1 chỉ có 2 ROLE-nn trong phạm vi module này (Seller/Admin/CSR/Ops
cố ý không đưa vào — xem RBAC §1). Cả 2/2 đã có dòng dưới đây — đủ điều kiện không chặn AG2 ở
mục này.
ROLE-nn (BA) |
Vai trò kỹ thuật | Claim/định danh | Quyền trên IF-nnn |
Ràng buộc dữ liệu | Ai gán vai trò này |
|---|---|---|---|---|---|
ROLE-01 Guest |
guest (không có tài khoản, không JWT) |
Header X-Guest-Session-Id (§2.1) |
IF-002 — GET/PATCH/DELETE /v1/cart*, POST /v1/checkout |
🔶 chỉ Cart/Order có session_id = giá trị header hiện tại — đối chiếu tại service (ADR-007), fail-closed nếu không kiểm tra được (E-CART-0007) |
Hệ thống tự tạo tại lần truy cập đầu tiên chưa đăng nhập — không ai "gán", không cần phê duyệt |
ROLE-02 Customer |
customer (JWT role=customer) |
sub = customerId trong JWT (§2.2) |
IF-002 — cùng 4 endpoint như Guest |
🔶 chỉ Cart/Order có customer_id = sub — đối chiếu tại service, fail-closed tương tự |
Identity & Access (CMP-02) tự động khi đăng ký/đăng nhập thành công — self-service, không cần phê duyệt nội bộ |
Seller (FR-19, module Quản lý đơn hàng seller) và Admin/CSR/Ops (không có hành động trực tiếp
trong RQ-001…004) ngoài phạm vi map này theo đúng RBAC_CartCheckout §1 — sẽ có RBAC/map
riêng khi module tương ứng tới lượt thiết kế chi tiết. ASR-009 (MFA Admin) vẫn áp dụng xuyên
suốt bất kể module nào Admin thao tác (xem §2.3).
3.2 Phân tách nhiệm vụ (SoD)
Kế thừa nguyên trạng kết luận của RBAC_CartCheckout §3 (BA): không áp dụng được trong phạm
vi module này — mọi hành động (tạo giỏ, tách đơn, chọn thanh toán) là tự phục vụ do chính khách
hàng thực hiện trên dữ liệu của họ, không có bước "người thứ hai duyệt". Việc tách đơn (BR-CART-01)
và xác nhận thanh toán (BR-CART-06) do hệ thống tự động thực hiện theo rule, không phải nhân sự
nội bộ phê duyệt.
| Hành động | Người thực hiện không được đồng thời là | Cơ chế cưỡng chế |
|---|---|---|
| (không có trong phạm vi module Giỏ hàng & Checkout — SoD sẽ cần thiết khi module Quản lý đơn hàng có bước Seller/CSR/Admin can thiệp thủ công, VD duyệt hoàn tiền — ngoài phạm vi tài liệu này) |
4. Threat model — STRIDE
Theo 8 ranh giới tin cậy ở §1. Mỗi THR-nn: loại STRIDE · tài sản bị nhắm · biện pháp · cách
kiểm chứng · truy vết QAS/ASR/ADR.
4.1 TB1 — Client ↔ ALB/WAF
| 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 | Truy vết |
|---|---|---|---|---|---|---|---|
THR-01 |
Spoofing | Đánh cắp JWT/session qua XSS hoặc MITM (nếu TLS bị hạ cấp) | Token Customer, session Guest | 🔴 | TLS 1.2+ bắt buộc + HSTS; access token khuyến nghị giữ trong memory (SPA), không localStorage; cookie Guest HttpOnly;Secure;SameSite=Lax (đã có, ICD §1) |
Test cấu hình TLS/HSTS tự động (FIT-33 ứng viên) + code review chỗ lưu token phía FE |
QAS-010, ASR-007 |
THR-02 |
Tampering | Client gửi giá/số lượng đã bị sửa (tamper qua devtools) để checkout giá thấp hơn | POST /v1/checkout request body |
🟠 | Server luôn tính giá/tổng từ product_variant.price_amount/unit_price_snapshot phía BE, không tin giá trị giá do client gửi (đã đúng thiết kế ICD, không phát hiện lỗ hổng cụ thể) |
Test gửi giá giả trong payload, xác nhận BE bỏ qua và tự tính lại | ASR-003, ADR-003 |
THR-04 |
Information disclosure | TLS downgrade / lộ thông tin qua response header thừa (server banner, stack trace) | Toàn bộ traffic + response lỗi | 🟠 | HSTS, ẩn header Server/version; response 500 không bao giờ trả chi tiết exception, chỉ traceId (đã đúng thiết kế ICD §1 mục 4) |
Scan cấu hình TLS (SSL Labs-style) định kỳ; test gọi lỗi 500 xác nhận không rò rỉ stack trace | — |
THR-05 |
Denial of Service | Volumetric/L7 flood tại biên (trước khi tới ứng dụng) | CMP-01 WAF/ALB, toàn bộ hệ thống phía sau |
🟠 | WAF rate-based rule + AWS Shield Standard (mặc định có với CloudFront/ALB); rate-limit theo IP ở tầng WAF trước khi request chạm ứng dụng | Load test giả lập burst traffic trên staging (ứng viên FIT, ngoài phạm vi diễn tập GĐ2) |
QAS-009 |
4.2 TB2 — ALB → Nhóm Giao dịch (ownership/IDOR)
| 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 | Truy vết |
|---|---|---|---|---|---|---|---|
THR-06 |
Spoofing | Guest session id bị đoán (nếu CSPRNG yếu) hoặc bị lộ qua log/URL | X-Guest-Session-Id |
🔴 | CSPRNG ≥128-bit (đã chốt ICD §1 mục 10); cấm đưa session id vào query string/URL (chỉ header/cookie); log-scrubber không ghi giá trị đầy đủ |
Test entropy giá trị sinh ra; grep log staging xác nhận không xuất hiện session id đầy đủ | QAS-010 |
THR-07 |
Elevation of Privilege | IDOR — request giả mạo cartItemId/orderId không phải chủ sở hữu |
CMP-04 mọi endpoint IF-002 |
🔴 | Ownership check bắt buộc tại service (ADR-007), 0% bypass, fail-closed khi lỗi kỹ thuật (E-CART-0007) |
Integration test tự động gọi API với token/session không phải chủ sở hữu — 0 lượt thành công (đã có ở QAS-010, tương ứng AC-US003-12/13) |
QAS-010, ASR-007, ADR-007 |
THR-08 |
Denial of Service | Guest lạm dụng PATCH/DELETE /v1/cart/items (spam thêm/xoá liên tục) để tiêu tốn tài nguyên hoặc thao túng tồn kho reserve |
CMP-04, CMP-03 (reserve tồn kho) |
🟠 | Rate limit theo IP + session_id — xem đề xuất số cụ thể ở §5.3 (OQ-023) |
Test gửi burst request vượt ngưỡng, xác nhận 429 |
RBAC_CartCheckout §8 OQ-015 (BA) |
4.3 TB3 — Nhóm Giao dịch ↔ Nhóm Hỗ trợ (IF-021/IF-022, cross-network)
| 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 | Truy vết |
|---|---|---|---|---|---|---|---|
THR-09 |
Spoofing | Không có xác thực danh tính bên gọi — bất kỳ tiến trình nào trong VPC có thể giả danh Cart & Order gọi IF-021/IF-022 nếu security group không chặt |
CMP-07, CMP-05 |
🔴 | Service JWT ngắn hạn — ADR-015 (Proposed, chưa Accepted — chặn bởi OQ-007/OQ-050) |
Chưa kiểm chứng được — chặn bởi ADR-015 chưa Accepted |
OQ-050, ADR-015 |
THR-10 |
Tampering | Payload IF-021 (áp dụng coupon) bị giả mạo giá trị giảm giá vượt hợp lệ nếu Promotion&Loyalty không validate chặt |
CMP-07 |
🟠 | Validate bounds: giá trị giảm ≥0 và ≤ tổng tiền đơn hàng (đã ghi ở FAIL §2 FM-12 câu hỏi 3) |
Test gửi giá trị giảm âm/vượt tổng, xác nhận bị từ chối | FAIL FM-12 |
THR-11 |
Information disclosure | IF-022 trả nhầm thông tin seller khác (nếu logic tra cứu sai seller_id) hoặc lộ PII khách hàng nếu tương lai IF-022 đổi chiều mang theo dữ liệu khách |
CMP-05 |
🟠 | Denormalize sellerName snapshot (không JOIN ngược runtime, ICD §3.7) giảm bề mặt; nếu vẫn cần gọi runtime, kiểm tra input seller_id khớp đúng OrderSeller đang xử lý |
Contract test xác nhận response chỉ chứa đúng trường mong đợi | OQ-032, OQ-033 |
THR-12 |
Denial of Service | Retry storm/cascading failure — Nhóm Hỗ trợ chậm/hỏng kéo theo Cart&Order giữ tài nguyên (đã phân tích ở FAIL FM-12) |
CMP-04, CMP-07 |
🟠 | Circuit breaker cho IF-021 (đã thiết kế FAIL §3.1), 0 retry trong đường găng checkout |
Chaos test giả lập IF-021 timeout liên tục, xác nhận circuit breaker mở đúng ngưỡng (FIT-19, đã có ở FAIL) |
FAIL FM-12, QAS-002 |
4.4 TB4 — Cart & Order ↔ Payment (IF-006)
| 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 | Truy vết |
|---|---|---|---|---|---|---|---|
THR-13 |
Spoofing | Không có xác thực danh tính — một service khác trong VPC có thể giả danh Cart & Order để khởi tạo Payment giả |
CMP-11 |
🔴 | Cùng biện pháp THR-09 — ADR-015 (Proposed). Đây là ranh giới nhạy cảm nhất (tiền thật) — ưu tiên xử lý cao nhất, ADR-015 chưa Accepted |
Chưa kiểm chứng được — chặn bởi ADR-015 chưa Accepted |
ASR-002, OQ-050, ADR-015 |
THR-14 |
Tampering | amountVnd trong request IF-006 không khớp OrderSeller.subtotal_amount thật (do bug hoặc bên gọi bị compromise) |
CMP-11 |
🔴 | Payment Service phải tự đối chiếu lại amountVnd nhận được với giá trị tính từ OrderSeller (không tin tưởng tuyệt đối request đến, dù cùng nội bộ) — 🔴 chưa được ICD §3.3 ghi nhận là bước bắt buộc, đề xuất bổ sung ở lượt icd/dat kế tiếp |
Test gửi amountVnd sai lệch, xác nhận Payment Service từ chối thay vì tin theo |
ADR-002, ADR-003 |
THR-15 |
Repudiation | Không truy vết được ai/service nào đã trigger một Payment cụ thể nếu thiếu correlation id |
CMP-11 |
🟡 | X-Request-Id (OQ-031) xuyên suốt + audit log ghi actor/correlation_id (§7) |
Kiểm tra log Payment Service có correlation_id khớp với log Cart & Order cho cùng giao dịch |
OQ-031 |
THR-16 |
Elevation of Privilege | Module khác (ngoài Payment) cố truy cập trực tiếp RDS Payment (bỏ qua IF-006/IF-017) |
CMP-14 |
🔴 | Network/IAM cô lập hoàn toàn (ADR-002) — không security group nào khác được phép kết nối RDS Payment |
Kiểm tra hạ tầng: Terraform plan/AWS Config rule xác nhận không có security group nào khác trỏ tới RDS Payment (đã có FIT-03 ở ADR-002) |
ASR-002, ADR-002, FIT-03 |
4.5 TB5 — Payment ↔ VNPay/Momo (init sync + webhook inbound async)
| 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 | Truy vết |
|---|---|---|---|---|---|---|---|
THR-17 |
Spoofing | Webhook IPN giả mạo (kẻ tấn công tự gọi endpoint webhook giả lập giao dịch thành công) | CMP-11, payment.status |
🔴 | Xác thực chữ ký/HMAC theo tài liệu VNPay/Momo — 🔴 chưa có tài liệu/sandbox thật, không bịa cơ chế cụ thể (ARISK-03). Đề xuất SA: từ chối cứng mọi webhook không xác minh được chữ ký hợp lệ, không xử lý "tạm chấp nhận rồi kiểm tra sau" |
🔴 Chưa kiểm chứng được — chặn bởi thiếu sandbox. Khi có sandbox: test gửi webhook chữ ký sai, xác nhận bị từ chối và ghi log cảnh báo (khả năng giả mạo, không coi là lỗi hệ thống thường — đã ghi ở FAIL §2 FM-01/02) |
ADR-004, ARISK-03, OQ-049 |
THR-18 |
Tampering | Replay webhook cũ (gửi lại payload hợp lệ đã xử lý trước đó để trigger lại logic) | CMP-11 |
🟠 | Idempotency theo gatewayTransactionRef (ADR-004) + kiểm tra timestamp payload lệch ≤5 phút (ICD §1 mục 12) — đã xử lý cả 2 lớp (idempotent + chống replay theo thời gian) |
Test gửi lại đúng webhook cũ ngoài cửa sổ 5 phút, xác nhận bị từ chối; gửi lại trong cửa sổ, xác nhận idempotent (không xử lý lại nghiệp vụ) | ADR-004, QAS-014 |
THR-19 |
Information disclosure | gateway_response_snapshot vô tình chứa dữ liệu thẻ nếu gateway trả về ngoài dự kiến |
payment_transaction.gateway_response_snapshot (DAT §2.1) |
🔴 | Whitelist field được lưu trước khi ghi (lọc bỏ mọi trường không nằm trong danh sách kỳ vọng, mặc định từ chối lưu trường lạ thay vì mặc định chấp nhận) — đề xuất mới, chưa có trong DAT hiện tại |
Test giả lập gateway trả thêm trường lạ (VD số thẻ rút gọn), xác nhận không được ghi vào gateway_response_snapshot |
ASR-002, BR-CART-05 (BA) |
THR-20 |
Repudiation | Không phát hiện được giao dịch bị VNPay/Momo báo sai trạng thái (báo success nhưng thực tế tiền chưa về, hoặc ngược lại) |
payment.status |
🟠 | Job đối soát bù định kỳ ≤15 phút (ADR-004, QAS-014) — không tự động sửa, chỉ ghi ReconciliationLog + cảnh báo |
Test giả lập webhook trễ/mất trên staging (cần sandbox thật để đầy đủ — FIT-21, đã có ở FAIL) |
ADR-004, QAS-014 |
THR-21 |
Denial of Service | Webhook flooding (đối tác hoặc kẻ tấn công gửi số lượng lớn webhook giả) | CMP-11 |
🟡 | Rate limit endpoint webhook theo nguồn IP đối tác đã biết (whitelist IP nếu đối tác công bố dải IP cố định — 🔴 chưa xác nhận, OQ-049); WAF chung ở TB1 vẫn áp dụng |
Load test endpoint webhook trên staging | ARISK-03 |
4.6 TB6 — Shipping & Fulfillment ↔ GHN/GHTK webhook
| 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 | Truy vết |
|---|---|---|---|---|---|---|---|
THR-22 |
Spoofing | Webhook cập nhật trạng thái vận chuyển giả mạo | CMP-10, shipment.status |
🟠 | Chữ ký/token theo tài liệu GHN/GHTK — 🔴 chưa có tài liệu/sandbox thật (ARISK-04), không bịa cơ chế cụ thể |
Chưa kiểm chứng được — chặn bởi thiếu sandbox | ARISK-04, OQ-049 |
THR-23 |
Tampering | Trạng thái vận đơn "thụt lùi" (từ "đang giao" về "đã tạo đơn") do webhook lỗi/giả mạo | shipment.status |
🟡 | Không ghi đè khi trạng thái mới "thụt lùi" so với trạng thái tiến bộ nhất đã ghi (đã thiết kế ở FAIL §2 FM-03/04), cảnh báo Ops kiểm tra thủ công |
Test gửi webhook trạng thái thụt lùi, xác nhận không ghi đè | FAIL FM-03/04 |
4.7 TB7 — App ↔ RDS/Redis/SQS
| 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 | Truy vết |
|---|---|---|---|---|---|---|---|
THR-24 |
Information disclosure | Một module đọc/ghi nhầm schema của module khác trong cùng RDS chính (schema-per-module nhưng chung instance/IAM lỏng lẻo) | CMP-13 (8 schema) |
🟠 | IAM DB role riêng theo module, chỉ cấp quyền đúng schema của module đó (Postgres role + GRANT theo schema) — 🔴 chưa được DAT/ADR-006 xác nhận chi tiết cấp quyền, đề xuất bổ sung ở inf |
Kiểm tra GRANT/role Postgres qua migration review; test connection dùng role module A cố SELECT schema module B, xác nhận bị từ chối |
ADR-006, D7 |
THR-25 |
Tampering | Producer không hợp lệ (service bị compromise hoặc external actor với network access) publish message giả vào SQS/EventBridge | CMP-12 |
🟠 | IAM policy giới hạn sqs:SendMessage/events:PutEvents chỉ cho ECS task role của CMP-04/CMP-11 (publisher hợp lệ duy nhất); consumer validate schema (eventVersion, field bắt buộc) trước khi xử lý, message không hợp lệ → DLQ (đã có ở FAIL §2 FM-09/10) |
Kiểm tra IAM policy qua Terraform plan; test publish message sai schema, xác nhận route DLQ | ADR-005, FAIL FM-09/10 |
THR-26 |
Information disclosure | Kết nối Redis không mã hoá in-transit trong VPC (nếu VPC bị compromise, traffic session/ownership cache có thể bị nghe lén) | CMP-15 |
🟡 | Bật TLS in-transit cho ElastiCache Redis (encryption in-transit, tính năng có sẵn của AWS) — 🔴 chưa xác nhận đã bật hay chưa trong cấu hình INF (chưa chạy) |
Kiểm tra cấu hình ElastiCache khi inf chạy |
INF (hoạt động 7, chưa chạy) |
THR-27 |
Denial of Service | Một module (đọc nặng, VD Catalog search) chiếm hết connection pool RDS chung, chặn module ghi (checkout) | CMP-13 |
🟠 | Bulkhead — connection pool riêng theo module (đã ghi nhận ở FAIL §3.3, kích thước cụ thể chờ POC-02, OQ-037) |
Load test saturate pool 1 module, xác nhận module khác không bị ảnh hưởng (FIT-22, đã có ở FAIL) |
FAIL FM-06, OQ-037 |
4.8 TB8 — Admin console
| 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 | Truy vết |
|---|---|---|---|---|---|---|---|
THR-28 |
Spoofing | Đánh cắp/dò mật khẩu Admin (không có MFA bypass path) | CMP-02 (Admin) |
🔴 | MFA bắt buộc TOTP (ASR-009), account lockout sau 3 lần sai (§2.3, đề xuất) |
Test đăng nhập Admin không qua MFA, xác nhận bị từ chối (đã có ở QAS-012) |
QAS-012, ASR-009 |
THR-29 |
Elevation of Privilege | Thiếu kiểm tra scope/role dẫn tới Customer/Seller gọi được endpoint Admin | CMP-02 và mọi endpoint quản trị |
🔴 | Middleware kiểm tra role/scope claim bắt buộc trước business logic (nguyên tắc chung, tham khảo ý tưởng P1 docs/08 §8.1.2, tự quyết định lại cho P2 vì P2 không có OPA/BFF riêng như P1) |
Test gọi endpoint Admin bằng JWT role=customer, xác nhận 403 |
ASR-009 |
THR-30 |
Repudiation | Hành động Admin (khoá tài khoản, duyệt seller...) không được ghi vết | Toàn hệ thống, đặc biệt module ngoài phạm vi US-002/003 | 🟠 | audit_log bắt buộc cho mọi hành động Admin nhạy cảm (§7) |
Kiểm tra coverage: mọi endpoint role=admin ghi được ≥1 dòng audit_log tương ứng (FIT-32 mới) |
RBAC_CartCheckout §5 |
THR-31 |
Denial of Service | Brute-force đăng nhập Admin (dò mật khẩu hàng loạt) | /v1/auth/login (Admin) |
🟠 | Account lockout (§2.3) + rate-limit theo IP (§5.3) + captcha sau N lần sai (tham khảo ý tưởng P1, chưa chốt ngưỡng cho P2) | Test brute-force giả lập, xác nhận khoá đúng ngưỡng | OQ-052 |
4.9 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 |
|---|---|---|---|---|
(chưa có mục nào — Security chưa có người để ký chấp nhận rủi ro, OQ-007. Không tự chấp nhận rủi ro thay Security theo D10.) |
🔴 Tổng kết: 31 THR được liệt kê (THR-01…31, một số ID không liên tục do rà soát nhóm theo
STRIDE không đều ở mỗi ranh giới — không có ID nào bị bỏ trống ngầm). Bốn nhóm mức 🔴 cao nhất
chưa có biện pháp đủ: (1) THR-09/THR-13 — thiếu service-to-service authn ở TB3/TB4 (§2.4,
OQ-050); (2) THR-17/THR-22 — chữ ký webhook thật chưa xác nhận được vì thiếu sandbox đối tác
(OQ-049, ARISK-03/04); (3) THR-19 — lọc trường gateway_response_snapshot chưa triển khai;
(4) mọi threat liên quan PII (THR-11 gián tiếp) phụ thuộc OQ-007 chưa có người phủ quyết.
5. Bảo vệ dữ liệu
🔴 Toàn bộ mục này (§5) là ĐỀ XUẤT của SA, CHƯA CÓ HIỆU LỰC PHỦ QUYẾT — Security/Pháp chế
chưa có người được chỉ định (OQ-007, mở từ GĐ1, kế thừa RISK-03 của BA). Không coi bất kỳ dòng
nào dưới đây là quyết định cuối cùng.
5.1 Phân loại & mã hoá
Kế thừa nguyên trạng phân loại đã có ở DAT_e-commerce_v1.0.md §5 (không lặp lại toàn bộ bảng —
tham chiếu bằng đường dẫn theo D "không copy nội dung giữa các tài liệu"). SEC xác nhận lại góc
độ bảo mật/kiểm chứng cho từng nhóm:
| Nhóm dữ liệu | Mã hoá at-rest | Mã hoá in-transit | Che khi hiển thị | Che khi log | Nguồn phân loại |
|---|---|---|---|---|---|
Danh tính & liên hệ khách hàng (email/phone/full_name) |
RDS KMS mặc định (đề xuất DAT §5) |
TLS 1.2+ mọi kết nối (§1) | Không che với chính chủ; không hiển thị cho seller | Bắt buộc — log-scrubber mask email/phone (đề xuất mới, tham khảo ý tưởng P1 docs/08 §8.2.3, tự quyết định lại) |
DAT §5 |
Địa chỉ giao hàng (recipient_name/phone/address_line) |
RDS KMS | TLS 1.2+ | Whitelist cho seller — chỉ 3 trường trên, đúng OrderSeller liên quan (ADR-008 PA-2, đề xuất) — 🔴 mức che (full hay một phần) chưa chốt, xem OQ-053 (mới) |
Bắt buộc mask trong log ứng dụng | DAT §5, RBAC §4 |
KYC seller (file_url_s3, tax_code, business_license_number) |
S3 SSE-KMS + RDS KMS; đề xuất mã hoá tầng ứng dụng bổ sung (tham khảo ý tưởng P1 docs/08 §8.2.1) |
TLS 1.2+ | Chỉ Admin/CSR đã duyệt xem (ngoài phạm vi module này) | Không log giá trị đầy đủ; nếu cần audit, mask giữ vài ký tự đầu/cuối (tham khảo ý tưởng P1 docs/08 §8.2.5a) |
DAT §5 |
Tài khoản ngân hàng seller (account_number) |
Bắt buộc mã hoá tầng ứng dụng (không chỉ KMS) | TLS 1.2+ | Che một phần khi hiển thị (VD ****1234) |
Che hoàn toàn, không log giá trị | DAT §5 |
Dữ liệu thanh toán (payment.amount, gateway_transaction_ref, gateway_response_snapshot đã lọc) |
RDS KMS (RDS Payment riêng, ADR-002) + đề xuất mã hoá tầng ứng dụng cho gateway_transaction_ref |
TLS 1.2+, RDS Payment mạng riêng | Chỉ hiển thị tham chiếu rút gọn cho khách | Tuyệt đối không log gateway_response_snapshot thô ở mức DEBUG production |
DAT §5, ADR-002 |
Dữ liệu nghiệp vụ công khai (product, category, review) |
RDS KMS mặc định | TLS 1.2+ | Không cần che | Không cần che | DAT §5 |
🔴 Dữ liệu production trên môi trường dev/staging bị cấm tuyệt đối — đúng nguyên tắc template
mục 5. Yêu cầu quy trình anonymize khi sao chép Production → Staging (hash/mask email/phone,
xoá tax_code/account_number thật, thay bằng dữ liệu giả lập nhất quán) — chưa có quy trình
cụ thể cho P2, đề xuất tham khảo ý tưởng P1 (docs/08 §8.2.3), ghi nhận là việc cần làm ở hoạt
động inf (§7 non-prod topology).
5.2 Whitelist chia sẻ PII cho seller — hiện thực hoá ADR-008 PA-2
Đúng như ADR-008 (Proposed, chờ Security/Legal) và DAT §5.2 đã thiết kế: order_seller chỉ
lưu snapshot đúng 3 trường (recipient_name, phone, address_line) — không JOIN ngược sang
schema identity. SEC xác nhận lại từ góc độ threat model: đây là biện pháp giảm bề mặt rủi ro
đúng (THR-11), nhưng bản thân việc "3 trường này có nên hiển thị đầy đủ hay che một phần cho
seller" vẫn là câu hỏi mở — xem OQ-053.
🔴 Nếu Security/Legal từ chối PA-2 khi có người ký, toàn bộ §5.1/§5.2 và cơ chế denormalize ở
DAT §5.2/ICD §3.7 phải thiết kế lại — đây là rủi ro kiến trúc đã ghi nhận ở ADR-008 §3,
không phải điều mới phát hiện ở sec.
5.3 Đề xuất rate limit — trả lời OQ-023
🔴 OQ-023 yêu cầu: "SEC đề xuất số cụ thể + hệ quả, không tự quyết thay Security." Bảng dưới là
đề xuất, Security là người chốt cuối.
| Endpoint/hành động | Ngưỡng đề xuất | Đơn vị đếm | Hệ quả nếu Security chọn CHẶT hơn | Hệ quả nếu Security chọn LỎNG hơn |
|---|---|---|---|---|
PATCH/DELETE /v1/cart/items (Guest) |
30 request/phút | Theo session_id (chính) + 60 req/phút theo IP (phòng vệ phụ, chống một IP tạo nhiều session để né giới hạn theo session) |
VD 10/phút: giảm mạnh khả năng spam/thao túng tồn kho reserve, nhưng có thể chặn nhầm khách thao tác nhanh trên UI (VD sửa số lượng nhiều dòng liên tiếp) — tăng khiếu nại trải nghiệm | VD 100/phút: giảm false positive, nhưng dễ bị lạm dụng để giữ/giải phóng tồn kho reserve liên tục (làm nhiễu inventory_stock, ảnh hưởng gián tiếp trải nghiệm khách thật muốn mua) |
POST /v1/checkout |
10 request/phút theo session_id/customer_id |
Theo định danh (Guest: session, Customer: customer_id) | VD 3/phút: an toàn hơn trước spam tạo đơn giả (RBAC §8 OQ-015 của BA), nhưng khách thao tác thật thử lại nhiều lần sau lỗi 4xx/5xx có thể bị chặn oan |
VD 30/phút: giảm false positive khi khách retry sau lỗi mạng, nhưng tăng rủi ro spam tạo Order/giữ tồn kho reserve hàng loạt |
POST /v1/auth/login (mọi vai trò) |
10 request/phút theo IP (độc lập với account lockout §2.3, đây là lớp phòng thủ theo IP) | Theo IP | VD 3/phút: chống brute-force mạnh hơn, nhưng ảnh hưởng người dùng chung IP NAT (mạng công ty/quán net Việt Nam khá phổ biến) | VD 50/phút: giảm false positive NAT, nhưng làm yếu lớp phòng thủ IP (vẫn còn account lockout §2.3 làm lớp thứ hai) |
Webhook inbound (IF-007/IF-008/IF-018/IF-019) |
Không giới hạn cứng theo request/phút (đối tác tự quyết định tần suất gọi lại) — chỉ giới hạn ở WAF chung (TB1) chống flood bất thường | — | — | — |
🔴 Ba con số trên (30, 10, 10) là ước lượng SA dựa trên hành vi UI thông thường (không có dữ liệu
traffic thật, greenfield) — không phải kết quả đo. Security cần xác nhận hoặc điều chỉnh dựa
trên khẩu vị rủi ro thật của tổ chức.
6. Quản lý secret
| Quyết định | |
|---|---|
| Nơi lưu | AWS Secrets Manager cho: DB credentials (RDS chính + RDS Payment, secret riêng biệt, không chung), API key/secret VNPay/Momo/GHN/GHTK, JWT signing key (CMP-02), SMTP/SMS provider key (khi có nhà cung cấp, OQ-016 của TCO) |
| Cách ứng dụng lấy | ECS task role (IAM) có quyền secretsmanager:GetSecretValue chỉ đúng secret của module đó — không task nào được đọc secret của module khác (đối xứng với nguyên tắc cô lập schema §4.7) |
| Xoay khoá: tần suất, tự động hay thủ công | DB credentials: tự động (AWS Secrets Manager rotation Lambda, chu kỳ đề xuất 30 ngày — chưa Tech Lead xác nhận); API key đối tác ngoài: thủ công, chu kỳ đề xuất 90 ngày (phụ thuộc khả năng hỗ trợ rotation của từng đối tác — 🔴 chưa xác nhận VNPay/Momo/GHN/GHTK có hỗ trợ rotate key không, ARISK-03/04); JWT signing key: xoay 90 ngày, dùng kid để hỗ trợ 2 khoá song song (§2.2) |
| Cấm tuyệt đối | Secret trong mã nguồn/Git, secret trong biến môi trường bị ghi vào log (log-scrubber phải chặn pattern giống secret), secret trong ảnh container (build-time bake) |
| Cách phát hiện rò rỉ | Quét mã nguồn trong CI/CD (Gitleaks/TruffleHog) — chặn merge nếu phát hiện secret pattern; FIT-29 (mới, ứng viên GĐ3) |
7. Audit log
Theo phương án (a) đã chốt TẠM ở OQ-047/DEC-25 (DAT): mỗi module tự ghi audit_log trong
schema của mình, KHÔNG có CMP-16 Audit tập trung. SEC chốt trường bắt buộc + retention +
chống sửa cho quy ước chung áp dụng mọi module.
| 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 |
|---|---|---|---|---|
Tạo Order/OrderSeller (checkout) |
actor_type (guest/customer)· actor_id (customer_id/session_id) · action · resource_type/resource_id · ip_address · correlation_id (X-Request-Id, OQ-031) · timestamp (UTC) · result |
Chính chủ đơn (qua tra cứu); nội bộ Kế toán/CSKH (module ngoài phạm vi US-002/003) | 10 năm — nhất quán retention tài chính (DAT §6) |
Bảng append-only — role ứng dụng chỉ có INSERT/SELECT, không UPDATE/DELETE (cưỡng chế ở DB role, không chỉ ở tầng code) |
Khởi tạo thanh toán / cập nhật payment.status |
Tương tự trên + payment_method, gateway_transaction_ref (đã che theo §5.1) |
Chính chủ đơn; nội bộ Kế toán | 10 năm | Tương tự trên (schema payment, RDS riêng theo ADR-002) |
| Đăng nhập/thất bại (mọi vai trò) | actor_id, role, ip_address, result (success/fail), timestamp, mfa_used (bool) |
Platform Admin (scope admin:audit:read — ý tưởng tham khảo P1, tự quyết định lại cho P2 vì chưa có endpoint đọc audit riêng) |
5 năm (đề xuất, tham khảo ý tưởng P1) | Append-only, schema identity |
| Thay đổi quyền / khoá tài khoản (Admin) | actor_id (Admin thực hiện), target_id, before/after (redact trường nhạy cảm nếu có), reason (nếu có), timestamp |
Platform Admin | 5 năm | Append-only, schema identity |
| Truy cập dữ liệu nhạy cảm (VD Admin xem KYC document) | actor_id, resource_type/resource_id, timestamp — không ghi nội dung tài liệu, chỉ ghi hành động xem |
Platform Admin | 5 năm | Append-only (module Seller Mgmt, ngoài phạm vi chi tiết US-002/003) |
| Ownership check thất bại (IDOR bị chặn) | actor_id/session_id, resource_type/resource_id bị yêu cầu, ip_address, timestamp — phục vụ điều tra khi nghi ngờ tấn công hàng loạt |
Security (khi có người) | 🔴 chưa chốt — đề xuất 1 năm, thấp hơn nhóm tài chính vì mục đích khác (an ninh vận hành, không phải bằng chứng giao dịch) | Append-only |
🔴 Audit log mà người bị audit sửa được thì không phải audit log — mỗi schema-per-module
(ADR-006) phải cưỡng chế append-only ở mức DB role của chính schema đó, không có ngoại lệ cho
platform_admin (Admin xem được nhưng không sửa/xoá được bản ghi audit).
🔴 Khoảng trống đã biết: không có CMP Audit tập trung (phương án (a)) nghĩa là không có
một nơi duy nhất để Security truy vấn xuyên toàn sàn khi điều tra sự cố — mỗi module phải được
truy vấn riêng. Đây là đánh đổi đã chấp nhận TẠM ở DEC-25, chưa Security thật xác nhận. Nếu
Security khi có người yêu cầu audit tập trung, cần mở lại OQ-047 và có thể đảo ngược sang
phương án (b) (CMP-16) — chi phí đảo ngược: thêm 1 service mới + migrate log lịch sử từ N schema
sang 1 nơi.
8. Tuân thủ
8.1 PCI-DSS SAQ A
| Yêu cầu | Nguồn | Cách đáp ứng | Bằng chứng cho kiểm toán | Ai xác nhận |
|---|---|---|---|---|
| Không lưu PAN/CVV ở bất kỳ đâu ngoài Payment Service | CON-06, BR-CART-05 (BA), ADR-002 |
payment_transaction.gateway_response_snapshot phải lọc trước khi ghi (THR-19); schema linter chặn cột kiểu "card_number"/"cvv" ở mọi schema khác payment |
FIT-04 (đã đề xuất ở ADR-002) |
Security (chưa có người) |
| Ranh giới mạng/IAM/dữ liệu cô lập hoàn toàn | ASR-002, ADR-002 |
Network diagram + IAM policy review; không security group nào khác trỏ tới RDS Payment | FIT-03 (đã đề xuất ở ADR-002) |
Security |
| Hình thức tích hợp VNPay/Momo phải là redirect, không nhúng iframe/form nhập thẻ trên domain sàn (đề xuất mới) | Suy luận từ yêu cầu SAQ A (tham khảo docs/08 §8.4: "nếu redirect, scope tương ứng SAQ A") |
🔴 Chưa xác nhận được với VNPay/Momo thật — chưa có tài liệu tích hợp, chưa biết họ có hỗ trợ redirect thuần hay bắt buộc SDK/iframe nào đó. Nếu chỉ hỗ trợ iframe/API pass-through dữ liệu thẻ, toàn bộ giả định SAQ A của ASR-002/ADR-002 phải xét lại (có thể cần nâng cấp phạm vi tuân thủ, ảnh hưởng chi phí TCO) |
— | Tech Lead + Security (OQ-048, mới) |
| Webhook: chữ ký/HMAC theo tài liệu đối tác | ADR-004 |
🔴 Chưa biết cơ chế cụ thể (SecureHash/HMAC-SHA256/khác) — không bịa, chờ tài liệu đối tác | THR-17 |
OQ-049 (mới), ARISK-03 |
| Chống replay webhook | ADR-004 |
Kiểm tra timestamp payload lệch ≤5 phút (đã chốt, ICD §1 mục 12) |
THR-18 |
Đã đủ điều kiện kỹ thuật, chờ sandbox để kiểm chứng thật |
| Quét lỗ hổng ASV hàng quý | CON-06 |
Nhà cung cấp ASV bên ngoài — 🔴 chưa có báo giá | Báo cáo ASV | Security (OQ-017, đã mở ở TCO) |
| Pentest ứng dụng hàng năm | CON-06 |
Nhà cung cấp pentest bên ngoài — 🔴 chưa có báo giá | Báo cáo pentest | Security (OQ-017) |
8.2 NĐ13/2023 (Bảo vệ dữ liệu cá nhân)
| Yêu cầu | Nguồn | Cách đáp ứng | Bằng chứng | Ai xác nhận |
|---|---|---|---|---|
| Data minimization khi chia sẻ PII cho seller | ASR-008, QAS-011, ADR-008 |
Whitelist 3 trường (§5.2) — đề xuất, chưa hiệu lực | Contract test (FIT-11, đã đề xuất ở ADR-008) |
Security/Legal — chưa có người (OQ-007) |
Residency dữ liệu tại ap-southeast-1 đáp ứng đủ yêu cầu |
CON-06, ASM-04 |
🔴 Chưa xác nhận — chỉ là giả định (ASM-04) |
— | Legal (OQ-007) |
| Quyền được xoá / ẩn danh hoá | CON-06 |
Đề xuất 30 ngày ẩn danh hoá kể từ yêu cầu hợp lệ (DAT §5) — đề xuất, chờ Legal |
— | Legal (OQ-007) |
| Xác thực danh tính người yêu cầu xoá (chống giả mạo yêu cầu xoá tài khoản người khác) | Ý tưởng tham khảo P1 (docs/08 §8.2.4), chưa thiết kế cụ thể cho P2 |
🔴 Chưa thiết kế | — | Legal + Tech Lead (mới, ngoài phạm vi US-002/003) |
8.3 NĐ52/85 (thông báo website TMĐT marketplace)
Chủ yếu là nghĩa vụ pháp lý/hành chính (đăng ký với Bộ Công Thương), không phải control kỹ thuật
thuộc SEC. Yêu cầu kỹ thuật liên quan (hiển thị thông tin đăng ký ở footer) thuộc tầng UI/FE,
ngoài phạm vi tài liệu này.
9. Phụ thuộc & chuỗi cung ứng
| Quyết định | |
|---|---|
| Quét lỗ hổng thư viện (SCA) | Trivy/Snyk/Dependabot trong CI/CD — đề xuất chặn build nếu phát hiện CVE mức Critical chưa có bản vá sau 7 ngày, mức High sau 30 ngày (đề xuất SA, chưa Tech Lead xác nhận) |
| Quét ảnh container | Trivy image scan trước khi push lên ECR — cùng ngưỡng chặn như trên |
| Chính sách vá lỗ hổng nghiêm trọng | Critical: ≤7 ngày · High: ≤30 ngày · Medium/Low: theo chu kỳ release thường |
| Ai duyệt thư viện mới | Tech Lead (theo decision-radar.md §5 — "Công cụ, thư viện" thuộc Tech Lead, SA chỉ phủ quyết nếu chạm QAS) |
| Pentest năm + ASV quý | Xem §8.1 — chi phí chưa có báo giá (OQ-017, đã mở ở TCO) |
10. Giả định & Ngoài phạm vi
Giả định (tiếp số toàn dự án — ASM-01…38 đã dùng, bắt đầu ASM-39):
| ID | Giả định | Cách xác minh | Nếu sai |
|---|---|---|---|
ASM-39 |
VNPay/Momo hỗ trợ tích hợp dạng redirect thuần (không bắt buộc iframe/SDK truyền dữ liệu thẻ qua domain sàn), đủ điều kiện giữ SAQ A | Tech Lead xác nhận khi có tài liệu/sandbox thật (OQ-048, ARISK-03) |
Nếu sai: phạm vi tuân thủ PCI-DSS phải nâng lên (SAQ A-EP hoặc cao hơn), ảnh hưởng trực tiếp ASR-002/ADR-002/chi phí TCO — cần rà lại toàn bộ SEC §8.1 |
ASM-40 |
Chưa có đủ traffic thật để hiệu chỉnh ngưỡng rate-limit (§5.3) — ba con số (30/10/10) là ước lượng dựa trên hành vi UI thông thường, không phải đo | Đo traffic thật 4-6 tuần đầu soft-launch, điều chỉnh lại | Nếu traffic thật khác biệt lớn (VD nhiều khách dùng chung IP NAT hơn dự kiến): cần tách ngưỡng theo session_id thuần, giảm phụ thuộc IP |
ASM-41 |
Đề xuất PA-3 (service JWT) cho service-to-service authn (§2.4) không làm tăng đáng kể latency đường găng checkout (QAS-002) |
Đo lại QAS-002 sau khi có thiết kế cụ thể + POC nếu Tech Lead chấp nhận hướng này |
Nếu tăng latency đáng kể: cần xét lại PA-2 (mTLS, chấp nhận thêm hạ tầng) hoặc thiết kế cache token phía service gọi |
Ngoài phạm vi:
- Threat model chi tiết cho các
CMPngoài "chi tiết nhất" (Seller Mgmt ngoài whitelist PII, Commission & Payout, Promotion & Loyalty ngoàiIF-021, Review, Notification) — chỉ có ở mức ranh giới tin cậy (§1), chưa đào sâu STRIDE riêng. Sẽ bổ sung khi module tương ứng tới lượt thiết kế chi tiết. - Cơ chế chữ ký/HMAC cụ thể của VNPay/Momo/GHN/GHTK — không bịa, chờ tài liệu/sandbox đối tác
thật (
ARISK-03/04,OQ-049). - Hạ tầng cụ thể cho VPN/IP allowlist Admin, mã hoá in-transit ElastiCache, cấu hình IAM DB role
chi tiết theo schema — thuộc hoạt động
inf(hoạt động 7, chưa chạy). - Endpoint đọc
audit_logtập trung, DPIA (Data Protection Impact Assessment) — ngoài phạm vi US-002/003, ghi nhận là việc cần làm trước go-live (tham khảodocs/08 §8.4). - Viết
ADRchính thức cho service-to-service authn (§2.4) — chỉ đề xuất và ước lượng radar ở đây, việc viếtADRthuộc hoạt độngadrkế tiếp (ngoài phạm vi hoạt độngsecđược giao).
11. Open Questions
Tiếp số sổ SA (00-index/OQ_e-commerce.md đang ở OQ-047) — bắt đầu OQ-048.
| ID | Câu hỏi | Hỏi ai | Từ ngày | Chặn gì | Hệ quả nếu trả lời ngược |
|---|---|---|---|---|---|
OQ-048 |
VNPay/Momo có hỗ trợ tích hợp dạng redirect thuần (không iframe/SDK nhập thẻ trên domain sàn) không — điều kiện để giữ phạm vi PCI-DSS SAQ A (ASM-39)? |
Tech Lead + Security (khi có người) | 2026-09-15 | SEC §8.1; giả định nền của ASR-002/ADR-002 |
Nếu không hỗ trợ redirect thuần: phạm vi tuân thủ PCI-DSS phải nâng cấp, tăng chi phí audit/kiểm toán và có thể cần thiết kế lại luồng khởi tạo thanh toán |
OQ-049 |
Cơ chế xác thực chữ ký/HMAC webhook cụ thể của VNPay, Momo, GHN, GHTK là gì (thuật toán, header, cách tính chữ ký)? | Tech Lead (khi có tài liệu đối tác) | 2026-09-15 | THR-17/THR-22; kiểm chứng ADR-004 thật |
Không có tài liệu: threat model webhook chỉ dừng ở mức nguyên tắc chung ("phải xác thực"), không kiểm chứng được cho tới khi có sandbox — rủi ro triển khai sai cơ chế lúc code |
OQ-050 |
Chấp nhận đề xuất PA-3 (service JWT ngắn hạn ký bởi Identity & Access) cho service-to-service authn giữa Nhóm Giao dịch ↔ Nhóm Hỗ trợ ↔ Payment không, hay chọn PA-2 (mTLS/App Mesh, cần thêm hạ tầng)? | Tech Lead + Security + Ops/SRE | 2026-09-15 | ADR mới ở hoạt động adr kế tiếp; thiết kế inf cho TB3/TB4 |
Chọn PA-3: rủi ro còn lại là chưa đạt mTLS full zero-trust, nhưng không cần hạ tầng mới ngay. Chọn PA-2: cần quyết định lại ràng buộc "không thêm hạ tầng mới" đã ghi ở SAD §7 v1.2, tăng thời gian/chi phí triển khai |
OQ-051 |
Xác nhận số cụ thể: TTL access token (đề xuất 15 phút), TTL refresh token (đề xuất 14 ngày), cơ chế thu hồi tức thời (đề xuất denylist Redis theo jti), tần suất xoay khoá ký JWT (đề xuất 90 ngày) |
Tech Lead | 2026-09-15 | Thiết kế CMP-02 (Identity & Access) khi tới lượt module đó; toàn bộ luồng authn Customer/Seller/Admin |
Số quá ngắn (VD TTL 5 phút): tăng tần suất refresh, tăng tải Identity & Access. Số quá dài (VD TTL 60 phút không denylist): cửa sổ lợi dụng token bị đánh cắp dài hơn |
OQ-052 |
Xác nhận ngưỡng account lockout theo vai trò (đề xuất: customer/seller 5 lần sai/15 phút; admin 3 lần sai/30 phút) và rate-limit login theo IP (đề xuất 10 request/phút) | Tech Lead + Security | 2026-09-15 | THR-28/31; thiết kế CMP-02 |
Ngưỡng quá chặt: tăng khiếu nại khách bị khoá oan (đặc biệt IP NAT dùng chung). Ngưỡng quá lỏng: tăng rủi ro brute-force thành công |
OQ-053 |
Ba trường whitelist chia sẻ cho seller (recipient_name/phone/address_line, ADR-008 PA-2) hiển thị đầy đủ hay che một phần (VD số điện thoại che 3-4 số giữa)? |
Security/Legal (khi có người) + PO | 2026-09-15 | DAT §5.2; UI hiển thị đơn hàng cho Seller (ngoài phạm vi US-002/003) |
Hiển thị đầy đủ: seller đủ thông tin giao hàng nhưng tăng bề mặt rủi ro nếu tài khoản seller bị lộ. Che một phần: giảm rủi ro nhưng có thể gây khó khăn thao tác giao hàng thực tế (VD shipper cần gọi điện xác nhận) |
Cập nhật cho OQ đã mở:
OQ-007— SEC bổ sung: toàn bộ §5, §8.2 của tài liệu này là đề xuất chờ phủ quyết; không coi bất kỳ phân loại/whitelist/mã hoá nào ở đây là đã "Security xác nhận". Giữ nguyên mở.OQ-023— SEC trả lời bằng đề xuất số cụ thể ở §5.3 (30 req/phút Guest cart, kèm hệ quả cả hai chiều) — không tự quyết thay Security,OQ-023giữ nguyên mở, chờ Security xác nhận hoặc điều chỉnh.OQ-024(MFA Admin) — SEC xác nhận lại hướng TẠM TOTP app (ASM-20,DEC-14) và bổ sung chi tiết backup code (§2 bảng, chưa thiết kế đầy đủ) — giữ nguyên mở, chờ Security thật.
Nhắc: cộng với các OQ còn mở ảnh hưởng trực tiếp SEC — OQ-007 (PII/residency, chặn phần
lớn §5/§8.2), OQ-017 (báo giá pentest/ASV, chặn §8.1/§9), ARISK-03/04 (sandbox đối tác, chặn
kiểm chứng THR-17/18/22) — xem sổ đầy đủ 00-index/OQ_e-commerce.md.
Nhắc AG2: cần Tech Lead + Security + Ops/SRE ký — còn thiếu INF (hoạt động 7) và toàn bộ
ADR liên quan SEC (ADR-002/004/007/008 vẫn Proposed; ADR service-to-service authn §2.4
chưa viết).
Tự chấm
① Bảng tự chấm Gate AG2 (workflow.md §2 — chỉ dòng liên quan tới SEC, tự chấm sớm)
| # | Tiêu chí | ☐/✅ | Ghi chú |
|---|---|---|---|
| — | ASR/QAS/SAD/ICD/DAT/FAIL |
✅ (đã đạt ở các hoạt động trước) | Không lặp lại |
| — | ADR-nnn tồn tại cho mọi quyết định đạt ngưỡng radar |
🟡 Một phần | 13 ADR đã viết (bao gồm ADR-002/004/007/008/011 liên quan bảo mật); SEC phát hiện 1 quyết định mới đạt ngưỡng ADR chưa viết — service-to-service authn (§2.4, radar ~5), ghi OQ-050 |
| — | INF |
☐ | Chưa tới — hoạt động 7 |
| 1 | SEC — có threat model STRIDE cho luồng nhạy cảm; mô hình authn/authz đã chốt; Security ký |
☐ | Threat model STRIDE đủ 8 ranh giới, 31 THR (§4); mô hình authn/authz đã đề xuất đầy đủ (§2, §3) nhưng chưa chốt ở nhiều điểm (OQ-050/051/052/053) và Security chưa ký (OQ-007, không có người) — đây là điều kiện chặn cứng nhất của AG2 theo SKILL.md ("Security có quyền phủ quyết AG2") |
| — | sa-conformance báo coverage ASR → ADR/CMP ≥ 100% |
(không đổi bởi SEC) |
SEC không tạo CMP/ASR mới; có đề xuất 1 ADR mới (service-authn) chưa viết |
Kết luận tự chấm (riêng phần SEC): Hoạt động sec hoàn tất đúng phạm vi được giao — threat
model STRIDE đủ 8 ranh giới tin cậy yêu cầu (31 THR), mô hình authn/authz đầy đủ cho Guest/
Customer/Seller/Admin + phát hiện khoảng trống service-to-service authn (mới, OQ-050), map đủ
2/2 ROLE-nn của RBAC_CartCheckout, PCI-DSS/NĐ13/2023 rà theo yêu cầu (mọi kết luận PII đánh
dấu "đề xuất chờ Legal"), audit log + secret management + chuỗi cung ứng đã chốt trường/chính
sách đề xuất. AG2 còn xa vì (a) INF (hoạt động 7) chưa chạy, (b) Security chưa có người
(OQ-007) nên không ai có quyền phủ quyết/ký — đây là điều kiện chặn nghiêm trọng nhất, đúng
cảnh báo của GUIDE.md: "phát hiện muộn nhất và đau nhất luôn đến từ đây."
② Checklist D1–D12 (design-rules.md)
| # | Mục | ☐/✅ | Ghi chú |
|---|---|---|---|
| D1 | Một ADR một quyết định | N/A | SEC không viết ADR mới ở lượt này — chỉ đề xuất 1 ADR ứng viên (service-authn, §2.4) cho hoạt động adr kế tiếp |
| D2 | Không NFR định tính | ✅ | Mọi ngưỡng (rate-limit, TTL token, lockout) đều có con số hoặc đánh dấu rõ "chưa chốt" kèm OQ — không có mục nào ghi "bảo mật tốt" chung chung |
| D3 | Nêu phương án bị loại + lý do | ✅ | §2.4 (3 phương án service-authn, PA-1/PA-2 bị loại có lý do gắn ràng buộc SAD §7) |
| D4 | Sơ đồ khai báo mức + legend | ✅ | §1 khai báo rõ "ranh giới tin cậy" (flowchart LR theo D4), có legend |
| D5 | Interface có chủ/contract | N/A | Đã xử lý ở ICD (hoạt động 4); SEC chỉ bổ sung khía cạnh xác thực/authz cho các IF đã có |
| D6 | Phụ thuộc ngoài process có timeout/retry | N/A | Đã xử lý ở FAIL (hoạt động 8); SEC chỉ bổ sung khía cạnh threat/xác thực |
| D7 | Một chủ sở hữu dữ liệu | N/A | Đã xử lý ở DAT (hoạt động 5); SEC chỉ tham chiếu khi thiết kế IAM theo schema (§4.7) |
| D8 | Ràng buộc có FIT hoặc nhãn khuyến nghị | 🟡 Một phần | Đề xuất FIT-29 (secret scan), FIT-30 (service-authn test, chờ OQ-050), FIT-31 (webhook signature test, chặn bởi ARISK-03/04), FIT-32 (audit completeness), FIT-33 (TLS/HSTS config test) — ứng viên GĐ3, chưa viết thật; các threat chưa có biện pháp đủ (THR-09/13/17/22) đánh dấu rõ "chưa kiểm chứng được", không giả vờ đã có FIT |
| D9 | Con số hạ tầng quy ra tiền + nguồn | N/A | SEC không thêm con số hạ tầng mới (Secrets Manager/WAF đã có trong TCO/SAD từ trước) |
| D10 | Không quyết định thay người có thẩm quyền | ✅ | Mọi kết luận PII/residency đánh dấu "đề xuất chờ Legal/Security" (§5, §8.2); rate-limit (§5.3), account lockout (§2.3), service-authn (§2.4) đều trình phương án kèm hệ quả hai chiều, không tự quyết; §4.9 để trống vì không tự chấp nhận rủi ro thay Security |
| D11 | Có mục "Ngoài phạm vi" + ASM-nn |
✅ | §10 đầy đủ — ASM-39…41 mới, có cách xác minh/hệ quả |
| D12 | Câu quy định thẩm quyền sơ đồ vs văn bản | ✅ | Có ngay sau Change Log |
③ Bảng đối chiếu với bộ BA — RBAC ↔ SEC
RBAC_CartCheckout (BA) |
Nội dung | SEC tương ứng |
Khớp? | Hành động |
|---|---|---|---|---|
| §1 (2 vai trò: Guest, Customer) | Ma trận vai trò | §3.1 (map đủ ROLE-01/02) |
✅ | Không lệch — 2/2 ROLE-nn có dòng map, đúng yêu cầu "mỗi ROLE-nn phải có đúng một dòng, thiếu ⇒ chặn AG2" |
| §2 (không ai xem giỏ/đơn người khác) | Ranh giới ownership | §3 (fail-closed), THR-07 |
✅ | Khớp — ASR-007/ADR-007 đã hiện thực hoá đúng |
| §3 (SoD không áp dụng) | Tự phục vụ, không có duyệt kép | §3.2 | ✅ | Kế thừa nguyên trạng kết luận của BA, không lệch |
| §4 (mức che PII cho seller — chưa chốt) | Whitelist chưa quyết định mức che | §5.2, OQ-053 (mới) |
🟡 Một phần | SEC xác nhận whitelist 3 trường (ADR-008) nhưng mức che cụ thể vẫn chưa chốt như BA đã ghi nhận — BA không cần sửa RBAC, câu hỏi này tiếp tục do Security/Legal quyết định khi có người |
| §5 (lưu vết — "chưa chốt thời hạn") | Audit log cho Order/Payment |
§7 (10 năm, append-only) | 🟡 Một phần | SEC đề xuất retention cụ thể (10 năm) — BA có thể cập nhật RBAC_CartCheckout §5 tham chiếu SEC §7 khi retention được Security/Tech Lead xác nhận thật |
| §6 (hành vi khi không đủ quyền) | 403/không hiển thị dữ liệu | §3 (fail-closed 503 cho lỗi kỹ thuật, phân biệt với 403 thật) | ✅ Bổ sung | SEC làm rõ thêm trường hợp BA chưa phân biệt (lỗi kỹ thuật khi kiểm tra ownership ≠ "không có quyền" thật) — BA nên bổ sung AC mới cho E-CART-0007 (đã ghi ở FAIL, nhắc lại ở đây) |
§8 OQ-012 (Guest OTP đơn giá trị cao) |
Chưa chốt | (ngoài phạm vi SEC — thuộc BR-CART-03, quyết định PO) |
➖ N/A | Không hành động — đây là quyết định nghiệp vụ, không phải kiến trúc bảo mật |
§8 OQ-015 (chống lạm dụng Guest checkout) |
Chưa chốt | §5.3 (đề xuất rate-limit checkout 10/phút) | ✅ Trả lời | SEC đã đề xuất số cụ thể — BA có thể đóng OQ-015 trong sổ BA, tham chiếu SEC §5.3, với điều kiện Security xác nhận số cuối cùng |
§8 OQ-016 (mức che PII cho seller) |
Chưa chốt | Trùng với RBAC §4 ở trên |
🟡 Một phần | Cùng trạng thái — chờ Security/Legal, xem OQ-053 (SA) |
④ Danh sách OQ mở kèm người phải trả lời, chặn gì
Xem §11 (OQ-048…053 mới) cộng cập nhật OQ-007/023/024. Ba câu hỏi quan trọng nhất cho AG2:
OQ-007 (chưa có người Security/Legal — chặn toàn bộ hiệu lực phủ quyết của SEC),
OQ-050 (service-to-service authn — khoảng trống kiến trúc mới phát hiện, ảnh hưởng TB3/TB4
nơi PII và tiền đi qua), OQ-048/OQ-049 (chưa có tài liệu/sandbox đối tác thanh toán/vận
chuyển thật — chặn kiểm chứng phần lớn threat model TB5/TB6). Sổ đầy đủ: 00-index/OQ_e-commerce.md.
Nhắc: AG2 cần Tech Lead + Security + Ops/SRE ký — còn thiếu INF (hoạt động 7) và chưa
có người Security để ký bất kỳ phần nào của SEC. Đây là rủi ro tiến độ nghiêm trọng nhất của
toàn GĐ2: theo GUIDE.md, "Bước sec cần một người thật từ Security ngồi cùng" — điều này chưa
xảy ra trong suốt hoạt động sec vừa chạy, toàn bộ nội dung là công việc chuẩn bị một chiều của
SA, chờ người đó xuất hiện.