Giải thích về API hộp cát

Sandboxed API (SAPI) được xây dựng dựa trên dự án Sandbox2 đã được thiết lập. Trang này giải thích cấu trúc thiết kế của SAPI và các khái niệm chính.

Tổng quan

SAPI được thiết kế để cung cấp cho nhà phát triển các công cụ chuẩn bị thư viện C/C++ cho quá trình tạo hộp cát, cũng như các API cần thiết để giao tiếp với phiên bản hộp cát của thư viện C/C++.

Sơ đồ này cho thấy cấu trúc của một thư viện C/C++ được cách ly SAPI:

Sơ đồ SAPI

SAPI cũng cung cấp các thành phần cơ bản để đồng bộ hoá bộ nhớ theo cách thủ công và tự động (dựa trên các thuộc tính con trỏ tuỳ chỉnh) (mảng, cấu trúc) giữa Thư viện SAPI và mã máy chủ.

Cuối cùng, Transactions API cấp cao cho phép theo dõi Thư viện SAPI và khởi động lại các thư viện này nếu chúng gặp lỗi (ví dụ: do vi phạm bảo mật, sự cố hoặc cạn kiệt tài nguyên).

Sandbox2

Dự án nguồn mở Sandbox2 được các kỹ sư bảo mật của Google phát triển và duy trì, đồng thời là công nghệ hộp cát cốt lõi mà SAPI sử dụng. Sandbox2 có 3 thành phần chính là Sandbox Policy, ExecutorSandboxee.

Chính sách về hộp cát

Chính sách hộp cát xác định môi trường thực thi bị hạn chế cho Thư viện hộp cát. Điều này đạt được bằng cách làm rõ những syscall có thể được thực thi. SAPI sử dụng cơ chế tương tự như Sandbox2, hãy xem phần Chính sách hộp cáttrang Bắt đầu của Sandbox2 để biết thêm thông tin về cách thiết kế và xác định chính sách hộp cát.

SAPI sử dụng chính sách mặc định, ngoài ra, bạn có thể sử dụng chính sách hộp cát chuyên dụng bằng cách xác định chính sách đó trong tệp tiêu đề sandbox.h và truyền chính sách đó làm đối số trong quy tắc tạo sapi_library.

Thư viện dạng hộp cát

Đây là thư viện C/C++ trong hộp cát sẽ được thực thi trong môi trường hộp cát bị hạn chế do Sandbox2 cung cấp. Cuối cùng, Sandboxed Library sẽ hiển thị chức năng cần thiết mà Mã máy chủ lưu trữ có thể sử dụng.

Sandboxed Library được tạo bằng quy tắc tạo sapi_library, trong đó bạn có thể chỉ định một chính sách hộp cát tuỳ chỉnh xác định môi trường thực thi bị hạn chế. Tuỳ thuộc vào thư viện, bạn có thể phải viết mã trình bao bọc hoặc mã gốc (xem libcurl), nhưng bạn không cần thay đổi mã nguồn của thư viện C/C++ trong khi chuẩn bị phiên bản SAPI.

Đối tượng SAPI và phần gốc RPC

Đối tượng SAPI là một đối tượng C++ hiển thị API của Thư viện trong hộp cát. Thư viện này chuyển các lệnh gọi từ Mã máy chủ đến RPC Stub (một phần mềm được nhúng trong Thư viện SAPI cùng với Thư viện hộp cát).

Hai phần tử này được hệ thống tạo bản dựng tự động tạo bằng cách sử dụng quy tắc tạo bản dựng sapi_library(). SAPI hỗ trợ 2 hệ thống xây dựng là Bazel của Google và CMake.

Mã máy chủ lưu trữ

Mã máy chủ lưu trữ là mã triển khai logic do thư viện SAPI cung cấp. Đây là những gì sẽ sử dụng phiên bản chưa được hộp cát của thư viện C/C++. Do đó, Mã máy chủ gọi các hàm do thư viện SAPI xuất, truyền dữ liệu đến và nhận dữ liệu từ hộp cát.

Mã máy chủ cần được điều chỉnh để sử dụng thư viện SAPI. Đáng chú ý nhất là bạn không thể gọi các hàm của thư viện vì thư viện nằm trong một quy trình riêng biệt được cách ly. Do đó, SAPI cung cấp các công cụ tạo một đối tượng SAPI có chức năng làm trung gian cho các lệnh gọi đến một thư viện SAPI.

Khái niệm

Quy tắc xây dựng Bazel

Dự án SAPI cung cấp 2 quy tắc xây dựng Bazel để tạo hộp cát cho thư viện C/C++:

  • sapi_library() – Tạo tất cả các đầu ra cần thiết để đưa thư viện C/C++ vào hộp cát dưới dạng Sandboxee của Sandbox2. Bạn có thể dùng đầu ra bản dựng làm phần phụ thuộc cho quy tắc cc_binary() dùng để tạo tệp nhị phân mã máy chủ.
  • sapi_interface() – Tự động tạo tiêu đề có thể được đưa vào tệp nhị phân mã máy chủ.

Để biết nội dung giải thích đầy đủ hơn về Quy tắc xây dựng, hãy xem Quy tắc xây dựng.

Biến

SAPI cung cấp một số loại đặc biệt, được gọi là Các loại SAPI. Bạn nên sử dụng các loại này trong Mã máy chủ lưu trữ. Lý do chính cần có SAPI Types là do quy trình và do đó là bộ nhớ, sự cô lập giữa Host Code và Sandboxed Library.

Để biết nội dung giải thích đầy đủ hơn về chủ đề này và thông tin tổng quan về một số Loại SAPI thường dùng, hãy xem phần Biến.

Giao dịch

Như đã giải thích ở trên, mọi lệnh gọi API đến Thư viện có môi trường hộp cát đều được truyền qua một lớp RPC. Để có thể xử lý lỗi ở lớp này, bạn cần triển khai quy trình xử lý lỗi thích hợp. Mô-đun Giao dịch SAPI cung cấp cơ chế cần thiết để đảm bảo rằng tất cả các lệnh gọi đến Thư viện được cách ly đều hoàn tất mà không gặp bất kỳ vấn đề nào ở cấp RPC hoặc được trả về kèm theo một lỗi có liên quan.

Để biết thêm thông tin giải thích về chủ đề này, hãy xem phần Giao dịch.

Bắt đầu

Đọc trang Bắt đầu của chúng tôi để thiết lập dự án API trong hộp cát đầu tiên.