Код-ревью Middle Безопасность контейнеров обновлено

Ревью: запуск агента мониторинга

Вопрос

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

docker run -d --name agent \
  --privileged \
  --user root \
  -v /:/host \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e API_TOKEN=tok_live_8f2a9c \
  --restart always \
  vendor/agent:latest

Коротко

Безопаснее: Доступ к API Docker идёт через прокси сокета, который разрешает только чтение списка контейнеров и статистики. Монтирование docker.sock с :ro не помогает: флаг запрещает запись в файл сокета, но не ограничивает команды API.

Что должен найти ревьюер

  1. Безопасностьстрока 2
    --privileged даёт все capabilities и доступ к устройствам: агенту метрик это не нужно. Выдать конкретные capabilities, если требуется.
  2. Безопасностьстрока 3
    Явный запуск от root. Использовать непривилегированного пользователя, если агент это поддерживает.
  3. Безопасностьстрока 4
    Корень хоста смонтирован на запись. Монтировать только нужные пути (/proc, /sys) и только для чтения (:ro).
  4. Безопасностьстрока 5
    Сокет Docker даёт полный контроль над хостом. Если без него никак, смонтировать :ro (это не ограничивает API!), а лучше использовать прокси сокета с разрешением только на чтение нужных эндпоинтов.
  5. Безопасностьстрока 6
    Токен в переменной окружения в командной строке: виден в истории shell, ps и docker inspect. Передать файлом или через секреты.
  6. Ошибкастрока 8
    Тег latest у стороннего агента с такими правами: неконтролируемые обновления. Закрепить версию или digest.

Разбор

Безопаснее:

docker run -d --name agent \
  --user 10001 \
  --cap-drop=ALL --security-opt no-new-privileges \
  --read-only \
  -v /proc:/host/proc:ro -v /sys:/host/sys:ro \
  -v /run/agent/token:/run/secrets/token:ro \
  -e DOCKER_HOST=tcp://socket-proxy:2375 \
  --restart unless-stopped \
  vendor/agent:3.2.1

Доступ к API Docker идёт через прокси сокета, который разрешает только чтение списка контейнеров и статистики. Монтирование docker.sock с :ro не помогает: флаг запрещает запись в файл сокета, но не ограничивает команды API. Агенты с широкими правами выбирают по доверию к поставщику и закрепляют версию.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.