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

Какой у вас опыт работы с сайдкарами для хранения секретов?

Sobes Copilot

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

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

sobes.tech AI

Работал с паттерном сайдкара для инъекции секретов в контейнеризированные приложения. Основные решения, с которыми сталкивался:

  1. Vault Agent Injector (HashiCorp Vault):

    • Разворачивается как контроллер в Kubernetes, который перехватывает создание подов, ищет аннотации Vault.
    • Автоматически добавляет к поду Volume и сайдкар-контейнер Vault Agent.
    • Vault Agent отвечает за аутентификацию в Vault, получение секретов и их запись в файловую систему пода (через Volume).
    • Приложение внутри пода читает секреты из смонтированного Volume.
    • Преимущества: централизованное управление секретами, динамическое получение, автоматическая ротация, интеграция с различными аутентификационными бэкендами Vault.
  2. Kubernetes Secrets Store CSI Driver:

    • Позволяет приложениям в Kubernetes получать доступ к секретам, хранящимся во внешних хранилищах секретов (Azure Key Vault, GCP Secret Manager, AWS Secrets Manager, HashiCorp Vault и др.) как к томам (Volume).
    • Сайдкар-контейнер (Specific Provider) запускается как часть того же пода или как отдельный агент и взаимодействует с внешним хранилищем посредством gRPC.
    • Полученные секреты монтируются в под как временное файловое хранилище (Secrets Store CSI Driver Volume).
    • Приложение читает секреты из файловой системы.
    • Преимущества: единый интерфейс для доступа к разным хранилищам секретов в Kubernetes, возможность монтировать не только Secrets/Configs, но и сертификаты, ключи.

Общий подход заключается в минимизации хранения секретов непосредственно в образе приложения или в манифестах Kubernetes, делегируя задачу их получения и обновления сайдкару. Это повышает безопасность за счет отделения логики работы с секретами от логики приложения и облегчает управление секретами в динамических средах вроде Kubernetes.

# Пример использования Vault Agent Injector аннотаций в манифесте Pod
apiVersion: v1
kind: Pod
metadata:
  name: my-app
  annotations:
    vault.hashicorp.com/agent-inject: "true"
    vault.hashicorp.com/role: "internal-app"
    vault.hashicorp.com/agent-inject-template-db-config: |
      {{- with secret "database/creds/my-app" -}}
      DB_USERNAME="{{ .Data.username }}"
      DB_PASSWORD="{{ .Data.password }}"
      {{- end -}}
spec:
  containers:
    - name: app
      image: my-app-image
      # Приложение будет читать секреты из /vault/secrets/db-config
      volumeMounts:
        - name: injected-secrets
          mountPath: "/vault/secrets"
  volumes:
    - name: injected-secrets
      # Volume, который будет создан и заполнен Vault Agent
      emptyDir:
        # Используется tmpfs для хранения секретов в памяти
        medium: Memory

# Пример использования Secrets Store CSI Driver
apiVersion: v1
kind: Pod
metadata:
  name: my-app-csi
spec:
  serviceAccountName: workload-identity-sa # Пример для облачных провайдеров
  containers:
    - name: app
      image: my-app-image
      volumeMounts:
      - name: secret-volume
        mountPath: "/mnt/secrets-store"
        readOnly: true
  volumes:
    - name: secret-volume
      csi:
        driver: secrets-store.csi.k8s.io
        readOnly: true
        volumeAttributes:
          secretProviderClass: "azure-keyvault-csi" # Ссылка на SecretProviderClass
---
apiVersion: secrets-store.csi.k8s.io/v1
kind: SecretProviderClass
metadata:
  name: azure-keyvault-csi
spec:
  provider: azure # Указание провайдера
  parameters:
    usePodIdentity: "false" # Использование управляемых удостоверений Azure AD
    useVMManagedIdentity: "true"
    userAssignedIdentityID: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" # ID управляемого удостоверения
    keyvaultName: "my-keyvault" # Имя Azure Key Vault
    tenantId: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" # ID тенанта Azure AD
    objects: |
      array:
        - |
          objectName: my-database-password # Имя секрета в Key Vault
          objectType: secret
          objectVersion: "" # Опциональная версия секрета
          fieldName: DB_PASSWORD # Имя файла, куда будет записан секрет в Volume

Использование сайдкара для секретов обеспечиваетseparation of concerns и упрощает интеграцию с системами управления секретами.