Перейти к основному содержимому

7.07. Безопасность в Docker

Разработчику Инженеру

Безопасность в Docker

Docker предоставляет несколько механизмов для повышения безопасности контейнеров.

  1. Seccomp (Secure Computing Mode) ограничивает системные вызовы, доступные процессам внутри контейнера. Docker использует профиль seccomp по умолчанию, который блокирует опасные системные вызовы (например, chmod, chown). Можно создать собственный профиль seccomp и применить его:
docker run --security-opt seccomp=/path/to/seccomp-profile.json my-container
  1. AppArmor контролирует права доступа к файлам и системным ресурсам. Включён по умолчанию в Ubuntu. Пример:
docker run --security-opt apparmor=unconfined my-container
  1. SELinux предоставляет более строгий контроль доступа. Включён по умолчанию в RHEL/CentOS. Пример:
docker run --security-opt label=disable my-container
  1. User Namespaces отображает UID и GID контейнера на другой UID/GID хоста. Даже если злоумышленник получит доступ к контейнеру с правами root, он не сможет получить такие же права на хосте. Пример - как включить:
dockerd --userns-remap=default
  1. 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
  1. Read-Only Filesystem делает файловую систему контейнера доступной только для чтения. Пример:
docker run --read-only my-container
  1. 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?

  1. Создаётся секрет с помощью команды docker secret create:
echo "my-secret-password" | docker secret create db_password -
  1. При создании сервиса нужно указать секрет (привязав его к сервису):
docker service create \
--name my-app \
--secret db_password \
my-app-image

  1. Секрет монитруется в файловую систему контейнера по пути /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, которая позволяет автоматически применять правила и ограничения к ресурсам кластера - проверка корректности манифестов, автоматическое изменение манифестов (мутация), генерация новых ресурсов на основе политик и логирование нарушений политик (аудит).