Поиск по сайту:

Как оценить безопасность Docker Engine


Docker позволяет разработчикам программного обеспечения и инженерам DevOps быстро упаковывать приложения для производства. Контейнеры Docker работают в значительной степени независимо от своего хоста, но не защищены от угроз безопасности. Вот как можно провести аудит установки Docker Engine, чтобы обеспечить максимальную безопасность вашего хоста и ваших рабочих нагрузок.

Понимание архитектуры Docker

Первым шагом к оценке рисков Docker является понимание того, как на самом деле работает технология. Docker основан на трех отдельных компонентах:

  • Демон Docker Engine — фоновая служба, управляющая скрытыми операциями с контейнерами и образами.
  • REST API. Docker Engine предоставляет REST API, который отправляет команды демону Docker. API обычно предоставляется через сокет REST, но может также предоставляться через HTTP.
  • Клиент командной строки Docker. Интерфейс командной строки Docker запускается, когда вы используете docker в терминале. Он отправляет команды демону Docker. Команды обрабатываются, чтобы определить действие, которое нужно предпринять.

Злоумышленник, скомпрометировавший любой из этих компонентов, может получить доступ к вашей среде. Благодаря правильной настройке вы можете защитить свои рабочие нагрузки и повысить безопасность по сравнению с запуском приложений непосредственно на хосте.

Поверхность атаки

Демон Docker представляет самую большую поверхность атаки. Получение контроля над демоном обеспечивает доступ к хосту и всем вашим контейнерам. Демон обычно запускается от имени root, поэтому успешное проникновение может предоставить неограниченный доступ к вашей физической машине.

Вы должны убедиться, что сокет демона Docker (/var/run/docker.sock) недоступен никому, кроме пользователя root. Поскольку демон может получить доступ к хосту, предоставление доступа к сокету эффективно передает контроль над вашей машиной.

Демон Docker поддерживает сокет TCP, который позволяет удаленно управлять сетью. Если вы включите эту функцию, незашифрованная связь будет предлагаться без какой-либо аутентификации.

Избегайте использования TCP-соединений, если вы не находитесь в сетевой среде, которую вы специально настроили для обеспечения безопасности. Вам следует настроить TLS и убедиться, что подключение разрешено только авторизованным клиентам.

Некоторые образы Docker могут потребовать подключения сокета Docker к контейнеру. Это часто используется инструментами управления Docker, которые предоставляют интерфейс для контейнеров, работающих на вашем хосте. При таком монтаже сокета все, что находится внутри контейнера, может получить контроль над вашей системой. Контейнеры никогда не должны получать сокет Docker, если вы не уверены, что он требуется рабочей нагрузке.

Безрутовый режим

Docker теперь поддерживает режим без рута, который позволяет запускать Docker без доступа root. Это помогает повысить безопасность, но создает дополнительные сложности во время установки.

Использование режима без root запускает Docker и ваши контейнеры внутри пользовательского пространства имен. Большинство функций Docker будут работать, хотя есть некоторые ограничения.

Доступны не все драйверы хранилища, оверлейные сети не поддерживаются, а сети контейнеров имеют полное пространство имен. Это означает, что вы не можете получить прямой доступ к IP-адресам контейнера с хоста без предварительного входа в выделенное сетевое пространство имен.

Использование режима без root может быть полезно в средах с высоким уровнем безопасности, где целостность хоста имеет первостепенное значение. Это помогает уменьшить влияние успешной атаки, ограничивая возможности вмешательства в более широкую систему.

Безопасность REST-API

Доступ к Docker REST API обычно осуществляется через сокет UNIX. Проверки разрешений выполняются с использованием стандартных механизмов UNIX.

Вы можете предоставить доступ к API через сокет TCP, что позволит получить доступ через HTTP. Это повышает риск компрометации. Вы должны убедиться, что ваши средства управления доступом к сети настроены таким образом, чтобы трафик мог исходить только от утвержденных хостов.

Вам следует провести аудит политик брандмауэра, чтобы не упустить из виду устройство, которое может взаимодействовать с Docker API. Помните, что ограничения подключений к localhost недостаточно — это по-прежнему разрешает доступ из контейнеров Docker, работающих на вашем компьютере, что может привести к непреднамеренному повышению привилегий.

Ограничение связи между контейнерами

Docker позволяет всем контейнерам взаимодействовать друг с другом через мостовую сеть docker0 по умолчанию. Скомпрометированный контейнер может отслеживать эту сеть, чтобы узнать о ее окружении. Он может использовать мостовую сеть в качестве точки обзора, чтобы начать более широкое проникновение в ваши рабочие нагрузки.

Отключение связи между контейнерами повышает уровень безопасности за счет усиления изоляции контейнеров. Вам нужно будет явно связать контейнеры вместе, используя флаг --link=ContainerName или свою собственную сеть Docker.

Запустите демон Docker с флагом --icc=false, чтобы отключить связь через мост docker0.

Ограничение возможностей контейнера

Возможности ядра Linux определяют действия, доступные пользователям с доступом root. Возможности помогают блокировать процессы, запущенные с правами root, например контейнеры Docker. Каждому процессу должен быть предоставлен минимальный набор необходимых ему возможностей.

Docker автоматически запускает контейнеры с ограниченным набором возможностей. Даже этот список часто бывает чрезмерным для простой рабочей нагрузки, такой как веб-сервер. Вы можете дополнительно ограничить его, указав свой собственный список возможностей, доступных для контейнера.

docker run --cap-drop all --cap-add SYSLOG example-image:latest

Приведенная выше команда запустит контейнер только с возможностью SYSLOG. Флаг --cap-drop игнорирует список возможностей по умолчанию. Затем возможности снова добавляются с помощью --cap-add, создавая белый список.

Стоит сравнить ваш контейнер со списком возможностей ядра. Удалите все неиспользуемые возможности из контейнеров, работающих в рабочей среде. Это помогает ограничить ущерб, который может нанести скомпрометированный контейнер.

Включить встроенные функции ядра

Не пренебрегайте функциями безопасности, встроенными в ваше ядро. Docker работает с существующими технологиями, такими как AppArmor и SELinux.

Некоторые дистрибутивы, такие как RedHat Linux, поставляются с предопределенными системными политиками SELinux, которые повышают безопасность Docker. Вы можете вручную добавить поддержку SELinux, запустив демон Docker с флагом --selinux-enabled. Это активирует политику Docker для установки меток SELinux для ваших контейнеров. SELinux обеспечивает лучшую изоляцию процессов-контейнеров от хост-процессов, повышая уровень безопасности.

Основы

Легко зациклиться на сложных аспектах безопасности Docker: режиме без рута, доступе к демону и связи с контейнером. Однако не упускайте из виду основы — стандартная практика безопасности по-прежнему применяется.

Всегда обновляйте Docker Engine, чтобы у вас были последние исправления ошибок. Вы также должны убедиться, что ядро вашего хоста полностью исправлено. Поскольку контейнеры используют то же ядро, что и ваш хост, любые уязвимости могут быть использованы вашими контейнерными приложениями.

Хорошей практикой является выделение определенной физической машины или виртуальной машины для запуска Docker. Не запускайте какие-либо другие службы непосредственно на хосте. Вместо этого вы можете запускать их как контейнеры, уменьшая влияние успешной компрометации хоста.

При правильной настройке Docker повышает безопасность за счет изоляции приложений. Потратив время на оценку своего положения, вы сможете определить потенциальные риски и понять, как могут начаться атаки. Блокировка привилегий контейнера, защита демона Docker и постоянное обновление вашего хоста помогут вам защитить ваши контейнеры.