샌드박스 처리된 API 설명

샌드박스 처리된 API (SAPI)는 잘 정립된 Sandbox2 프로젝트를 기반으로 빌드됩니다. 이 페이지에서는 SAPI의 설계 아키텍처와 주요 개념을 설명합니다.

개요

SAPI는 개발자에게 샌드박스 처리를 위한 C/C++ 라이브러리를 준비하는 도구와 샌드박스 처리된 버전의 C/C++ 라이브러리와 통신하는 데 필요한 API를 제공하도록 설계되었습니다.

이 다이어그램은 SAPI 샌드박스 처리된 C/C++ 라이브러리의 아키텍처를 보여줍니다.

SAPI 다이어그램

또한 SAPI는 기본 요소를 SAPI 라이브러리와 호스트 코드 간의 수동 및 자동 (커스텀 포인터 속성 기반) 메모리 동기화 (배열, 구조)를 위해 제공합니다.

마지막으로 고급 트랜잭션 API를 사용하면 SAPI 라이브러리를 모니터링하고 실패하는 경우 (예: 보안 위반, 비정상 종료 또는 리소스 소진으로 인해) 다시 시작할 수 있습니다.

Sandbox2

오픈소스 프로젝트 Sandbox2는 Google 보안 엔지니어가 개발하고 유지관리하며 SAPI에서 사용하는 핵심 샌드박스 처리 기술입니다. Sandbox2에는 샌드박스 정책, 실행기, 샌드박스 처리된 실행 파일이라는 세 가지 기본 구성요소가 포함되어 있습니다.

샌드박스 정책

샌드박스 정책은 샌드박스 처리된 라이브러리의 제한된 실행 환경을 정의합니다. 이는 실행할 수 있는 syscall을 명확히 하여 달성됩니다. SAPI는 Sandbox2와 동일한 메커니즘을 사용합니다. 샌드박스 정책을 설계하고 정의하는 방법에 관한 자세한 내용은 샌드박스 정책 섹션과 Sandbox2 시작하기 페이지를 참고하세요.

기본적으로 생성된 SAPI 샌드박스 클래스는 DefaultConfig (sapi::SandboxConfig::DefaultConfig())를 사용하여 초기화됩니다. DefaultConfig()는 다음과 같이 샌드박스를 구성합니다.

  • sapi::Sandbox2Config::DefaultPolicyBuilder()로 빌드된 기본 Sandbox2 정책
  • sapi::Sandbox2Config::DefaultLimits()의 기본 리소스 및 시간 제한
  • 공유 메모리 통신 사용 설정 (DefaultPolicyBuilder()의 공유 메모리 권한과 페어링됨)
  • 샌드박스 처리된 실행 파일에서 기준 로깅 및 런타임 동작을 구성하는 기본 명령줄 플래그 (sapi::SandboxConfig::DefaultFlags()) 및 환경 변수(sapi::SandboxConfig::DefaultEnvironmentVariables())

샌드박스 정책 또는 구성을 맞춤설정하려면 sapi::SandboxConfig::DefaultConfig()에서 시작하여 반환된 sapi::SandboxConfig를 수정하고 생성된 샌드박스 생성자에 전달하거나 sapi_library에 전달된 sandbox.h 헤더 파일에서 커스텀 샌드박스 서브클래스를 정의합니다. 예를 들어 sapi::Sandbox2Config::DefaultPolicyBuilder()에서 시작하여 정책을 빌드하고 추가 규칙을 연결하거나 더 제한적인 구성이 필요한 경우 PolicyBuilder 를 직접 구성할 수 있습니다. 플래그 또는 환경 변수를 추가할 때는 sapi::SandboxConfig::DefaultFlags() 또는 sapi::SandboxConfig::DefaultEnvironmentVariables()에서 시작하여 기준 설정을 유지합니다.

샌드박스 처리된 라이브러리

이는 Sandbox2에서 제공하는 제한된 샌드박스 환경에서 실행되는 샌드박스 처리된 C/C++ 라이브러리입니다. 궁극적으로 샌드박스 처리된 라이브러리는 호스트 코드에서 사용할 수 있는 필수 기능을 노출합니다.

샌드박스 처리된 라이브러리는 제한된 실행 환경을 정의하는 맞춤설정된 샌드박스 정책을 지정할 수 있는 sapi_library 빌드 규칙으로 빌드됩니다. 라이브러리에 따라 래퍼 또는 스텁 코드를 작성해야 할 수도 있지만 (libcurl 참고) SAPI 버전을 준비하는 동안 C/C++ 라이브러리의 소스 코드를 변경하지 않는 것이 좋습니다.

SAPI 객체 및 RPC 스텁

SAPI 객체는 샌드박스 처리된 라이브러리의 API를 노출하는 C++ 객체입니다. 호스트 코드에서 RPC 스텁으로 호출을 전달합니다. RPC 스텁은 샌드박스 처리된 라이브러리와 함께 SAPI 라이브러리에 삽입됩니다.

이 두 요소는 sapi_library() 빌드 규칙을 사용하여 빌드 시스템에서 자동으로 생성됩니다. SAPI는 Google의 Bazel과 CMake라는 두 가지 빌드 시스템을 지원합니다.

호스트 코드

호스트 코드는 SAPI 라이브러리에서 제공하는 로직을 구현하는 코드입니다. 샌드박스 처리되지 않은 버전의 C/C++ 라이브러리를 사용하는 코드입니다. 따라서 호스트 코드는 SAPI 라이브러리에서 내보낸 함수를 호출하여 샌드박스에 데이터를 전달하고 샌드박스에서 데이터를 수신합니다.

호스트 코드는 SAPI 라이브러리를 사용하도록 조정해야 합니다. 특히 라이브러리가 별도의 샌드박스 처리된 프로세스에 있으므로 라이브러리의 함수를 호출할 수 없습니다. 따라서 SAPI는 SAPI 라이브러리에 대한 호출을 프록시하는 SAPI 객체를 만드는 도구를 제공합니다.

개념

Bazel 빌드 규칙

SAPI 프로젝트는 C/C++ 라이브러리를 샌드박스 처리하기 위한 두 가지 Bazel 빌드 규칙을 제공합니다.

  • sapi_library() – C/C++ 라이브러리를 Sandbox2 샌드박스 처리된 실행 파일로 샌드박스 처리하는 데 필요한 모든 출력을 만듭니다. 빌드 출력은 호스트 코드 바이너리를 빌드하는 데 사용되는 cc_binary() 규칙의 종속 항목으로 사용할 수 있습니다.
  • sapi_interface() – 호스트 코드 바이너리에 포함될 수 있는 헤더를 자동 생성합니다.

빌드 규칙에 관한 자세한 설명은 빌드 규칙을 참고하세요.

변수

SAPI는 호스트 코드에서 사용하는 것이 좋은 SAPI 유형이라는 여러 특수 유형을 제공합니다. SAPI 유형이 필요한 주된 이유는 호스트 코드와 샌드박스 처리된 라이브러리 간의 프로세스 및 메모리 격리 때문입니다.

이 주제에 관한 자세한 설명과 일반적으로 사용되는 일부 SAPI 유형의 개요는 변수를 참고하세요.

트랜잭션

위에서 설명한 대로 샌드박스 처리된 라이브러리에 대한 모든 API 호출은 RPC 레이어를 통해 전달됩니다. 이 레이어에서 오류를 처리하려면 적절한 오류 처리를 구현해야 합니다. SAPI 트랜잭션 모듈은 샌드박스 처리된 라이브러리에 대한 모든 호출이 RPC 수준 문제 없이 완료되거나 관련 오류와 함께 반환되도록 하는 데 필요한 메커니즘을 제공합니다.

이 주제에 관한 자세한 설명은 트랜잭션을 참고하세요.

시작하기

시작하기 페이지 를 읽고 첫 번째 샌드박스 처리된 API 프로젝트를 설정하세요.