- PVSM.RU - https://www.pvsm.ru -
Прим. перев.: Тема безопасности Docker, пожалуй, одна из вечных в современном мире IT. Поэтому без лишних объяснений представляем перевод очередной подборки соответствующих рекомендаций. Если вы уже интересовались этим вопросом, многие из них будут вам знакомы. А саму подборку мы дополнили списком из полезных утилит и несколькими ресурсами для дальнейшего изучения вопроса.

Предлагаю вниманию руководство по обеспечению безопасности Docker'а. Обратная связь приветствуется, так как это скорее сборник отрывков с разных ресурсов, и не все они были подвергнуты доскональной проверке. Рекомендации разделены на три категории:
Базой для руководства стали различные ресурсы, многие из которых приведены ниже. Его нельзя назвать исчерпывающим, однако оно охватывает все основы. Дополнительную информацию можно найти в описании к тестам CIS (ссылка приведена в конце этого руководства), а также в документации к Docker'у.
Docker Bench for Security [1] автоматически проверяет ваш Docker на соответствие наиболее распространенным лучшим практикам. Скрипт выступает неплохим эвристическим тестом безопасности, однако его не стоит рассматривать как инструмент комплексного анализа.
Очевидно, что Docker-контейнер не может быть защищенным, если сама хост-система не защищена. Поэтому необходимо следовать лучшим практикам в области обеспечения безопасности операционных систем. Кроме того, было бы разумно провести анализ уязвимостей в дополнение к следующим рекомендациям.
Создавайте и используйте правила аудита для файлов, связанных с Docker'ом, с помощью auditctl. Например, можно добавить -w /usr/bin/dockerd -k docker к /etc/audit.rules и перезапустить сервис аудита.
Включение режима FIPS заставляет криптографические инструменты переключиться на алгоритмы, внесенные в FIPS (американские Federal Information Processing Standards [2] — прим. перев.), соответствуя, таким образом, федеральным и отраслевым нормам и требованиям. Если ОС хоста поддерживает режим 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
Для получения дополнительной информации см. в документации Docker [3] и Red Hat [4].
Конфиденциальные данные должны храниться как секреты. Запустить соответствующий сервис можно с помощью команды 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
Подробности см. в документации [5].
Следующие настройки можно добавить в файл конфигурации /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=ADDRESS).
"userns-remap": "Your_User" — предотвращает поднятие привилегий (privilege escalation), изолируя пространство имен под конкретного пользователя.Возможность подключения к демону Docker'а (если удаленный доступ необходим) должна быть только у пользователей с доступом к учетным данным TLS-клиента.
Определитесь с тем, каким пользователям какие команды разрешено выполнять, и создайте соответствующий плагин авторизации для Docker'а. Затем запустите демон Docker'а и добавьте в него плагин:
dockerd --authorization-plugin=PLUGIN_ID
Чтобы больше узнать о создании авторизационных плагинов, см. в документации [6].
Демон Docker'а работает с набором параметров по умолчанию.
--live-restore — этот параметр помогает сократить время простоя контейнеров при выключении или перезагрузке системы. Становится проще их патчить или обновлять с минимальным простоем;--userland-proxy=false — когда доступны или используются hairpin NAT'ы, прокси в пользовательском пространстве становится избыточной службой, которая только увеличивает число возможных векторов атаки;--no-new-privileges — предотвращает получение дополнительных привилегий контейнерами при помощи suid или sguid;--seccomp-profile /path/to/profile — если у вас есть собственный профиль seccomp, можно его применить с помощью этого флага. Узнать больше о Seccomp и Docker можно здесь [7].Убедитесь, что для контейнера создан пользователь и запускайте его под этим пользователем (НЕ запускайте контейнер под рутом).
Запретите удаленный доступ к демону. Если он все же необходим, защитите его сертификатами.
Особенно важно убедиться, что пространство имен пользователя в Docker'е изолировано, поскольку по умолчанию оно используется совместно с пространством имен хоста. В некоторых случаях этим можно воспользоваться для поднятия привилегий или даже для выхода за пределы контейнера. Изолировать пользовательское пространство имен можно путем редактирования файла конфигурации (как описывается выше в разделе «Файл конфигурации Docker'а»). Дополнительное упоминание этой проблемы здесь вызвано ее важностью.
Healthcheck (проверка работоспособности) — мощный инструмент, позволяющий проверять целостность контейнера. Настраивается он в Dockerfile с помощью инструкции HEALTHCHECK. Healthcheck'и позволяют убедиться, что контейнер работает должным образом. В приведенном ниже примере проверка работоспособности завершается 0, если сервер работает, и 1, если он «упал»:
HEALTHCHECK CMD curl --fail http://localhost || exit 1
Если 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-spoofing и MAC-flooding. Чтобы решить эту проблему, создайте сетевой мост в соответствии со своими спецификациями, как описано здесь [8].
Никогда не запускайте сокет Docker'а внутри контейнера. Иначе у контейнера появится возможность выполнять команды Docker'а и, следовательно, связываться с операционной системой хоста и контролировать её. Не делайте этого.
Docker Trust позволяет генерировать ключи, с помощью которых можно проверять криптографическую целостность образов. Ключи Docker Trust можно использовать для подписи образов Docker приватными ключами, что проверяются публичными ключами на Notary Server. Дополнительная информация — здесь [9]. Включение Docker Trust в Enterprise Engine подробно описано в этом разделе документации [10].
В Docker Enterprise имеется встроенный сканер уязвимостей, дающий возможность загрузить базу CVE для offline-сканирования уязвимостей в образах. Регулярное сканирование образов помогает сделать их более безопасными: пользователь сразу получает предупреждения о найденных уязвимостях. Подробнее о том, как это можно сделать, см. здесь [11].
Прим. перев.: Существуют и Open Source-сканеры уязвимостей в Docker-образах, примеры которых см. в конце материала.
Universal Control Plane можно интегрировать с LDAP. Результатом станет упрощенная система аутентификации, позволяющая избежать ненужного дублирования. Подробнее об этом можно почитать в статье Integrate with an LDAP directory [12].
Дополнительную информацию о лучших практиках в области обеспечения безопасности Docker'а можно найти на docs.docker.com [13]. Также рекомендуем загрузить тесты Center for Internet Security для Docker [14].
В качестве логичного дополнения к этой статье публикуем список из 10 популярных Open Source-утилит для обеспечения безопасности в Docker. Он был заимствован из другой статьи [15] (за авторством Bill Doerrfeld из Doerrfeld.io).
NB: Подробнее о многих из упомянутых здесь проектах читайте также в статье «33+ инструмента для безопасности Kubernetes [16]».

oscap-docker.Ещё одну хорошую подборку практических рекомендаций по тому, как сделать Docker безопаснее, можно найти в этой статье [26] компании Aqua Security. Многие её советы пересекаются с уже упомянутыми выше, но есть и другие. Например, авторы предлагают организовать мониторинг активности в контейнерах и указывают, на что обратить внимание при использовании Docker Swarm.
Для желающих ещё детальнее погрузиться в эту тему в прошлом году вышла книга «Docker Security: Quick Reference [27]», фрагменты которой свободно доступны здесь [28].
Наконец, для практического знакомства с некоторыми аспектами безопасности Docker: профилями Seccomp и использованием capabilities Linux-ядра в контейнерах — можно пройти соответствующие лабораторные работы на ресурсе Play with Docker [29]* — см. секцию «Security».

* Про сам этот ресурс мы рассказывали [30] два года назад, а в ноябре 2018-го с ним случилась очень занимательная (с точки зрения безопасности) история. Если вкратце, то специалистам из CyberArk Software Ltd. удалось его взломать: добиться возможности выполнять команды за пределами контейнеров, т.е. на хост-системе. Прекрасная иллюстрация проблемы безопасности в Docker, не так ли? Обо всех деталях случившегося читайте здесь [31].
Читайте также в нашем блоге:
Автор: Wimbo
Источник [37]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/bezopasnost/335123
Ссылки в тексте:
[1] Docker Bench for Security: https://github.com/docker/docker-bench-security
[2] Federal Information Processing Standards: https://en.wikipedia.org/wiki/Federal_Information_Processing_Standards
[3] Docker: https://docs.docker.com/compliance/nist/fips140_2/
[4] Red Hat: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/security_guide/chap-federal_standards_and_regulations
[5] документации: https://docs.docker.com/engine/swarm/secrets/
[6] документации: https://docs.docker.com/engine/extend/plugins_authorization/
[7] здесь: https://docs.docker.com/engine/security/seccomp/
[8] здесь: https://docs.docker.com/network/bridge/
[9] здесь: https://docs.docker.com/engine/security/trust/content_trust/
[10] этом разделе документации: https://docs.docker.com/engine/security/trust/content_trust/#enabling-dct-within-the-docker-enterprise-engine
[11] здесь: https://docs.docker.com/ee/dtr/user/manage-images/scan-images-for-vulnerabilities/
[12] Integrate with an LDAP directory: https://docs.docker.com/ee/ucp/admin/configure/external-auth/
[13] docs.docker.com: http://docs.docker.com/
[14] тесты Center for Internet Security для Docker: https://learn.cisecurity.org/benchmarks
[15] другой статьи: https://techbeacon.com/security/10-top-open-source-tools-docker-security
[16] 33+ инструмента для безопасности Kubernetes: https://habr.com/ru/company/flant/blog/465141/
[17] Clair: https://coreos.com/clair/docs/latest/
[18] Cilium: https://github.com/cilium/cilium
[19] Anchore: https://github.com/anchore/anchore-engine
[20] OpenSCAP Workbench: https://www.open-scap.org/
[21] Dagda: https://github.com/eliasgranderubio/dagda
[22] Notary: http://github.com/theupdateframework/notary
[23] Grafaes: http://grafeas.io/
[24] Sysdig Falco: https://github.com/draios/falco/
[25] Banyanops Collector: https://github.com/banyanops/collector
[26] этой статье: https://blog.aquasec.com/docker-security-best-practices
[27] Docker Security: Quick Reference: https://binarymist.io/publication/docker-security/
[28] здесь: https://binarymist.io/blog/2018/03/31/docker-security/
[29] ресурсе Play with Docker: https://training.play-with-docker.com/ops-stage2/
[30] рассказывали: https://habr.com/ru/company/flant/blog/334470/
[31] здесь: https://www.cyberark.com/threat-research-blog/how-i-hacked-play-with-docker-and-remotely-ran-code-on-the-host/
[32] Vulnerable Docker VM — виртуалка-головоломка по Docker и pentesting: https://habr.com/ru/company/flant/blog/337154/
[33] В 19% популярнейших Docker-образов нет пароля для root: https://habr.com/ru/company/flant/blog/452754/
[34] Docker и Kubernetes в требовательных к безопасности окружениях: https://habr.com/ru/company/flant/blog/440504/
[35] 9 лучших практик по обеспечению безопасности в Kubernetes: https://habr.com/ru/company/flant/blog/436300/
[36] OPA и SPIFFE — два новых проекта в CNCF для безопасности облачных приложений: https://habr.com/ru/company/flant/blog/353808/
[37] Источник: https://habr.com/ru/post/474012/?utm_campaign=474012&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.