Docker Secrets

Тема дорожной карты · Docker & Containers

Docker Secrets представляют собой механизм хранения чувствительных данных (пароли, TLS-ключи, токены) в зашифрованном виде в raft-логе Swarm. Эти данные монтируются в виде файлов в in-memory tmpfs по пути /run/secrets/<name> внутри сервиса. Создание секретов осуществляется с помощью команды docker secret create db_pass ./pass.txt, где db_pass — это имя секрета, а ./pass.txt — путь к файлу с чувствительными данными. В конфигурационном файле compose.yaml секреты подключаются с помощью блока secrets:.

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

Как это работает

Docker Secrets имеют несколько уровней безопасности: контент образа (включая уязвимости в базовых системах, коде и зависимостях), процесс сборки (недоверенные команды RUN, утечки секретов), runtime (уровень root внутри контейнера, capabilities, seccomp, AppArmor/SELinux), а также хост (обновления ядра, экспозиция daemon-сокета). Для упрощения процесса hardening, рекомендуется начинать с минимального базового образа (например, distroless, alpine или scratch), запускать контейнеры не под root (USER 10000:10000), а также сбрасывать capabilities (--cap-drop ALL --cap-add NET_BIND_SERVICE).

Секреты в Swarm используются для безопасного хранения и монтирования чувствительных данных. Важно отметить, что секреты работают только в режиме Swarm и не могут быть использованы в обычном режиме docker run. Также стоит помнить, что секреты неизменяемы, и для их ротации необходимо создавать новые секреты.

Когда применять

Применение security-baseline с самого начала разработки проекта является ключевым для обеспечения безопасности контейнерных приложений. Ретрофит безопасности уже работающих приложений может быть болезненным и трудоемким процессом.

Для обеспечения безопасности контейнерных образов рекомендуется регулярно сканировать их на наличие уязвимостей с помощью инструментов, таких как Trivy или Grype. В случае обнаружения критических уязвимостей (CRITICAL CVE), следует немедленно прекратить сборку образов и устранить уязвимости.

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

Типичные ошибки

В процессе работы с Docker Secrets часто встречаются типичные ошибки, которые могут привести к уязвимостям. Например, использование секретов внутри контейнера с правами root может привести к уязвимостям на уровне ядра. Также игнорирование уязвимостей (CVE) в базовых системах или зависимостях может привести к уязвимостям, даже если эти уязвимости не используются в текущем контексте.

Другой распространенной ошибкой является использование переменных окружения (ENV) для хранения API-ключей или других чувствительных данных. Такие данные могут быть сохранены в истории команд и утечены.

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

Связанные понятия

Полезные ресурсы