Как в Docker ограничить доступ к Volume?

«Как в Docker ограничить доступ к Volume?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ограничение доступа к Docker Volume достигается комбинацией настроек прав доступа и политик безопасности. Вот основные подходы:

  1. Права файловой системы и монтирования:

    • Используйте опцию :ro для монтирования тома в режиме только для чтения.
      docker run -v my_volume:/app/data:ro my_image
    • Явно задавайте UID/GID через переменные окружения или команды в Dockerfile, чтобы процесс в контейнере работал от непривилегированного пользователя.
      FROM alpine
      RUN addgroup -g 1001 appgroup && adduser -u 1001 -G appgroup -D appuser
      USER appuser
      VOLUME /data
      docker run -v /host/path:/data:ro -u 1001 my_image
  2. Политики безопасности хоста (SELinux/AppArmor):

    • Используйте --security-opt для применения конкретных политик.
      # Пример для AppArmor с профилем, запрещающим запись
      docker run --security-opt apparmor=docker-default-deny-write -v my_volume:/data my_image
  3. Настройки драйвера Volume в Docker Compose:

    volumes:
      restricted_data:
        driver: local
        driver_opts:
          type: none
          o: bind,ro,noexec,nosuid,nodev
          device: /srv/secure-data

    Опции noexec, nosuid, nodev добавляют дополнительные ограничения на уровне монтирования.

  4. Для удаленных томов (NFS, cloud storage): ограничения настраиваются на стороне сервера хранения (ACL, IAM-политики).

Важно: Права на файлы и каталоги на хостовой машине (chmod, chown) должны быть установлены до запуска контейнера. Для хранения чувствительных данных (пароли, ключи) вместо volumes предпочтительнее использовать Docker Secrets (в Swarm) или сторонние решения типа HashiCorp Vault.