Руководство, посвященное безопасности 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.



Source link

Write a comment:
*

Your email address will not be published.