Как зашифровать Secret в Kubernetes

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

Ответ

В Kubernetes я использую несколько подходов к шифрованию Secrets в зависимости от требований безопасности и workflow.

1. Шифрование на уровне etcd (EncryptionConfiguration): Создаю конфигурационный файл и настраиваю kube-apiserver:

apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources:
      - secrets
    providers:
      - aescbc:
          keys:
            - name: key1
              secret: <base64-encoded-32-byte-key>
      - identity: {}  # fallback

Генерирую ключ:

head -c 32 /dev/urandom | base64

Добавляю флаг в kube-apiserver:

--encryption-provider-config=/etc/kubernetes/encryption-config.yaml

2. Использование внешних KMS провайдеров (более безопасно):

apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources:
      - secrets
    providers:
      - kms:
          name: aws-kms
          endpoint: unix:///var/run/kmsplugin/socket.sock
          cachesize: 1000
          timeout: 3s
      - identity: {}

3. SealedSecrets для GitOps workflow: Устанавливаю контроллер:

kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.24.0/controller.yaml

Шифрую секрет для Git:

# Создаю обычный Secret
kubectl create secret generic db-creds 
  --from-literal=username=admin 
  --from-literal=password=secret 
  --dry-run=client -o yaml > plain-secret.yaml

# Шифрую его
kubeseal --format yaml < plain-secret.yaml > sealed-secret.yaml

# Применяю зашифрованную версию
kubectl apply -f sealed-secret.yaml

4. Использование External Secret Operators (с HashiCorp Vault):

apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: vault-db-secret
spec:
  refreshInterval: 1h
  secretStoreRef:
    name: vault-backend
    kind: SecretStore
  target:
    name: database-secret
  data:
  - secretKey: password
    remoteRef:
      key: secret/data/database
      property: password

Мои практические рекомендации:

  • В production всегда включаю Encryption at Rest для etcd
  • Для разных окружений использую разные ключи шифрования
  • Регулярно ротирую ключи (раз в 90 дней)
  • Храню мастер-ключи в HSM или облачном KMS (AWS KMS, GCP Cloud KMS)
  • Логирую все операции с секретами через аудит kube-apiserver
  • Для разработчиков предоставляю SealedSecrets, чтобы они могли безопасно хранить секреты в Git