Quản trị rủi ro
Bảo mật và quyền riêng tư
Alliance App giữ tin nhắn, công việc nội bộ và giao dịch tiền của 500.000 người. Bài này là những luật cứng về dữ liệu, quyền và bí mật — kiểm tra từ chặng thiết kế, không phải chặng cuối.
Nội dung bài
Thuật ngữ trong bài (17)
- quality gate · cổng chất lượng
- commit · điểm lưu thay đổi
- linter · máy soát mã
- merge · gộp nhánh
- pipeline · dây chuyền tự động
- pull request · yêu cầu gộp mã
- rollback · quay về bản cũ
- incident · sự cố
- baseline · mốc nền
- keystore · kho khóa ký ứng dụng
- MASVS · chuẩn kiểm định bảo mật app mobile
- OWASP · tổ chức chuẩn bảo mật ứng dụng
- permission · quyền truy cập
- API · giao diện lập trình
- deep link · liên kết vào thẳng màn hình
- SDK · bộ thư viện tích hợp
- token · khóa truy cập
Chỗ đứng của bài này
Security baseline và privacy là phần kỹ thuật phía client: OWASP MASVS, keystore, certificate validation, deep link, kiểm kê SDK, khai báo dữ liệu trên store.
Bài này là phần chính sách và dữ liệu: ta giữ cái gì, ai được xem, giữ bao lâu, chặn ở chặng nào trong quy trình, và làm gì khi nghi ngờ rò rỉ. Hai bài đi cùng nhau, không thay được nhau.
Ta đang giữ cái gì
| Loại dữ liệu | Ở module | Mức nhạy cảm |
|---|---|---|
| Nội dung tin nhắn | Chat | Rất cao — trao đổi nội bộ doanh nghiệp |
| Danh bạ, quan hệ nhóm | Chat | Cao |
| Nội dung công việc, tiến độ | Task | Cao — lộ ra kế hoạch kinh doanh |
| Đơn hàng, doanh số, giá | Bán hàng | Rất cao |
| Thông tin khách hàng | Bán hàng | Rất cao — dữ liệu cá nhân bên thứ ba |
| Thông tin thanh toán | Bán hàng | Không lưu, tuyệt đối |
Với 500.000 người dùng, một sự cố rò rỉ không còn là chuyện kỹ thuật — nó là chuyện pháp lý, chuyện uy tín, và là thứ không rollback được. Dữ liệu đã ra ngoài thì vĩnh viễn ở ngoài.
Vì vậy đây là lĩnh vực mà shift left không phải lời khuyên mà là cách duy nhất khả thi: chặn ở thiết kế, vì chặng sau không có cơ hội sửa.
Luật cứng, không ngoại lệ
- Không lưu mật khẩu dạng đọc được. Chỉ lưu bản băm có muối bằng thuật toán chuyên dụng.
- Không lưu thông tin thẻ. Mọi thứ liên quan thẻ đi qua nhà cung cấp thanh toán, ta chỉ giữ mã tham chiếu.
- Không ghi log dữ liệu nhạy cảm. Không log mật khẩu, token, nội dung tin nhắn, số thẻ, thông tin cá nhân khách hàng. Log lộ ra nhiều dữ liệu hơn cả cơ sở dữ liệu, vì nó bị sao chép đi khắp nơi.
- Không đưa dữ liệu thật về môi trường test. Dùng dữ liệu sinh bằng script. Cần dữ liệu thật để điều tra thì phải che danh và có người duyệt.
- Không có bí mật trong kho mã. Khoá, token, chuỗi kết nối nằm trong biến môi trường. Quality gate quét mọi commit.
- Mọi kiểm tra quyền đều ở server. Ẩn nút trên giao diện là trải nghiệm, không phải bảo mật. Kẻ tấn công gọi thẳng API, không bấm nút.
- Mọi kết nối đều mã hoá. Không có ngoại lệ cho môi trường nội bộ.
- Không tự viết mã hoá. Dùng thư viện chuẩn, đã được kiểm chứng.
Vi phạm một trong tám điều trên là lý do đủ để chặn merge, bất kể tiến độ.
Quyền truy cập
Nguyên tắc: mặc định là từ chối. Mỗi quyền được cấp phải trả lời được "vì sao người này cần".
| Luật | Cụ thể |
|---|---|
| Quyền tối thiểu | Mỗi người, mỗi dịch vụ chỉ có đúng quyền cần để làm việc |
| Kiểm tra ở server, mọi lần | Không tin dữ liệu từ client, kể cả định danh người dùng |
| Quyền theo vai trò | Không cấp quyền lẻ cho từng người, sẽ không ai quản được |
| Xem lại định kỳ | Hằng quý rà soát ai đang có quyền gì, thu hồi quyền thừa |
| Thu hồi ngay khi nghỉ việc | Trong ngày, không chờ cuối tháng |
| Truy cập dữ liệu production | Phải có lý do ghi lại và dấu vết kiểm tra |
Với dữ liệu doanh số và thông tin khách hàng, mọi lần truy cập của người nội bộ đều được ghi lại — ai, lúc nào, xem gì, vì sao. Dấu vết này tự nó là một biện pháp phòng ngừa.
Quyền riêng tư theo thiết kế
Trả lời bốn câu này ở chặng viết yêu cầu, không phải ở chặng review:
| Câu hỏi | Nếu không trả lời được |
|---|---|
| Tính năng này thu thập dữ liệu gì? | Chưa được bắt đầu code |
| Mỗi trường dữ liệu phục vụ việc gì cụ thể? | Trường nào không trả lời được thì bỏ |
| Dữ liệu này giữ bao lâu, rồi xoá thế nào? | Chưa đạt Definition of Ready |
| Ai được xem, và ghi lại việc xem ở đâu? | Chưa đạt Definition of Ready |
Nguyên tắc nền: dữ liệu không thu thập là dữ liệu không thể rò rỉ. Cách giảm rủi ro rẻ nhất luôn là không lưu thứ mình không thật sự cần.
Bốn quyền của người dùng phải làm được, không phải làm sau:
- Biết ta giữ dữ liệu gì về họ.
- Lấy ra bản sao dữ liệu của mình.
- Sửa dữ liệu sai.
- Xoá tài khoản và dữ liệu, thật sự xoá, kể cả trong bản sao lưu theo chu kỳ.
Kiểm tra bảo mật trong pipeline
| Chặng | Kiểm tra | Chặn khi |
|---|---|---|
| Lúc viết yêu cầu | Bốn câu hỏi quyền riêng tư ở trên | Chưa trả lời |
| Lúc gõ code | Linter bảo mật, cảnh báo hàm nguy hiểm | Có cảnh báo mức cao |
| Mỗi commit | Quét bí mật lộ trong mã | Tìm thấy bất kỳ khoá nào |
| Mỗi PR | Quét lỗ hổng thư viện phụ thuộc | Có lỗ hổng mức cao trở lên |
| Mỗi PR đụng quyền hoặc dữ liệu cá nhân | Bắt buộc 2 người duyệt | Thiếu người duyệt thứ hai |
| Hằng đêm | Quét lại toàn bộ phụ thuộc | Có lỗ hổng mới công bố |
| Hằng quý | Rà soát quyền, kiểm tra thâm nhập | Theo lịch |
Dòng quét bí mật là dòng phải có trước tiên: một khoá lộ trong lịch sử git thì xoá commit không đủ, phải coi khoá đó đã mất và thay khoá mới.
Khi nghi ngờ có rò rỉ
Đây là sự cố mức cao nhất theo xử lý sự cố, tự động là P0.
- Không xoá dấu vết. Log và dữ liệu hiện trạng là bằng chứng để hiểu phạm vi.
- Chặn đường vào: thu hồi khoá, khoá tài khoản nghi ngờ, tắt tính năng liên quan.
- Xác định phạm vi: dữ liệu nào, bao nhiêu người, trong khoảng thời gian nào.
- Báo người có thẩm quyền trong công ty ngay, không chờ điều tra xong.
- Thông báo cho người dùng bị ảnh hưởng khi đã xác định phạm vi — trung thực, cụ thể, kèm việc họ nên làm.
- Xem lại sau sự cố với bốn câu hỏi shift left như mọi sự cố khác.
Che giấu một sự cố rò rỉ luôn gây thiệt hại lớn hơn bản thân sự cố. Đây là điều không thương lượng trong đội này.
Mức tối thiểu cho từng module
| Module | Bắt buộc riêng |
|---|---|
| Chat | Nội dung tin nhắn không bao giờ vào log; kiểm tra quyền thành viên nhóm ở server mỗi lần đọc |
| Task | Kiểm tra quyền theo dự án ở server; lịch sử thay đổi không sửa được |
| Bán hàng | Không lưu dữ liệu thẻ; dấu vết kiểm tra đầy đủ cho mọi thay đổi tiền; đối soát hằng ngày |
| Chung | Hết phiên sau thời gian không hoạt động; đăng xuất từ xa được; khoá tài khoản sau nhiều lần sai mật khẩu |

