# 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.