Как задать права доступа и ограничить привилегии для Docker-контейнера?

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

Ответ

Ограничение прав доступа контейнера — базовая практика безопасности в DevOps. Настраивается комбинацией параметров.

1. Запуск от непривилегированного пользователя Самая важная мера. Задавайте в Dockerfile:

FROM alpine
RUN addgroup -g 1000 appgroup && adduser -u 1000 -G appgroup -D appuser
USER appuser
CMD ["myapp"]

Или при запуске:

docker run --user 1000:1000 my-image

2. Удаление Linux Capabilities По умолчанию контейнер получает широкий набор capabilities. Оставляйте только необходимые.

# Удалить все, затем добавить только нужные
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx
# Пример удаления опасных capabilities
docker run --cap-drop=CHOWN --cap-drop=NET_RAW my-image

3. Запуск контейнера в read-only режиме Запрещает запись в корневую файловую систему контейнера.

docker run --read-only my-image
# Для записи в определенные места используйте tmpfs или томы
docker run --read-only --tmpfs /tmp --mount type=volume,source=logs,target=/var/log my-image

4. Безопасные настройки монтирования (Security Options)

# Отключение доступа к устройствам ядра
docker run --device-read-bps /dev/sda:1mb --device-write-iops /dev/sdb:10 my-image
# Более строгий seccomp-профиль
docker run --security-opt seccomp=/path/to/profile.json my-image
# Отключение доступа к пространству имен хоста (где возможно)
docker run --security-opt="no-new-privileges:true" my-image

5. AppArmor / SELinux Использование мандатного контроля доступа.

docker run --security-opt apparmor=docker-default my-image

6. Права для томов (SELinux context) В системах с SELinux (RHEL, CentOS) используйте :Z или :z для автоматического изменения контекста безопасности тома.

docker run -v /host/path:/container/path:Z my-image

Полный пример безопасного запуска:

docker run -d 
  --name secure-app 
  --user 1000:1000 
  --cap-drop=ALL --cap-add=CHOWN --cap-add=SETGID --cap-add=SETUID 
  --read-only 
  --tmpfs /tmp 
  --security-opt="no-new-privileges:true" 
  -v app_data:/data:rw,Z 
  my-secure-image:latest

В Kubernetes эти настройки задаются в securityContext Pod и Container спецификаций.