AllianceProject Handbook
← Knowledge

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.

Cập nhật 12/09/2026bảo mậtquyền riêng tưshift left

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Ở moduleMức nhạy cảm
Nội dung tin nhắnChatRất cao — trao đổi nội bộ doanh nghiệp
Danh bạ, quan hệ nhómChatCao
Nội dung công việc, tiến độTaskCao — lộ ra kế hoạch kinh doanh
Đơn hàng, doanh số, giáBán hàngRất cao
Thông tin khách hàngBán hàngRất cao — dữ liệu cá nhân bên thứ ba
Thông tin thanh toánBán hàngKhô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ệ

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. Mọi kết nối đều mã hoá. Không có ngoại lệ cho môi trường nội bộ.
  8. 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ậtCụ thể
Quyền tối thiểuMỗ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ầnKhô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ệcTrong ngày, không chờ cuối tháng
Truy cập dữ liệu productionPhả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ỏiNế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ặngKiểm traChặn khi
Lúc viết yêu cầuBốn câu hỏi quyền riêng tư ở trênChưa trả lời
Lúc gõ codeLinter bảo mật, cảnh báo hàm nguy hiểmCó cảnh báo mức cao
Mỗi commitQuét bí mật lộ trong mãTìm thấy bất kỳ khoá nào
Mỗi PRQuét lỗ hổng thư viện phụ thuộcCó lỗ hổng mức cao trở lên
Mỗi PR đụng quyền hoặc dữ liệu cá nhânBắt buộc 2 người duyệtThiếu người duyệt thứ hai
Hằng đêmQuét lại toàn bộ phụ thuộcCó lỗ hổng mới công bố
Hằng quýRà soát quyền, kiểm tra thâm nhậpTheo 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.

  1. 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.
  2. 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.
  3. Xác định phạm vi: dữ liệu nào, bao nhiêu người, trong khoảng thời gian nào.
  4. Báo người có thẩm quyền trong công ty ngay, không chờ điều tra xong.
  5. 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.
  6. 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

ModuleBắt buộc riêng
ChatNộ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
TaskKiểm tra quyền theo dự án ở server; lịch sử thay đổi không sửa được
Bán hàngKhô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
ChungHế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