# Kubernetes Secrets Operators ## Vault Secret Operator ### https://github.com/ricoberger/vault-secrets-operator **Поддерживаемые Secrets провайдеры:** Hashicorp Vault **Методы авторизации:** Token, Kubernetes, AppRole, AWS, GCP, Azure **Customer Resource Definitions:** 1. *VaultSecret* ```yaml= apiVersion: ricoberger.de/v1alpha1 kind: VaultSecret metadata: name: kvv1-example-vaultsecret spec: keys: - foo isBinary: true path: kvv1/example-vaultsecret type: Opaque ``` 2. *VaultSecret* (шаблон) ```yaml= apiVersion: ricoberger.de/v1alpha1 kind: VaultSecret metadata: name: kvv1-example-vaultsecret annotations: redisdb: "0" spec: keys: - foo - bar path: kvv1/example-vaultsecret templates: fooUri: "https://user:{% .Secrets.foo %}@{% .Namespace %}.somesite.tld/api" barUri: "redis://{% .Secrets.bar %}@redis/{% .Annotations.redisdb %}" type: Opaque ``` **Дополнительные возможности:** - Два типа создания секретов - Замена/создание - Слияние с существующим - Шаблонизация секретов - создание новых значений из существующих в Vault - Автопродление токена - Автоматическая синхронизация секретов из Vault - Загрузка уже закодированных в base64 секретов из Vault - Использование своей роли в секрете для авторизации с помощью метода kubernetes - Поддержка [Vault Namespaces](https://www.vaultproject.io/docs/enterprise/namespaces) - Наследование меток (VaultSecret -> Secret) - Создание PKI сертификатов ## Secrets Manager Operator ### https://github.com/tuenti/secrets-manager **Поддерживаемые Secrets провайдеры:** Hashicorp Vault, Azure Vault **Методы авторизации:** Kubernetes, AppRole **Customer Resource Definitions:** 1. *SecretDefinition* ```yaml= kind: SecretDefinition metadata: name: secretdefinition-sample spec: name: supersecretnew keysMap: decoded: path: secret/data/pathtosecret1 encoding: base64 key: value raw: path: secret/data/pathtosecret1 key: value ``` **Дополнительные возможности:** - Автопродление токена - Автоматическая синхронизация секретов из Vault - Загрузка уже закодированных в base64 секретов из Vault - Поддержка RBAC: - Cluster-wide - Нужен ClusterRole - Namespaces-wide - Нужны ServiceAccount'ы - Интеграция с Prometheus (https://github.com/tuenti/secrets-manager#prometheus-metrics) ## External Secrets Operator ### https://github.com/external-secrets/external-secrets/ ### https://external-secrets.io/v0.5.1/ **Поддерживаемые Secrets провайдеры:** Hashicorp Vault, Kubernetes, Gitlab environment variables, Webhooks и многие другие (возможно все известные) **Методы авторизации (для Hashicorp Vault):** Kubernetes, AppRole, Token, LDAP, JWT/OIDC **Customer Resource Definitions:** 1. *SecretStore* ```yaml= apiVersion: external-secrets.io/v1beta1 kind: SecretStore metadata: name: vault-backend namespace: example spec: provider: vault: server: "https://vault.acme.org" path: "secret" version: "v2" auth: # points to a secret that contains a vault token # https://www.vaultproject.io/docs/auth/token tokenSecretRef: name: "my-secret" key: "vault-token" ``` 2. *ClusterSecretStore* - https://external-secrets.io/v0.5.1/api-clustersecretstore 3. *ExternalSecret* ```yaml= apiVersion: external-secrets.io/v1beta1 kind: ExternalSecret metadata: name: vault-example spec: # ... data: - secretKey: foobar remoteRef: key: /dev/package.json ``` 4. *ClusterExternalSecret* - https://external-secrets.io/v0.5.1/api-clusterexternalsecret **Дополнительные возможности:** - Получение секретов по тегам в метаданных, регулярным выражениям - Автоматическая синхронизация секретов из Vault - 4 типа создания секрета: - Owner - в созданный секрет добавляется метка ownerReference, добавляя его в процесс мониторинга garbage collector'а. Если секрет с таким именем уже есть, но метки нет, то произойдет ошибка - Orphan - создает секрет без ownerReference или обновляет существующий, если в нем нет этой же метки - Merge - обновляет поля в существующем секрете - None - не создает/не обновляет секрет - 3 типа удаления секрета: - Retain - сохранять секреты, если они были удалены у провайдера - Delete - удалить секреты, если это произошло у провайдера - Merge - удалить ключи в секрете без удаления самого секрета - Поддержка Multi Tenancy: - Единый Secret Store на кластер - Secret Store на Namespace - Интеграция с Prometheus - Шаблонизация секретов с помощью ConfigMap или напрямую в ExternalSecret - Возможность получения всех ключей или только определенных ### Вывод Последний оператор - External Secrets - имеет явные преимущества над остальными. Он включает в себя весь функционал Secrets Manager (кроме автоматического продления токена, что, вообще говоря, плюс с точки зрения безопасности) и большую часть возможностей Vault Secret оператора. Выбранный оператор более гибок и понятен в своей работе, а также наиболее популярен в использовании в инфраструктуре Kubernetes.