Назад к вопросам
Middle
78
questionbank

Почему небезопасно запускать контейнеры с правами пользователя root в Kubernetes?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Запуск контейнеров с правами root в Kubernetes создает ряд рисков безопасности:

  • Привилегии хоста: Процесс в контейнере, работающий от имени root, имеет потенциальный доступ к базовой операционной системе узла Kubernetes и ее ресурсам. В случае компрометации контейнера злоумышленник может получить контроль над узлом.
  • Escape контейнера: Уязвимости в ядре Linux, Docker/containerd или другом ПО могут позволить процессу, работающему от root внутри контейнера, "сбежать" из контейнера и выполнять команды на хосте.
  • Расширение атаки: Если контейнер с root скомпрометирован, злоумышленник может использовать эти привилегии для выполнения вредоносных действий внутри кластера, таких как:
    • Доступ к секретам других подов или кластера.
    • Изменение конфигурации кластера.
    • Запуск других вредоносных подов.
  • File System Permissions: Процессы от root могут игнорировать права доступа к файлам на примонтированных томах, что может привести к изменению или удалению критически важных данных.
  • SecComp/AppArmor Bypass: Несмотря на наличие профилей безопасности (например, Seccomp, AppArmor/SELinux), их эффективность значительно снижается при выполнении процессов от имени root.
  • Неявные риски: Часто приложения не требуют прав root для нормальной работы. Запуск от root может скрывать проблемы с правами доступа или конфигурацией, которые могли бы быть обнаружены при работе от непривилегированного пользователя.

Рекомендации по минимизации рисков:

  • Запускать контейнеры от имени непривилегированного пользователя.
  • Использовать SecurityContext в манифестах подов:
    • runAsNonRoot: true
    • runAsUser: <uid> (например, 1000)
  • Ограничивать возможности контейнеров с помощью capabilities.
  • Применять политики безопасности подов (PSP/PSA).

Пример использования SecurityContext:

# Пример манифеста пода с SecurityContext
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
spec:
  containers:
  - name: myapp-container
    image: myapp-image
    securityContext:
      runAsNonRoot: true    # Запрещает запуск от root
      runAsUser: 1000       # Указывает UID пользователя
      allowPrivilegeEscalation: false # Запрещает поднятие привилегий
      readOnlyRootFilesystem: true # Монтирует корневую ФС только на чтение
      capabilities:
        drop:
        - ALL # Отбрасывает все привилегии