Как зашифровать Secret в Kubernetes
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Шифрование Secrets в Kubernetes
Secrets в Kubernetes по умолчанию хранятся в незашифрованном виде (base64-encoded) в etcd. Это представляет угрозу безопасности. Для защиты необходимо использовать шифрование на уровне хранения (Encryption at Rest).
Основные методы шифрования
1. Encryption Configuration (шифрование в etcd)
Наиболее стандартный метод — использование EncryptionConfiguration. Kubernetes позволяет настроить провайдеры шифрования через API-сервер.
Пример конфигурации (encryption-config.yaml):
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: <BASE64_ENCODED_32_BYTE_KEY>
- identity: {} # Резервный провайдер (без шифрования)
Шаги реализации:
- Генерация ключа (32 байта для AES-CBC):
head -c 32 /dev/urandom | base64
- Создание конфигурационного файла шифрования
- Настройка kube-apiserver:
--encryption-provider-config=/etc/kubernetes/encryption-config.yaml
- Перезапуск kube-apiserver и принудительное перешифрование:
kubectl get secrets --all-namespaces -o json | kubectl replace -f -
2. Внешние Key Management Service (KMS)
Для production- сред рекомендуется использование внешних KMS (AWS KMS, GCP KMS, Azure Key Vault, HashiCorp Vault). Это обеспечивает ротацию ключей и централизованное управление.
Пример конфигурации с AWS KMS:
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- kms:
name: aws-kms
endpoint: unix:///tmp/kms.socket
cachesize: 1000
timeout: 3s
3. Использование Sealed Secrets от Bitnami
Sealed Secrets — популярное решение для безопасного хранения секретов в Git. Состоит из двух компонентов:
– Клиент (kubeseal) для шифрования секретов локально
– Контроллер в кластере для расшифровки
Пример создания SealedSecret:
# Установка kubeseal
curl -LO https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.24.0/kubeseal-0.24.0-linux-amd64.tar.gz
# Шифрование секрета
kubectl create secret generic mysecret \
--from-literal=password=supersecret \
--dry-run=client -o yaml | \
kubeseal --controller-namespace kube-system \
--controller-name sealed-secrets-controller \
--format yaml > sealed-secret.yaml
4. External Secrets Operator
External Secrets Operator синхронизирует секреты из внешних систем (AWS Secrets Manager, HashiCorp Vault) в Kubernetes.
Пример манифеста:
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: database-secret
spec:
refreshInterval: 1h
secretStoreRef:
name: aws-secret-store
kind: SecretStore
target:
name: database-secret
data:
- secretKey: password
remoteRef:
key: production/database
property: password
Практические рекомендации
Этапы внедрения шифрования:
-
Оценка требований:
- Compliance требования (PCI DSS, HIPAA, GDPR)
- Требования к ротации ключей
- Доступность и disaster recovery
-
Выбор метода:
- Для простых кластеров — EncryptionConfiguration
- Для интеграции с облаком — KMS провайдеры
- Для GitOps — Sealed Secrets или External Secrets Operator
-
Реализация:
- Тестирование в dev -среде
- Постепенное внедрение в production
- Создание процедур ротации ключей
-
Мониторинг и обслуживание:
- Мониторинг событий шифрования/расшифровки
- Регулярная ротация ключей
- Аудит доступа к секретам
Важные предостережения:
- Шифрование в etcd защищает только данные в хранилище
- Secrets все еще могут быть доступны в логах или pod definitions
- Всегда комбинируйте с RBAC, Network Policies и Pod Security Standards
- Регулярно обновляйте шифрование при ротации ключей
Пример полного процесса с EncryptionConfiguration
# 1. Генерация ключа
KEY=$(head -c 32 /dev/urandom | base64)
# 2. Создание конфигурации
cat > encryption-config.yaml <<EOF
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: ${KEY}
- identity: {}
EOF
# 3. Применение конфигурации (зависит от метода установки Kubernetes)
# Для kubeadm:
sudo cp encryption-config.yaml /etc/kubernetes/
# Обновление /etc/kubernetes/manifests/kube-apiserver.yaml
# Добавление: - --encryption-provider-config=/etc/kubernetes/encryption-config.yaml
# 4. Перешифровка существующих секретов
kubectl get secrets -A -o json | kubectl replace -f -
Выбор метода зависит от требований безопасности, инфраструктуры и workflows. Для максимальной безопасности рекомендуется комбинация шифрования в etcd через KMS и External Secrets Operator для управления жизненным циклом.