Изолирует контейнеры через прикладное ядро в пользовательском пространстве, которое перехватывает системные вызовы, ограничивает доступ к ядру хоста и интегрируется с Docker/Kubernetes через OCI runtime.

gVisor обеспечивает надёжный уровень изоляции между работающими приложениями и операционной системой хоста. Это прикладное ядро, реализующее интерфейс, подобный Linux. В отличие от Linux, оно написано на безопасном для памяти языке (Go) и работает в пространстве пользователя.
gVisor включает среду выполнения Open Container Initiative (OCI) под названием runsc,
которая упрощает работу с существующими инструментами для контейнеров. Среда выполнения runsc
интегрируется с Docker и Kubernetes, что позволяет легко запускать контейнеры в песочнице.
seccomp-bpf) и не обёртка над
примитивами изоляции Linux (например, firejail, AppArmor и т. д.).gVisor использует принципиально третий подход, обеспечивая многие преимущества безопасности виртуальных машин, сохраняя при этом меньший объём потребляемых ресурсов, быстрый запуск и гибкость обычных приложений пространства пользователя.
Контейнеры — это не песочница. Хотя контейнеры произвели революцию в том, как мы разрабатываем, упаковываем и развёртываем приложения, использовать их для запуска недоверенного или потенциально вредоносного кода без дополнительной изоляции — не лучшая идея. Хотя использование единого общего ядра обеспечивает эффективность и прирост производительности, это также означает, что побег из контейнера возможен с помощью одной уязвимости.
gVisor — это прикладное ядро для контейнеров. Оно ограничивает поверхность ядра хоста, доступную приложению, при этом по-прежнему предоставляя приложению доступ ко всем функциям, которые оно ожидает. В отличие от большинства ядер, gVisor не предполагает и не требует фиксированного набора физических ресурсов; вместо этого он использует существующую функциональность ядра хоста и работает как обычный процесс. Иными словами, gVisor реализует Linux посредством Linux.
gVisor не следует путать с технологиями и инструментами для укрепления контейнеров от внешних угроз, обеспечения дополнительных проверок целостности или ограничения области доступа для сервиса. Всегда следует быть осторожным с тем, какие данные предоставляются контейнеру.
Пользовательская документация и техническая архитектура, включая руководства по быстрому началу работы, доступны на gvisor.dev.
gVisor собирается на x86_64 и ARM64. Другие архитектуры могут стать доступными в будущем.
Для целей этих инструкций bazel и другие зависимости сборки
упакованы в контейнер сборки. Можно использовать
bazel напрямую или ввести make help для стандартных целей.
Убедитесь, что установлены следующие зависимости:
Соберите релизный tarball, содержащий runsc, containerd-шим containerd-shim-runsc-v1
и несколько вспомогательных бинарных файлов, которые runsc ожидает найти в
каталоге gvisor-bin/ рядом с собой, затем распакуйте его в /usr/local/bin:
make release-tarball DESTINATION=bin/
sudo tar -C /usr/local/bin -xf bin/gvisor.tar.bz2
Чтобы собрать конкретные библиотеки или бинарные файлы, можно указать цель:
make build TARGETS="//pkg/tcpip:tcpip"
Использование Bazel напрямую не рекомендуется из-за дополнительных накладных расходов, но для начала:
После настройки зависимостей использование Bazel аналогично Makefile:
bazel build -c opt //debian:gvisor-release-tar-bz2
Чтобы запустить стандартные наборы тестов, можно использовать:
make unit-tests
make tests
Чтобы запустить конкретные тесты, можно указать цель:
# Makefile
make test TARGETS="//runsc:version_test"
# Bazel
bazel test //runsc:version_test
Некоторые пакеты поддерживают запуск тестов непосредственно на macOS. На момент написания gVisor требует bazel 8, который можно установить через homebrew:
brew install bazel@8
# You can then run the tests, e.g.:
$(brew --prefix bazel@8)/bin/bazel test --macos_sdk_version=$(xcrun --show-sdk-version) -- //tools/nogo/... //tools/check{aligned,const,escape,linkname,locks,unsafe}/...
go getЭтот проект использует bazel для сборки и управления зависимостями. Поддерживается синтетическая
ветка go, совместимая со стандартными инструментами go для
удобства. Это полезно для внешних пакетов и библиотек, которые зависят от
подпакетов gVisor (например, пользовательское сетевое взаимодействие через Netstack), чтобы импортировать Go-код gVisor
в свои Go-проекты.
Выбирайте эту ветку явно с помощью запроса ветки go. @latest разрешается в
master, который требует Bazel и несовместим со стандартными инструментами Go:
go get gvisor.dev/gvisor/pkg/tcpip/transport/tcp@go
ПРИМЕЧАНИЕ: Сборки runsc из этой ветки не поддерживаются. gVisor и
runsc требуют несколько бинарных файлов (некоторые из которых даже не написаны на Go) для
работы. Ветка go поддерживается по мере возможности, и
прямая разработка в этой ветке не поддерживается. Разработка должна вестись в
ветке master, которая затем отражается в ветке go.
См. GOVERNANCE.md для информации об управлении проектом.
См. ADOPTERS.md для списка известных пользователей и внедренцев в продакшене.
Список рассылки gvisor-users и список рассылки gvisor-dev — хорошие отправные точки для вопросов и обсуждений.
См. SECURITY.md.
См. Contributing.md.