Bỏ qua để đến nội dung

Bảo mật

Các cơ chế Admin as a Service dùng để bảo vệ thông tin kết nối, cơ sở dữ liệu của khách hàng, màn hình tuỳ biến và nhật ký.

6 phút đọc

Trang này mô tả các lớp bảo vệ của nền tảng, dành cho quản trị viên và đội bảo mật phía khách hàng. Với một công cụ admin, rủi ro lớn nhất nằm ở đường truy cập tới cơ sở dữ liệu thật, nên phần lớn các lớp bảo vệ dưới đây tập trung vào điểm này.

  • Mã hoá nhiều lớp (envelope encryption): mỗi cấu hình kết nối có một khoá dữ liệu riêng và được mã hoá bằng AES-256-GCM. Khoá dữ liệu được bọc tiếp bằng khoá chủ. Một bản ghi bị lộ không kéo theo các bản ghi khác.
  • Thông tin kết nối chỉ được giải mã trên máy chủ thực thi, ngay trước khi mở kết nối tới cơ sở dữ liệu.
  • Thông tin bí mật không bao giờ được gửi ngược về trình duyệt. Mật khẩu, private key của client certificate và giá trị header của data source HTTP không được trả về giao diện, kể cả ở dạng che. Giao diện chỉ cho biết “Đã có mật khẩu”; chứng chỉ chỉ hiện ở dạng tóm tắt (tên, ngày hết hạn).
  • Secret chỉ ghi, không đọc lại được, kể cả với admin hay owner. Để đổi secret, ghi đè giá trị mới.
  • Thông tin kết nối không được ghi vào log.
  • Người dùng không gửi SQL. Trình duyệt chỉ gửi tên action và tham số; máy chủ tự lấy câu SQL đã publish.
  • SQL được kiểm tra lúc publish. Publish bị chặn khi: một param không phải enum nằm ở vị trí tên cột hoặc tên bảng; có nhiều câu lệnh mà không khai báo transaction; có lệnh thay đổi cấu trúc (DROP, ALTER, TRUNCATE, GRANT) trong khi data source không cho phép; hoặc action Chỉ đọc chứa INSERT, UPDATE, DELETE. Với MySQL, mỗi action chỉ được có một câu lệnh.
  • Tham số luôn được truyền tách khỏi SQL, không bao giờ ghép chuỗi. Tên cột động chỉ chấp nhận giá trị trong danh sách enum cố định.
  • Action Chỉ đọc chạy trong transaction chỉ đọc. Nhờ đó, cơ sở dữ liệu tự từ chối câu lệnh ghi, kể cả khi tầng phía trên có lỗi.
  • Giới hạn thời gian và khoá: timeout theo từng action, huỷ câu lệnh chờ khoá quá 3 giây, giới hạn số dòng và kích thước kết quả. Xem Giới hạn.
  • Kết nối tách theo môi trường: kết nối của dev không bao giờ được dùng để chạy ở prod.
  • Khi thử kết nối data source HTTP, hệ thống chỉ gọi tới host trong danh sách cho phép. Mọi địa chỉ nội bộ bị chặn sau khi phân giải DNS, ngay trước lúc kết nối. Hiện chưa có loại action nào gọi data source HTTP.

Biện pháp bảo vệ hiệu quả nhất vẫn nằm ở phía khách hàng: cấp cho Admin as a Service một tài khoản cơ sở dữ liệu có ít quyền nhất có thể. Xem Triển khai.

Ở mỗi lần chạy action, dù từ trang Chạy action, màn hình, JS action hay job, máy chủ lần lượt kiểm tra các điều kiện sau:

  1. Người chạy có quyền vào môi trường này.
  2. Action được bật ở môi trường này.
  3. Người chạy có quyền trên action (chế độ open, hoặc có tên trong danh sách cấp quyền của chế độ restricted). Với JS action, JS action đó phải được phép gọi action con và người chạy gốc vẫn phải có quyền.
  4. Khi gọi từ màn hình: action nằm trong danh sách action mà view khai báo.
  5. IP của người chạy nằm trong IP allowlist của môi trường.
  6. Lần chạy không vượt giới hạn tần suất.

Nếu thiếu bất kỳ điều kiện nào, lần chạy bị từ chối và vẫn được ghi vào nhật ký.

  • View chạy trong iframe cách ly (sandbox) ở một origin riêng, tách khỏi ứng dụng chính. View không đọc được phiên đăng nhập của ứng dụng và không tự gọi mạng ra ngoài; mọi dữ liệu đều đi qua action.
  • View chạy bằng quyền của người đang xem. Việc publish một view không cấp quyền cho ai. Nếu người xem không có quyền trên một action, phần tương ứng không có dữ liệu nhưng màn hình vẫn hiển thị.
  • Khi publish view, máy chủ kiểm tra lại: kiểm tra kiểu thật, danh sách thư viện được phép import và quyền của người publish trên từng action mà view khai báo.
  • Transformer và JS action chạy trong sandbox cách ly trên máy chủ, không có truy cập mạng. JS action không nhận secret, và mỗi action con mà nó gọi đều qua đủ các bước kiểm quyền ở trên.
  • Mọi lần chạy đều được ghi, kể cả lần bị từ chối, cùng với mọi thay đổi về action, quyền, môi trường, data source, biến, secret, view, job và lịch.
  • Nhật ký chỉ cho phép thêm, không sửa và không xoá.
  • Dữ liệu trả về không được lưu: nhật ký và lịch sử chạy ghi số dòng, không ghi nội dung. Param có tên chứa password, token, secret, api_key… được ẩn giá trị.
  • Xoá người dùng hay project không xoá nhật ký và lịch sử chạy liên quan.

Xem Nhật ký.

  • Không có đăng ký công khai; chỉ owner tạo được tài khoản.
  • Mật khẩu có tối thiểu 12 ký tự.
  • Đổi mật khẩu sẽ đăng xuất mọi tab và thiết bị khác. Khi owner đặt lại mật khẩu hoặc xoá một người dùng, phiên của người đó bị thu hồi ngay.
  • Mỗi khách hàng có một tổ chức tách biệt. Dữ liệu, khoá mã hoá và secret không dùng chung với khách hàng khác.
  • Kết nối tới cơ sở dữ liệu được tách theo tổ chức, data source và môi trường.
  • Lưu lượng từ máy chủ thực thi tới hệ thống của khách hàng đi ra từ một IP cố định dành riêng cho bản triển khai đó, nên firewall chỉ cần mở cho đúng một địa chỉ. Xem Triển khai.