Bảo mật & bảo vệ dữ liệu

Dữ liệu bệnh nhân là tài sản nhạy cảm nhất của phòng khám. Trang này giải thích — bằng ngôn ngữ dễ hiểu — DentIQ bảo vệ dữ liệu của bạn như thế nào: tách biệt dữ liệu giữa các phòng khám và chi nhánh, kiểm soát ai xem được gì, mã hoá thông tin nhạy cảm, bảo vệ tệp đính kèm, và ghi vết mọi thao tác quan trọng.

Nguyên tắc nền tảng

Mọi kiểm soát bảo mật được thực thi ở máy chủ (backend), không phải ở giao diện. Việc ẩn/hiện nút trên màn hình chỉ để trải nghiệm; quyền truy cập thật sự luôn được kiểm tra lại ở server cho mỗi yêu cầu.

1. Cô lập dữ liệu giữa các phòng khám

Mỗi phòng khám (clinic) là một tenant độc lập. Không phòng khám nào nhìn thấy dữ liệu của phòng khám khác — kể cả khi dùng chung hạ tầng.

  • Mỗi yêu cầu (request) gắn sẵn clinicId lấy từ phiên đăng nhập, không lấy từ tham số người dùng gửi lên. Nhờ vậy không thể "đổi clinicId" để xem dữ liệu phòng khám khác.
  • Mọi truy vấn dữ liệu (bệnh nhân, thanh toán, hồ sơ, báo cáo, xuất Excel) đều được lọc theo clinicId này.
  • Khi phòng khám bị khoá/ngừng hoạt động, phiên truy cập bị chặn ngay ở lớp bảo vệ tenant.

2. Cô lập giữa các chi nhánh

Trong cùng một phòng khám, dữ liệu vận hành và tài chính được phân theo chi nhánh.

  • Chi nhánh sở hữu một bản ghi được xác định từ chính bản ghi nguồn (lượt khám, kế hoạch điều trị, phiếu thu) — không phải từ chi nhánh đang chọn trên thanh công cụ.
  • Chi nhánh đang chọn ở giao diện chỉ là bộ lọc xem; nó không thay đổi quyền sở hữu hay quyền chỉnh sửa bản ghi.
  • Người dùng chỉ có phạm vi một số chi nhánh sẽ không truy cập được số liệu tài chính/vận hành của chi nhánh ngoài phạm vi.

Để hiểu rõ khái niệm Clinic vs Chi nhánh, xem Tổng quanBranch & nhân sự.

3. Phân quyền tối thiểu (least privilege)

DentIQ dùng mô hình phân quyền theo vai trò: 7 vai trò mặc định60 mã quyền clinic. Mỗi người chỉ được cấp đúng quyền cần cho công việc.

  • Quyền clinic và quyền hệ thống (platform) không trộn lẫn — clinic admin không thể vô tình cầm mã quyền cấp nền tảng.
  • Thiếu quyền xem dữ liệu tài chính ⇒ giá trị tiền được ẩn với thông báo "Dữ liệu bị ẩn do thiếu quyền" — không bao giờ hiển thị số 0 giả gây hiểu nhầm "không nợ".
  • Thiếu quyền chỉnh sửa ⇒ màn hình chuyển sang chỉ-đọc, các nút thao tác bị ẩn.

Danh sách đầy đủ mã quyền: xem 60 mã quyền clinic.

4. Bảo vệ mật khẩu & đăng nhập

  • Mật khẩu không bao giờ lưu dạng văn bản thường. DentIQ băm mật khẩu bằng bcrypt (có salt); ngay cả quản trị hệ thống cũng không đọc được mật khẩu của bạn.
  • Khoá sau nhiều lần sai: đăng nhập sai nhiều lần liên tiếp sẽ tạm khoá tài khoản (tính toán nhất quán trên nhiều máy chủ).
  • Giới hạn tần suất: các API đăng nhập/đặt lại mật khẩu bị giới hạn số lần gọi để chống dò mật khẩu tự động.
  • Đặt lại mật khẩu an toàn: liên kết đặt lại dùng token ngẫu nhiên, chỉ dùng một lần, có hạn dùng; yêu cầu quên mật khẩu luôn trả về cùng một thông báo để không lộ email nào có tồn tại.

5. Phiên đăng nhập & thu hồi

  • Token đăng nhập được lưu trong cookie httpOnly, secure — JavaScript của trang không đọc được, giảm rủi ro đánh cắp qua XSS.
  • Mỗi yêu cầu kiểm tra lại phiên còn hiệu lực ở máy chủ, nên khi bạn thu hồi một phiên, nó mất hiệu lực ngay lập tức.
  • Bạn có thể xem danh sách thiết bị đang đăng nhập và đăng xuất từng phiên hoặc tất cả; đổi mật khẩu sẽ tự đăng xuất các phiên khác.

6. Mã hoá dữ liệu

  • Khi truyền đi (in transit): toàn bộ kết nối tới DentIQ dùng HTTPS/TLS, dữ liệu được mã hoá trên đường truyền.
  • Khi lưu trữ (at rest): cơ sở dữ liệu và ổ lưu trữ được mã hoá ở tầng hạ tầng; quyền truy cập cơ sở dữ liệu được kiểm soát chặt.
  • Thông tin tích hợp nhạy cảm được mã hoá ở tầng ứng dụng: thông tin xác thực nhà cung cấp hoá đơn điện tử (VNPT, MISA, Viettel) và kênh gửi tin (Zalo ZNS, SMS Brandname) được mã hoá AES-256-GCM khi lưu và che bớt khi hiển thị — nhân viên không đọc được khoá/mật khẩu gốc của nhà cung cấp.
Minh bạch về phạm vi mã hoá

Mã hoá ở tầng ứng dụng (AES-256-GCM) áp dụng cho thông tin xác thực nhà cung cấp. Dữ liệu nhận dạng bệnh nhân (số điện thoại, CCCD, địa chỉ…) được bảo vệ bằng cô lập tenant/chi nhánh, phân quyền và mã hoá hạ tầng, chứ không mã hoá riêng từng cột. Chúng tôi nêu rõ điều này để bạn nắm đúng mức bảo vệ.

7. Bảo vệ tệp & ảnh lâm sàng

  • Tệp tải lên (ảnh lâm sàng, tài liệu) được lưu trong kho lưu trữ đối tượng với đường dẫn ngẫu nhiên không thể đoán, phân theo từng phòng khám.
  • Truy cập tệp qua liên kết ký số có hạn dùng (signed URL, mặc định ~15 phút) — không có liên kết công khai vĩnh viễn.
  • Khi người xem thiếu quyền, liên kết tệp trả về rỗng (ẩn) thay vì lộ tệp — tuân theo nguyên tắc ẩn-không-giả-mạo.
  • Quyền theo phòng khám và chi nhánh được áp dụng cả khi tải/tải xuống tệp.

8. Ghi vết & truy xuất (Audit)

  • Mọi thao tác nhạy cảm (xem/sửa hồ sơ, thanh toán, phân quyền, đăng nhập) được ghi audit log.
  • Audit chỉ lưu metadata (ai, lúc nào, hành động gì) — không lưu nội dung lâm sàng thô, không lưu nội dung thanh toán chi tiết, không lưu nội dung tệp.
  • Mỗi phòng khám chỉ xem được audit của chính mình.

Chi tiết: xem Audit log.

9. Cổng tra cứu cho bệnh nhân

Nếu phòng khám bật cổng tra cứu (QR), bệnh nhân quét mã rồi xác thực bằng OTP qua số điện thoại trước khi xem thông tin của mình. Phạm vi xem được lấy từ token đã xác thực, không từ dữ liệu người dùng nhập; số lần thử sai OTP bị giới hạn để chống dò.

10. Bạn nên làm gì

  • Cấp quyền theo đúng vai trò, tránh cấp thừa quyền tài chính cho người không cần.
  • Yêu cầu nhân viên đăng xuất khỏi máy dùng chung; kiểm tra danh sách phiên định kỳ.
  • Chỉ nhập thông tin nhà cung cấp (e-invoice, SMS/Zalo) trên môi trường chính thức của phòng khám.
  • Khi nhân viên nghỉ việc, thu hồi tài khoản và phiên đăng nhập ngay.

Câu hỏi thường gặp về bảo mật & sao lưu dữ liệu: xem FAQ.