Какие практики вы знаете для повышения безопасности приложений в Kubernetes?

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

Ответ

Безопасность в Kubernetes — это многослойный подход (Defense in Depth). Вот ключевые практики, которые я применял:

  1. Использование минимально привилегированных образов:

    • Запуск контейнеров не от root. Создание отдельного пользователя в Dockerfile.
      FROM alpine
      RUN addgroup -S appgroup && adduser -S appuser -G appgroup
      USER appuser
      COPY --chown=appuser:appgroup app /app
  2. Применение Pod Security Standards (PSS): Настройка Pod Security Admission на уровне namespace для автоматического запрета привилегированных подов.

    # namespace.yaml
    apiVersion: v1
    kind: Namespace
    metadata:
      name: my-app
      labels:
        pod-security.kubernetes.io/enforce: baseline
        pod-security.kubernetes.io/enforce-version: latest
  3. Строгий RBAC (Role-Based Access Control): Принцип наименьших привилегий. Создание ServiceAccount, Role/ClusterRole и RoleBinding только с необходимыми правами.

    # role.yaml - роль, разрешающая только читать логи в конкретном namespace
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      namespace: monitoring
      name: pod-log-reader
    rules:
    - apiGroups: [""]
      resources: ["pods", "pods/log"]
      verbs: ["get", "list"]
  4. Сетевая изоляция с Network Policies: По умолчанию весь трафик между подами разрешен. Необходимо явно запретить всё и разрешить только необходимое.

    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: api-allow-only-frontend
    spec:
      podSelector:
        matchLabels:
          app: backend-api
      policyTypes:
      - Ingress
      ingress:
      - from:
        - podSelector:
            matchLabels:
              app: frontend
        ports:
        - protocol: TCP
          port: 8080
  5. Безопасное управление секретами: Использование Secrets (в зашифрованном виде с помощью EncryptionConfiguration) или, что лучше, внешних систем типа HashiCorp Vault с использованием инжектора (Vault Agent Sidecar).

  6. Сканирование образов на уязвимости: Интеграция сканеров (Trivy, Grype) в CI/CD пайплайн для проверки базовых образов и зависимостей перед сборкой и деплоем.

  7. Аудит (Audit Logging): Включение и анализ логов аудита Kubernetes API для отслеживания подозрительных операций (например, массовое создание подов или попытки эскалации привилегий).