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 ổn định. 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 hộp cát cũng như với 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 thể hiện cấu trúc của thư viện C/C++ có hộp cát SAPI:

Biểu đồ SAPI

SAPI cũng cung cấp dữ liệu gốc để đồng bộ hoá bộ nhớ theo cách thủ công và tự động (dựa trên 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, API Giao dịch cấp cao cho phép giám sát Thư viện SAPI và khởi động lại thư viện nếu không thành công (ví dụ: do vi phạm bảo mật, sự cố hoặc tình trạng cạn kiệt tài nguyên).

Sandbox2

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

Chính sách 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 lệnh gọi hệ thống nào có thể được thực thi. SAPI sử dụng cơ chế tương tự như Sandbox2, hãy xem mục Chính sách hộp cáttrang Bắt đầu cho 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 tệp này làm đối số trong quy tắc xây dựng sapi_library.

Thư viện hộp cát

Đây là thư viện C/C++ dạng 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, Thư viện hộp cát cung cấp chức năng bắt buộc mà Mã máy chủ có thể sử dụng.

Thư viện hộp cát được xây dựng bằng quy tắc tạo sapi_library, trong đó bạn có thể chỉ định chính sách hộp cát tuỳ chỉnh giúp 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ã bao bọc hoặc mã giả lập (xem libcurl), nhưng dự kiến bạn sẽ không 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à mã giả lập RPC

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

Hệ thống xây dựng tự động tạo 2 phần tử này bằng quy tắc tạo bản dựng sapi_library(). SAPI hỗ trợ hai hệ thống xây dựng là BazelCMake của Google.

Mã máy chủ

Mã máy chủ là phần triển khai logic do thư viện SAPI cung cấp. Mặt khác, đó là những gì sẽ tiêu thụ phiên bản không 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.

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

Khái niệm

Quy tắc tạo Bazel

Dự án SAPI cung cấp hai 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 để đặt hộp cát thư viện C/C++ dưới dạng một Sandbox2 (Hộp cát) 2. Kết quả của bản dựng có thể được dùng làm phần phụ thuộc cho quy tắc cc_binary() dùng để tạo tệp nhị phân của mã máy chủ.
  • sapi_interface() – Tự động tạo tiêu đề có thể đưa vào tệp nhị phân của mã máy chủ.

Để xem nội dung giải thích đầy đủ hơn về Quy tắc tạo, hãy xem phần Quy tắc tạo.

Biến

SAPI cung cấp một số loại đặc biệt, được gọi là Loại SAPI, mà bạn nên dùng trong Mã máy chủ. Lý do chính khiến Cần có các Loại SAPI là vì quy trình này, và do đó, sẽ tạo bộ nhớ, sự tách biệt giữa Mã máy chủ và Thư viện hộp cát.

Để 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 bài viết Biến.

Giao dịch

Như đã giải thích ở trên, mọi lệnh gọi API đến Thư viện hộp cát đều được chuyển qua lớp RPC. Để có thể xử lý lỗi trên lớp này, bạn cần triển khai phương thức 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 tất cả các lệnh gọi đến Thư viện hộp cát đều được 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 lỗi liên quan.

Để xem nội dung giải thích đầy đủ hơn về chủ đề này, hãy xem bài viết Giao dịch.

Bắt đầu

Hãy đọc trang Bắt đầu của chúng tôi để thiết lập dự án Sandboxed API đầu tiên của bạn.