Безопасность контейнеров в Docker

Безопасность контейнеров в Docker

Руководство, посвященное безопасности Docker. Часть первая.

Автор: Real

Это руководство, посвященное безопасности Docker, разделено на три раздела. Очень приветствуются ваши комментарии, поскольку здесь представлена компиляция разных материалов, которые я особо не перепроверял.

· Раздел 1: Безопасность операционной системы хоста при взаимодействии с Docker.

· Раздел 2: Создание конфигурационного файла и контейнеров.

· Раздел 3: Функции безопасности, которые могут быть интегрированы со специфическими возможностями в Docker Enterprise.

Как было сказано выше, это руководство собрано из разных материалов, ссылки на которые указаны ниже. На полноту не претендую, но все основы затронуты. Обо всем остальном можно узнать в CIS (ссылка в конце статьи) и документации для Docker.

Docker Security Benchmark

Сценарий Docker Bench for Security представляет собой автоматический скрипт, выполняющий проверку на основе наилучших практик безопасности Docker. Этот скрипт следует рассматривать как хороший эвристический тест вашей безопасности, но не всеобъемлющим аналитическим инструментом.

Операционная система хоста

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

Правила аудита

Создайте и используйте правила аудита для файлов, имеющих отношение к Docker, при помощи auditctl. Например, можно добавить строку «-w /usr/bin/dockerd -k docker» в файл /etc/audit.rules и перезапустить службу аудита.

Режим FIPS

Режим FIPS (Federal Information Processing Standard; Федеральный стандарт по обработке информации) принуждает криптографические утилиты к использованию алгоритмов, совместимых с федеральными и промышленными стандартами и законами безопасности. Если ваша ОС на хосте поддерживает FIPS, то вы можете включить этот режим при помощи следующей команды:

sed -i 's/GRUB_CMDLINE_LINUX="/GRUB_CMDLINE_LINUX="fips=1 /g' /etc/default/grub

grub2-mkconfig -o /boot/grub2/grub.cfg && reboot

Включить FIPS в Docker Engine можно при помощи следующей команды:

mkdir -p /etc/systemd/system/docker.service.d 2>&1; echo -e "[Service]\n Environment=\"DOCKER_FIPS=1\"" > /etc/systemd/system/docker.service.d/fips-module.conf; systemctl daemon-reload; systemctl restart docker

Более подробная информация доступна по следующим ссылкам:

· https://docs.docker.com/compliance/nist/fips140_2/ 10

· https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/security_guide/chap-federal_standards_and_regulations 7

Секреты в Docker

Конфиденциальная информация должна храниться в виде секретов, созданных при помощи команды docker service create. Пример:

docker service create --label com.docker.ucp.access.label=/prod --name nginx --publish 443 --secret source=orcabank_prod_mobile.ca.pem.v1,target=ca.pem nginx

Конфигурационный файл в Docker

Если в конфигурационный файл, находящийся в /etc/docker/daemon.json, добавить опцию “icc”:false, отключится коммуникация между контейнерами с целью избежания ненужных информационных утечек.

Опция “log-level: “info” позволяет собирать все неотладочные логи.

Конфигурация, показанная ниже, разрешает удаленное подключение и отправку логов по указанному адресу:

{

"log-driver": "syslog",

"log-opts": {

"syslog-address": "udp://1.2.3.4:1111"

}

}

Эта опция сработает только если включен демон syslog. TCP и UDP принимаются в качестве параметров. Также можно воспользоваться соответствующим параметром при запуске Docker (–log-opt syslog-address=ADRESS) в рамках парадигмы доступа к контейнеру из контейнера.

Следующая опция позволяет предотвратить эскалацию привилегий посредством изоляции пространства имен для определенного пользователя:

“userns-remap”: “Your_User”

Безопасность транспортного уровня

Ограничьте подключения к демону Docker (если требуется удаленный доступ) для пользователей с доступом к учетным записям TLS клиента.

Плагины авторизации

Укажите, какие команды разрешены для какого пользователя, и создайте соответствующий плагин авторизации для Docker. Теперь при запуске демона Docker укажите созданный плагин:


dockerd --authorization-plugin=PLUGIN_ID

Подробнее о создании плагинов авторизации рассказано в документации.

Параметры демона

Демон Docker запускается с набором стандартных параметров.

--live-restore – контейнеры без демонов для максимизации доступности после выключения или перезагрузки. Эта опция облегчает установку обновлений и патчей, минимизируя время простоя.

--userland-proxy=false – когда доступны или используются hairpin NAT’ы, пользовательские прокси становятся излишними и только расширяют возможности для атак.

--no-new-privileges – запрет для контейнеров на получение дополнительных привилегий через suid или sguid.

--seccomp-profile /path/to/profile – эта опция позволяет добавить настроенный профиль seccomp.

Контейнер и конфигурационный файл

Создание пользователя

Убедитесь, что для контейнера создан пользователь, и запуск контейнера происходит от имени этого пользователя (а не от имени root).

Удаленный доступ

Не разрешайте удаленный доступ к демону. Если удаленный доступ нужен, обезопасьте этот доступ при помощи сертификатов.

Изолирование пользовательского пространства имен

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

Профилактические проверки

Healthcheck – мощный инструмент, используемы для проверки целостности контейнера и может быть сконфигурирован в файле dockerfile. Подобного рода проверки следует проводить периодически, чтобы контролировать корректность работы контейнера. В примере ниже после проверки возвращается 0, если сервер работает, и 1 – если не работает.

HEALTHCHECK CMD curl --fail http://localhost || exit 1

SELinux

Если SELinux поддерживается операционной системой хоста, создайте или импортируйте политику SELinux и запустите Docker в режиме демона с включенным SELinux.

docker daemon --selinux-enable

Затем вы можете запускать контейнеры Docker с опциями безопасности, как показано в примере ниже:

docker run --interactive --tty --security-opt label=level:TopSecret centos /bin/bash

Сетевые интерфейсы

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

docker run --detach --publish 10.2.3.4:49153:80 nginx

Версии кэшированных образов

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

Сетевой мост

Стандартная сетевая модель docker0 уязвима к ARP спуфингу и MAC флудингу. Для решения этой проблемы создайте пользовательский сетевой мост согласно вашей спецификации, как описано по ссылке https://docs.docker.com/network/bridge/

Предупреждение о сокетах

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

Конфигурация Docker Enterprise

Docker Trust

Утилита Docker trust позволяет сгенерировать ключи для проверки криптографической целостности образов. Эти ключи можно использовать для подписи образов при помощи приватных ключей, которые проверяются при помощи публичных ключей на сервере Notary Server. Более подробная информация доступна по ссылке https://docs.docker.com/engine/security/trust/content_trust/. Включение Docker Trust в Enterprise Engine рассматривается в разделе https://docs.docker.com/engine/security/trust/content_trust/#enabling-dct-within-the-docker-enterprise-engine

Сканирование уязвимостей

В Docker Enterprise встроен сканер уязвимостей, у которого есть опция для загрузки базы CVE и запуска в офлайн режиме для сканирования образов. Сканирование образов на постоянной основе повышает уровень безопасности, когда вы своевременно реагируете на появление брешей. Более подробно можно ознакомиться по ссылке https://docs.docker.com/ee/dtr/user/manage-images/scan-images-for-vulnerabilities/

Интеграция LDAP с UCP

UCP (Universal Control Plane) можно интегрировать с LDAP для упрощенной системы аутентификации с целью избежать ненужной избыточности. Более подробная информация доступна по ссылке https://docs.docker.com/ee/ucp/admin/configure/external-auth/

Для дальнейшего чтения

Дополнительные рекомендации и наилучшие практики в сфере безопасности Docker, помимо изучения docs.docker.com, можно подчерпнуть из документа «Center for Internet Security benchmarks for Docker», который доступен на странице https://learn.cisecurity.org/benchmarks.

Ваш провайдер знает о вас больше, чем ваша девушка?

Присоединяйтесь и узнайте, как это остановить!