7.07. Безопасность в Docker
Безопасность в Docker
Docker предоставляет несколько механизмов для повышения безопасности контейнеров.
- Seccomp (Secure Computing Mode) ограничивает системные вызовы, доступные процессам внутри контейнера. Docker использует профиль seccomp по умолчанию, который блокирует опасные системные вызовы (например, chmod, chown). Можно создать собственный профиль seccomp и применить его:
docker run --security-opt seccomp=/path/to/seccomp-profile.json my-container
- AppArmor контролирует права доступа к файлам и системным ресурсам. Включён по умолчанию в Ubuntu. Пример:
docker run --security-opt apparmor=unconfined my-container
- SELinux предоставляет более строгий контроль доступа. Включён по умолчанию в RHEL/CentOS. Пример:
docker run --security-opt label=disable my-container
- User Namespaces отображает UID и GID контейнера на другой UID/GID хоста. Даже если злоумышленник получит доступ к контейнеру с правами root, он не сможет получить такие же права на хосте. Пример - как включить:
dockerd --userns-remap=default
- Capabilities позволяют ограничить привилегии контейнера. Docker предоставляет ограниченный набор capabilities (например, CAP_NET_BIND_SERVICE, CAP_SYS_ADMIN). Можно удалить все дополнительные права и добавить только необходимые права.
Удаление всех дополнительных прав:
docker run --cap-drop ALL my-container
Добавление только необходимых прав:
docker run --cap-add NET_ADMIN my-container
- Read-Only Filesystem делает файловую систему контейнера доступной только для чтения. Пример:
docker run --read-only my-container
- Masking Sensitive Paths. По умолчанию контейнер имеет доступ к /proc, /sys и другим системным директориям. Как решение, можно использовать флаг --tmpfs или --mask:
docker run --tmpfs /run:rw,noexec,nosuid my-container
Когда Docker развёртывается в Production, рекомендуется удалять ненужные capabilities, включать seccomp и AppArmor/SELinux, использовать user namespaces, защищать файловую систему от изменений, использовать минимальные базовые образы (тот же alpine), создавать отдельные сети для контейнеров, и использовать инструменты мониторинга. Всё это можно совместить. Пример безопасного запуска контейнера:
docker run \
--name secure-container \
--read-only \
--cap-drop ALL \
--cap-add CHOWN \
--security-opt seccomp=/path/to/seccomp-profile.json \
--security-opt apparmor=custom-profile \
--user 1000:1000 \
--network isolated-network \
my-container
Docker Secrets - встроенная функция Docker, предназначенная для безопасного хранения и передачи конфиденциальных данных (например, паролей, API-ключей, сертификатов) между контейнерами. Она доступна только в режиме Docker Swarm, но может быть адаптирована и для других сценариев.
Docker Secrets позволяет хранить конфиденциальные данные в зашифрованном виде, передавать секреты только в те контейнеры, которые их запрашивают, и обеспечивать изоляцию данных, чтобы они не попадали в образы или логи. Секреты шифруются как на диске, так и при передаче, доступны только тем сервисам, которым они предназначены, и такая технология упрощает управление конфиденциальными данными.
Как работает Docker Secrets?
- Создаётся секрет с помощью команды docker secret create:
echo "my-secret-password" | docker secret create db_password -
- При создании сервиса нужно указать секрет (привязав его к сервису):
docker service create \
--name my-app \
--secret db_password \
my-app-image
- Секрет монитруется в файловую систему контейнера по пути
/run/secrets/<имя_секрета>. Например:
cat /run/secrets/db_password
Для обеспечения безопасности контейнеров важно использовать комплексный подход. Вот основные аспекты:
- Шифрование томов производится, к примеру, через LUKS (Linux Unified Key Setup) или другие инструменты для шифрования данных на уровне хоста;
- Шифрование сетевого трафика - используется TLS для защищённой передачи данных между контейнерами, настроить сертификаты для HTTPS.
- Тома используются для хранения данных вне контейнера - доступ ограничен и предоставляется только нужным контейнерам;
- Конфиденциальные данные хранятся в секретах, а не в переменных окружения и файлах.
Альтернативами Docker Secrets являются HashiCorp Vault и Kubernetes Secrets.
HashiCorp Vault — это инструмент для безопасного управления секретами (пароли, ключи, токены) и защищенного доступа к ним. External Secrets Operator — это оператор Kubernetes, который позволяет синхронизировать секреты из внешних систем (например, HashiCorp Vault, AWS Secrets Manager, Azure Key Vault) с секретами Kubernetes.
Kyverno — это политика безопасности для Kubernetes, которая позволяет автоматически применять правила и ограничения к ресурсам кластера - проверка корректности манифестов, автоматическое изменение манифестов (мутация), генерация новых ресурсов на основе политик и логирование нарушений политик (аудит).