Прим. прев.: Темата за сигурността на Docker е една от вечните в съвременния IT свят. Затова, без излишни обяснения, ви представяме превод на поредната подбрана колекция от съответни препоръки. Ако вече сте се интересували от този въпрос, много от тях ще ви бъдат познати. А самата подборка допълнихме със списък от полезни утилити и няколко ресурса за по-нататъшно изучаване на темата.

Предлагам вниманието ви ръководство за осигуряване на сигурността на Docker. Обратната връзка е добре дошла, тъй като това е по-скоро сборник от различни ресурси и не всички от тях са били подложени на дълбочинна проверка. Препоръките са разделени на три категории:
- Необходими мерки вътре в операционната система на хоста при работа с Docker;
- Инструкции, отнасящи се до файла за конфигурация на сборката и създаването на контейнери;
- Инструменти за сигурност, които могат да се интегрират със специфични функции на Docker Enterprise.
Основата на ръководството са различни ресурси, много от които са изброени по-долу. То не може да се нарече изчерпателно, но обхваща всички основи. Допълнителна информация може да бъде намерена в описанието на тестовете CIS (връзката е предоставена в края на това ръководство), както и в документацията на Docker.
Docker Security Benchmark
автоматично проверява вашия Docker за съответствие на най-разпространените добри практики. Скриптът представлява неплох тест за хрумвания по сигурността, но не трябва да се разглежда като инструмент за комплексен анализ.
ОС на хоста
Очевидно е, че Docker-контейнерът не може да бъде защитен, ако самата хост-система не е защитена. Затова е необходимо да се следват добрите практики в областта на сигурността на операционните системи. Освен това, би било разумно да се проведе анализ на уязвимостите в допълнение към следващите препоръки.
Правила за одит
Създавайте и използвайте правила за одит за файлове, свързани с Docker, с помощта на auditctl. Например, можете да добавите -w /usr/bin/dockerd -k docker к /etc/audit.rules и да рестартирате услугата за одит.
Режим FIPS
Включването на режима 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За допълнителна информация вижте документацията и .
Docker Secrets
Конфиденциални данни трябва да се съхраняват като секрети. Можете да стартирате съответния сервис с командата 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=ADDRESS).-
"userns-remap": "Your_User"— предотвратява повишаване на привилегиите (privilege escalation), изолирайки пространството на имената под конкретен потребител.
Сигурност на транспортния слой
Достъпът до демона на 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 профил, можете да го приложите с този флаг. Научете повече за Seccomp и Docker можете .
Конфигурация на контейнерите и файловете за изграждане
Създаване на потребител
Уверете се, че за контейнера е създаден потребител и го стартирайте под този потребител (НЕ стартирайте контейнера като root).
Отдалечен достъп
Забранете удалечения достъп до демона. Ако все пак е необходим, защитете го с сертификати.
Изолирайте пространството на имената на потребителите
Особено важно е да се уверите, че пространството на имената на потребителите в Docker е изолирано, тъй като по подразбиране то се използва заедно с пространството на имената на хоста. В някои случаи това може да бъде използвано за повишаване на привилегиите или дори за напускане на контейнера. Изолирането на потребителското пространство на имената може да се направи чрез редактиране на конфигурационния файл (както е описано по-горе в раздела „Конфигурационен файл на Docker“). Допълнителното споменаване на този проблем тук е повикано от неговата важност.
Healthcheck-и
Healthcheck (проверка на работоспособността) — мощен инструмент, позволяващ проверка на целостта на контейнера. Настройва се в Dockerfile с помощта на инструкция HEALTHCHECK. Healthcheck-ите позволяват да се уверите, че контейнерът работи правилно. В следващия пример проверката за работоспособност завършва с 0, ако сървърът работи, и 1, ако е "паднал":
HEALTHCHECK CMD curl --fail http://localhost || exit 1SELinux
Ако 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. За да решите този проблем, създайте мрежов мост в съответствие със своите спецификации, както е описано .
Предупреждение за Docker сокета
Никога не пробуждайте Docker сокета в контейнера. В противен случай, контейнерът ще има възможността да изпълнява Docker команди и, следователно, да свързва с хост операционната система и да я контролира. Не правете това.
Конфигуриране на Docker Enterprise
Docker Trust
Docker Trust позволява генерирането на ключове, с помощта на които може да се проверява криптографската цялост на образите. Ключовете на Docker Trust могат да се използват за подписване на Docker образи с частни ключове, които се проверяват с публични ключове на Notary Server. Допълнителна информация — . Включването на Docker Trust в Enterprise Engine е подробно описано в .
Сканиране на уязвимости
В Docker Enterprise има вграден скенер за уязвимости, който позволява да се изтегли база с CVE за offline сканиране на уязвимости в образите. Редовното сканиране на образите помага да ги направи по-сигурни: потребителят веднага получава предупреждения за откритите уязвимости. Повече информация относно това как може да се направи, вижте .
Прим. прев.: Съществуват и Open Source скенери за уязвимости в Docker образи, примери за които можете да видите в края на материала.
Интеграция с LDAP и UCP
Universal Control Plane може да бъде интегриран с LDAP. Резултатът ще бъде опростена система за удостоверяване, която позволява избягване на ненужно дублиране. Повече информация за това може да бъде прочетена в статията .
Други материали
Допълнителна информация за най-добрите практики в областта на сигурността на Docker може да бъде намерена на . Също така препоръчваме да изтеглите .
Бонус от преводача
Като логично допълнение към тази статия публикуваме списък от 10 популярни Open Source инструменти за осигуряване на безопасността в Docker. Той е заимстван от (от Bill Doerrfeld от Doerrfeld.io).
NB: Научете повече за много от споменатите тук проекти в статията „».
- — вече споменатият в самото начало на статията скрипт, който проверява Docker контейнери за съответствие с разпространените практики за сигурност.

- — вероятно най-популярният инструмент за статичен анализ на уязвимости в контейнерите. Използва многобройни бази данни с уязвимости CVE (включително трекери на водещи Linux дистрибуции като Red Hat, Debian, Ubuntu). Предлага API за разработчици и лесна възможност за разширяване на функциите (чрез добавяне на „драйвери“). Използва се в популярния публичен регистър на образи от контейнери (аналог на Docker Hub) — Quay.io.
- — решение за осигуряване на мрежова безопасност на ниво ядро, основано на технологията за филтриране на мрежови пакети BPF.
- — инструмент за анализ на съдържанието на образи за наличие на уязвимости по базата CVE. Освен това позволява прилагане на потребителски политики (на базата на различни данни, включително бели/черни списъци, съдържание на файлове и др.) за оценка на сигурността на контейнерите.
- — цяла екосистема за създаване и поддържане на политики за сигурност на различни платформи. За проверка на контейнери предлага инструмент
oscap-docker. - — инструмент за сканиране на Docker контейнери за наличие на уязвимости, троянски коне, вируси и злонамерен софтуер. Базите CVE включват проверки за зависимости от OWASP, базата Red Hat Oval, репозитория на експлоити Exploit Database.
- — фреймворк за подписване на Docker образи, първоначално създаден в Docker Inc (а след това предаден на развитие в CNCF). Неговото използване позволява делегиране на роли и разпределение на отговорности за контейнерите, както и верифициране на криптографската цялост на образите.
- — API за метаданни, предназначен за управление на вътрешните политики за сигурност. Например, позволява подобрение на работата на скенерите за сигурност на контейнерите. Shopify използва този API за управление на метаданните на своите 500 хиляди образи.
- — инструмент за Kubernetes, който следи поведението на системата: активността в контейнерите, на хостовете, в мрежата. Позволява настройване на непрекъснати проверки в инфраструктурата, откриване на аномалии и изпращане на аларми по каквито и да е системни повиквания на Linux.
- — още един инструмент за статичен анализ на образи на Docker контейнери. Позволява „да надникнете“ в файловете на образа, събирайки необходимите данни, прилагайки нужните политики и т.н.
Още една добра селекция от практически насоки как да направите Docker по-безопасен, можете да намерите в компанията Aqua Security. Много от техните съвети се припокриват с вече споменатите по-горе, но има и други. Например, авторите предлагат организиране на мониторинг на активността в контейнерите и посочват какво да се има предвид при използване на Docker Swarm.
За тези, които искат да се запознаят по-подробно с темата, миналата година излезе книгата „», части от която са свободно достъпни .
Накрая, за практически запознанства с някои аспекти на сигурността на Docker: профили Seccomp и използването на capabilities на ядрото на Linux в контейнерите — можете да преминете през съответните лабораторни работи на * — вижте секцията „Security“.

* За самия този ресурс ние пишем преди две години, а през ноември 2018 г. се случи доста интересна (от гледна точка на сигурността) история с него. В кратце, специалисти от CyberArk Software Ltd. успяха да го хакнат: да получат възможност за изпълнение на команди извън контейнери, т.е. на хост системата. Отлична илюстрация на проблемите със сигурността в Docker, нали? За всички подробности относно случилото се четете .
P.S. от преводача
Прочетете също в нашия блог:
- «»;
- «»;
- «»;
- «»;
- «»;
- «».
Източник: habr.com

