Interfejs SAPI (Sandboxed API) jest oparty na dobrze znanym projekcie Sandbox2. Na tej stronie opisujemy architekturę SAPI i kluczowe pojęcia.
Przegląd
SAPI ma na celu udostępnienie deweloperom narzędzi do przygotowywania bibliotek C/C++ do piaskownicy, a także interfejsów API niezbędnych do komunikacji z wersją bibliotek C/C++ w piaskownicy.
Ten diagram przedstawia architekturę biblioteki C/C++ w piaskownicy SAPI:
SAPI udostępnia też elementy podstawowe do ręcznej i automatycznej (na podstawie atrybutów wskaźnika niestandardowego) synchronizacji pamięci (tablice, struktury) między bibliotekami SAPI a kodem hosta.
Interfejs API transakcji wysokiego poziomu umożliwia monitorowanie bibliotek SAPI i ponowne uruchamianie ich w przypadku awarii (np. z powodu naruszenia zabezpieczeń, awarii lub wyczerpania zasobów).
Sandbox2
Projekt open source Sandbox2 jest rozwijany i utrzymywany przez inżynierów ds. bezpieczeństwa Google. Jest to podstawowa technologia piaskownicy używana przez SAPI. Sandbox2 zawiera 3 główne komponenty: zasady piaskownicy, wykonawcę i Sandboxee.
Zasady dotyczące piaskownicy
Zasady piaskownicy określają ograniczone środowisko wykonawcze dla biblioteki w piaskownicy. Osiąga się to przez wyjaśnienie, które wywołania systemowe mogą być wykonywane. SAPI korzysta z tego samego mechanizmu co Sandbox2. Więcej informacji o projektowaniu i definiowaniu zasad piaskownicy znajdziesz w sekcji Zasady piaskownicy i na stronie Wprowadzenie dotyczącej Sandbox2.
SAPI używa domyślnej zasady. Możesz też użyć dedykowanej zasady piaskownicy, definiując ją w pliku nagłówkowym sandbox.h i przekazując ją jako argument w regule kompilacji sapi_library.
Biblioteka w piaskownicy
Jest to biblioteka C/C++ w piaskownicy, która będzie wykonywana w ograniczonym środowisku piaskownicy udostępnianym przez Sandbox2. Ostatecznie biblioteka w piaskownicy udostępnia wymagane funkcje, z których może korzystać kod hosta.
Biblioteka w piaskownicy jest tworzona za pomocą reguły kompilacji sapi_library, w której możesz określić niestandardowe zasady piaskownicy definiujące ograniczone środowisko wykonawcze. W zależności od biblioteki może być konieczne napisanie kodu otoki lub kodu zastępczego (patrz libcurl), ale podczas przygotowywania wersji SAPI nie musisz zmieniać kodu źródłowego biblioteki C/C++.
Obiekt SAPI i stub RPC
Obiekt SAPI to obiekt C++, który udostępnia interfejs API biblioteki w piaskownicy. Przekazuje wywołania z kodu hosta do elementu RPC Stub, który jest osadzony w bibliotece SAPI wraz z biblioteką w piaskownicy.
Te 2 elementy są generowane automatycznie przez system kompilacji za pomocą reguły kompilacji sapi_library()
. SAPI obsługuje 2 systemy kompilacji: Bazel od Google i CMake.
Kod gospodarza
Kod hosta implementuje logikę dostarczoną przez bibliotekę SAPI. W przeciwnym razie zużywałaby ona wersję biblioteki C/C++ bez piaskownicy. W związku z tym kod hosta wywołuje funkcje wyeksportowane przez bibliotekę SAPI, przekazując dane do piaskownicy i odbierając z niej dane.
Kod hosta musi zostać dostosowany do korzystania z biblioteki SAPI. Przede wszystkim nie można wywoływać funkcji biblioteki, ponieważ znajduje się ona w osobnym procesie w piaskownicy. Dlatego SAPI udostępnia narzędzia, które tworzą obiekt SAPI, który przekazuje wywołania do biblioteki SAPI.
Pojęcia
Reguły kompilacji Bazel
Projekt SAPI udostępnia 2 reguły kompilacji Bazel do umieszczania biblioteki C/C++ w piaskownicy:
sapi_library()
– tworzy wszystkie dane wyjściowe niezbędne do umieszczenia biblioteki C/C++ w piaskownicy Sandbox2 jako Sandboxee. Dane wyjściowe kompilacji mogą być używane jako zależność regułycc_binary()
używanej do kompilowania binarnego kodu hosta.sapi_interface()
– automatycznie generuje nagłówek, który można uwzględnić w binarnym kodzie hosta.
Szczegółowe wyjaśnienie reguł kompilacji znajdziesz w artykule Reguły kompilacji.
Zmienne
SAPI udostępnia kilka specjalnych typów, zwanych typami SAPI, które zalecamy stosować w kodzie hosta. Głównym powodem, dla którego potrzebne są typy SAPI, jest izolacja procesów, a tym samym pamięci, między kodem hosta a biblioteką w piaskownicy.
Szczegółowe wyjaśnienie tego tematu oraz omówienie niektórych często używanych typów SAPI znajdziesz w artykule Zmienne.
Transakcje
Jak wyjaśniliśmy powyżej, każde wywołanie interfejsu API w bibliotece w piaskownicy jest przekazywane przez warstwę RPC. Aby móc obsłużyć błąd na tej warstwie, musisz wdrożyć odpowiednią obsługę błędów. Moduł SAPI Transaction zapewnia mechanizm, który gwarantuje, że wszystkie wywołania biblioteki w piaskownicy zostaną ukończone bez problemów na poziomie RPC lub zostaną zwrócone z odpowiednim błędem.
Bardziej szczegółowe wyjaśnienie tego tematu znajdziesz w sekcji Transakcje.
Pierwsze kroki
Aby skonfigurować pierwszy projekt interfejsu API w piaskownicy, przeczytaj stronę Wprowadzenie.