← Назад к вопросам

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

2.0 Middle🔥 241 комментариев
#Kubernetes#Безопасность

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Шифрование 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: {} # Резервный провайдер (без шифрования)

Шаги реализации:

  1. Генерация ключа (32 байта для AES-CBC):
head -c 32 /dev/urandom | base64
  1. Создание конфигурационного файла шифрования
  2. Настройка kube-apiserver:
--encryption-provider-config=/etc/kubernetes/encryption-config.yaml
  1. Перезапуск 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

Практические рекомендации

Этапы внедрения шифрования:

  1. Оценка требований:

    • Compliance требования (PCI DSS, HIPAA, GDPR)
    • Требования к ротации ключей
    • Доступность и disaster recovery
  2. Выбор метода:

    • Для простых кластеров — EncryptionConfiguration
    • Для интеграции с облаком — KMS провайдеры
    • Для GitOps — Sealed Secrets или External Secrets Operator
  3. Реализация:

    • Тестирование в dev -среде
    • Постепенное внедрение в production
    • Создание процедур ротации ключей
  4. Мониторинг и обслуживание:

    • Мониторинг событий шифрования/расшифровки
    • Регулярная ротация ключей
    • Аудит доступа к секретам

Важные предостережения:

  • Шифрование в 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 для управления жизненным циклом.