5.1 KiB
RBAC — Ma trận phân quyền — <Tên module>
| Version | 1.0 |
| Date | YYYY-MM-DD |
| Author | (skill ba-2-analysis) |
| Status | 🟡 Draft |
| Approved by | — |
| Source | |
| Scope |
Change Log
| Version | Date | Người sửa | Thay đổi | CR |
|---|
1. Vai trò
| ID | Vai trò | Ai thuộc vai trò này | Số người ước tính | Phạm vi dữ liệu | Vai trò hệ thống hiện có |
|---|---|---|---|---|---|
| ROLE-01 | Toàn hệ thống / Theo cửa hàng / Chỉ bản ghi của mình |
Phạm vi dữ liệu là cột hay bị bỏ và là nguồn của lỗ hổng bảo mật phổ biến nhất: hai người cùng vai trò nhưng chỉ được xem dữ liệu của đơn vị mình.
2. Ma trận vai trò × hành động
Ô ghi: ✅ được · ❌ không · 🔶 được nhưng có điều kiện.
🔴 Ô 🔶 bắt buộc ghi điều kiện ngay trong ô. 🔶 không điều kiện = chưa phân tích xong.
| Hành động | ROLE-01 Nhân viên |
ROLE-02 Trưởng nhóm |
ROLE-03 Kế toán |
ROLE-04 Admin |
BR |
|---|---|---|---|---|---|
| Xem danh sách | 🔶 chỉ cửa hàng phụ trách | ✅ | ✅ | ✅ | BR-030 |
| Xem chi tiết | 🔶 chỉ cửa hàng phụ trách | ✅ | ✅ | ✅ | |
| Tạo mới | ✅ | ✅ | ❌ | ✅ | |
| Sửa | 🔶 chỉ khi trạng thái Nháp | ✅ | ❌ | ✅ | BR-005 |
| Xoá | ❌ | 🔶 chỉ Nháp, cần lý do | ❌ | ✅ | BR-006 |
| Gửi duyệt | ✅ | ✅ | ❌ | ✅ | |
| Duyệt | ❌ | 🔶 không tự duyệt bản ghi mình tạo | ❌ | ❌ | SoD-01 |
| Xuất dữ liệu | 🔶 cần nhập lý do | ✅ | ✅ | ✅ | BR-031 |
| Xem lịch sử thay đổi | ❌ | ✅ | ✅ | ✅ |
Kiểm tra chất lượng ma trận: một cột toàn ✅ hoặc một hàng toàn ✅ ⇒ chưa phân tích. Luôn hỏi ngược "vai trò nào KHÔNG được làm việc này?" — câu phủ định ép ra ranh giới thật.
3. Separation of Duties (SoD)
Bắt buộc với mọi hành động phê duyệt / chốt sổ / thanh toán / cấp quyền.
| ID | Cặp hành động xung đột | Quy tắc | Hệ thống chặn thế nào | Ai giám sát |
|---|---|---|---|---|
| SoD-01 | Tạo ↔ Duyệt | Người tạo không được duyệt bản ghi của chính mình | Ẩn nút Duyệt khi createdBy = currentUser |
Kiểm toán nội bộ |
| SoD-02 | Duyệt ↔ Chi tiền |
Ngoại lệ SoD — nếu tổ chức quá nhỏ để tách vai:
| Ngoại lệ | Điều kiện | Bù đắp bằng | Ai phê chuẩn ngoại lệ |
|---|---|---|---|
| (vd: chi nhánh <3 người) | Log + báo cáo hằng tháng cho trưởng phòng |
Không có SoD trong nghiệp vụ tài chính là phát hiện của kiểm toán, không phải chi tiết nhỏ.
4. Dữ liệu nhạy cảm
| Trường/dữ liệu | Loại | Ai được xem | Che thế nào | Xuất được không | Lưu bao lâu | Căn cứ |
|---|---|---|---|---|---|---|
| Số CMND/CCCD | PII | ROLE-03, ROLE-04 | Che 6 số giữa | 🔶 cần lý do | 5 năm | |
| Số tài khoản | PII tài chính | ROLE-03 | Che 4 số cuối | ❌ |
5. Lưu vết (audit)
| Hành động | Ghi vết | Nội dung ghi | Giữ bao lâu | Ai xem được |
|---|---|---|---|---|
| Sửa bản ghi | ✅ | ai · lúc nào · trường nào · trước→sau | 2 năm | ROLE-02+ |
| Duyệt | ✅ | ai · lúc nào · ghi chú | 5 năm | ROLE-02+ |
| Xuất dữ liệu | ✅ | ai · lúc nào · lý do · số bản ghi | 5 năm | ROLE-04 |
| Đăng nhập thất bại | ✅ |
Ba câu hỏi cho mỗi hành động nhạy cảm — trả lời đủ mới coi là phân tích xong:
- Ai được xem dữ liệu này? Có phải thông tin cá nhân không?
- Có cần lưu vết không? Lưu bao lâu?
- Có cần nhập lý do khi thực hiện không?
6. Hành vi khi không đủ quyền
Quy tắc W7 — ba trạng thái khác nhau, phải chọn rõ cho từng trường hợp.
| Tình huống | Hành vi | Lý do |
|---|---|---|
| Không có quyền xem màn hình | Không hiện trong menu + chặn ở route | Tránh lộ sự tồn tại của chức năng |
| Có quyền xem, không có quyền sửa | Hiện, ở chế độ read-only | Vẫn cần tra cứu |
| Có quyền nhưng sai trạng thái | Hiện nút, disable, có tooltip nêu lý do | Người dùng cần biết vì sao không bấm được |
| Gọi thẳng API không đủ quyền | Trả 403 + ghi log | Chặn ở cả FE và BE |
🔴 Chặn ở giao diện là trải nghiệm, chặn ở backend mới là bảo mật. Ghi rõ cả hai.
7. Thay đổi so với phân quyền hiện tại
Chỉ dùng khi làm enhancement.
| Vai trò | Quyền cũ | Quyền mới | Ai bị mất quyền | Đã thông báo chưa |
|---|
Mất quyền mà không báo trước là sự cố vận hành ngày go-live.
8. Open Questions
| ID | Câu hỏi | Hỏi ai | Từ ngày | Chặn gì |
|---|