Ответ
В 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