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

API chạy trong môi trường hộp cát (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ụ nhằm chuẩn bị thư viện C/C++ cho môi trường hộp cát, cũng như các API cần thiết để giao tiếp với phiên bản chạy trong môi trường hộp cát của thư viện C/C++.

Sơ đồ này cho thấy cấu trúc của thư viện C/C++ chạy trong môi trường hộp cát 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, API Giao dịch 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 không thành công (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 do các kỹ sư bảo mật của Google phát triển và duy trì. Đây 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: Chính sách hộp cát, Trình thực thi và Sandboxee.

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 chạy trong môi trường hộp cát. Điều này được thực hiện 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ùng một cơ chế như Sandbox2. Hãy xem phần Chính sách hộp cát section và trang Bắt đầu sử dụng 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.

Theo mặc định, các lớp hộp cát SAPI được tạo sẽ khởi chạy bằng DefaultConfig (sapi::SandboxConfig::DefaultConfig()). DefaultConfig() định cấu hình hộp cát với:

  • Chính sách Sandbox2 mặc định được xây dựng bằng sapi::Sandbox2Config::DefaultPolicyBuilder()
  • Giới hạn mặc định về tài nguyên và thời gian từ sapi::Sandbox2Config::DefaultLimits()
  • Đã bật tính năng giao tiếp bộ nhớ dùng chung (kết hợp với các quyền bộ nhớ dùng chung trong DefaultPolicyBuilder())
  • Cờ dòng lệnh mặc định (sapi::SandboxConfig::DefaultFlags()) và biến môi trường (sapi::SandboxConfig::DefaultEnvironmentVariables()), định cấu hình tính năng ghi nhật ký cơ sở và hành vi thời gian chạy trong sandboxee

Để tuỳ chỉnh chính sách hoặc cấu hình hộp cát, hãy bắt đầu từ sapi::SandboxConfig::DefaultConfig(), sửa đổi sapi::SandboxConfig được trả về và truyền cấu hình đó vào hàm khởi tạo hộp cát được tạo (hoặc xác định một lớp con hộp cát tuỳ chỉnh trong tệp tiêu đề sandbox.h được truyền vào quy tắc xây dựng sapi_library ). Ví dụ: bạn có thể xây dựng một chính sách bắt đầu từ sapi::Sandbox2Config::DefaultPolicyBuilder() và xâu chuỗi các quy tắc bổ sung (hoặc trực tiếp tạo một PolicyBuilder khi cần cấu hình hạn chế hơn), đồng thời khi thêm cờ hoặc biến môi trường, hãy bắt đầu từ sapi::SandboxConfig::DefaultFlags() hoặc sapi::SandboxConfig::DefaultEnvironmentVariables() để giữ nguyên các chế độ cài đặt cơ sở.

Thư viện chạy trong môi trường hộp cát

Đây là thư viện C/C++ chạy trong môi trườ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 chạy trong môi trường hộp cát sẽ hiển thị chức năng bắt buộc mà Mã máy chủ có thể sử dụng.

Thư viện chạy trong môi trường hộp cát được xây dựng bằng quy tắc xây dựng 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++ khi chuẩn bị phiên bản SAPI.

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

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

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

Mã máy chủ

Mã máy chủ là mã triển khai logic do thư viện SAPI cung cấp. Đây là mã sẽ sử dụng phiên bản không chạy trong môi trường hộp cát của thư viện C/C++. Do đó, Mã máy chủ sẽ 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 hàm của thư viện vì thư viện này nằm trong một quy trình chạy trong môi trường hộp cát riêng biệt. Do đó, SAPI cung cấp các công cụ tạo đối tượng SAPI chuyển tiếp các lệnh gọi đến 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 để chạy thư viện C/C++ trong môi trường hộp cát:

  • sapi_library() – Tạo tất cả các đầu ra cần thiết để chạy thư viện C/C++ trong môi trường hộp cát dưới dạng Sandboxee Sandbox2. Bạn có thể sử dụng đầu ra bản dựng làm phần phụ thuộc cho quy tắc cc_binary() dùng để xây dựng 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 giải thích đầy đủ hơn về Quy tắc xây dựng, hãy xem bài viết 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à Loại SAPI. Bạn nên sử dụng các loại này trong Mã máy chủ. Lý do chính cần có Loại SAPI là do quá trình và do đó là bộ nhớ, sự cô lập giữa Mã máy chủ và Thư viện chạy trong môi trường hộp cát.

Để biết giải thích đầy đủ hơn về chủ đề này và 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 chạy trong môi trường hộp cát đều được truyền qua lớp RPC. Để có thể xử lý lỗi trên 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 chạy trong môi trường 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.

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

Bắt đầu

Hãy đọc trang Bắt đầu sử dụng để thiết lập dự án API chạy trong môi trường hộp cát đầu tiên.