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

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

Мануал
Я сделал руководство о том, как обезопасить Docker.
Я разделил его на 3 категории.
Обратная связь как всегда приветствуется, так как это скорее сборник практик из других ресурсов, и к тому же я не все из этого проверял.

Категории статьи:

  • Действия, которые необходимо предпринять в операционной системе хоста при взаимодействии с Docker
  • Инструкции, специфичные для файла конфигурации сборки и создания контейнеров
  • Функциональность безопасности, которая может интегрироваться со специфическими функциями Docker Enterprise.
Это руководство было составлено из различных ресурсов, многие из которых приведены ниже.
Статья не является исчерпывающей, но она должна охвативать все основы.
То, что оно не охватывает, может быть найдено в тесте CIS, приведенном в конце этого руководства, а также в документации Docker.
Docker Security Benchmark
Файл, указанный здесь (https://github.com/docker/docker-bench-security 72), представляет собой автоматизированный скрипт, который проверяет многие распространенные рекомендации Docker.
Скрипт тестирования должен рассматриваться как хороший эвристический тест вашей безопасности, но не как инструмент комплексного анализа.

ОС хоста

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

Поэтому вы должны следовать нормальным рекомендациям по безопасности ОС, и было бы разумно выполнить некоторые проверки уязвимости в дополнение к реализации следующих предложений.

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

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

Режим FIPS

Включение режима FIPS заставляет криптографические инструменты реализовывать свои алгоритмы в соответствии с федеральными и отраслевыми стандартами и правилами безопасности.
Если ваша хост-система поддерживает режим 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

Секреты Docker

Конфиденциальные данные должны храниться как секреты 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”
Эта настройка предотвращает попытки повышения привилегий, изолируя пространство имен для конкретного пользователя

TLS

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

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

Определите, какие команды следует предоставить тем или иным пользователям, и соответственно создайте плагин авторизации для Docker.
Затем, когда вы запустите демон Docker, добавьте плагин таким образом:
dockerd --authorization-plugin=PLUGIN_ID
Чтобы узнать о создании плагинов авторизации, см. документацию: https://docs.docker.com/engine/extend/plugins_authorization/

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

Демон Docker работает с набором параметров по умолчанию

--live-restore
Позволяет максимизировать количество доступных контейнеров после завершения работы системы или перезагрузки.
Это облегчает исправление и обновление с минимальным временем простоя
--userland-proxy=false
Когда используются  NAT,  прокси-сервер пользователя становится резервной службой, которая только увеличивает вашу поверхность атаки.
--no-new-privileges
Останавливает получение контейнерами дополнительных привилегий через suid или sguid.
--seccomp-profile /path/to/profile
Если у вас есть собственный профиль seccomp, вы можете применить его с в случае с Docker.
Узнайте больше о Seccomp и Docker по этой ссылке

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

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

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

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

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

Изолируйте пространство имен пользователя

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

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

Вы можете изолировать пространство имен пользователя, отредактировав файл конфигурации, как упомянуто в приведенном выше разделе «Файл конфигурации Docker».

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

Healthchecks

Healthcheck – это мощный инструмент, который можно использовать для проверки целостности контейнера, и который можно настроить в вашем файле Docker.

Вы должны выполнить проверки работоспособности, чтобы убедиться, что ваш контейнер работает нормально.

Приведенный ниже пример проверки работоспособности, который завершается с 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/ 5

Сокет Docker

Никогда не запускайте Docker-сокет внутри контейнера.

Это позволяет этому контейнеру выполнять команды Docker и, следовательно, связываться с хостовой ОС и управлять ею.

Так что не делай этого.

Настройки Enterprise версии

Docker Trust

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

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

Дополнительная информация по адресу 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 для запуска автономных сканирований vuln образов Docker.

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

Подробнее о том, как это сделать, можно узнать здесь: https://docs.docker.com/ee/dtr/user/manage-images/scan-images-for-vulnerabilities/

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

Universal Control Plane может интегрироваться с LDAP для упрощенной системы аутентификации, позволяющей избежать ненужной избыточности.
Дополнительную информацию о рекомендациях по безопасности в Docker, а также о ресурсе docs.docker.com, указанном в этом руководстве, можно найти в чеклистах Центра интернет-безопасности для Docker, которые можно скачать здесь: https://learn.cisecurity.org/benchmarks
Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий