feat(security): External Secrets Operator + ClusterSecretStore на Vault #8

Merged
grachevko merged 1 commits from feat/external-secrets into main 2026-09-17 18:15:36 +00:00
Collaborator

Следующий слой после Vault: сам оператор и первый потребитель. Vault-сторона уже настроена руками: движок kv (v2), auth-метод kubernetes, политика eso-read и роль eso с bound_service_account_names=external-secrets, bound_service_account_namespaces=security, audience=vault, ttl 1h/4h.

Что в PR

  • Flux-Kustomization external-secrets в ns security с dependsOn: vault (обе Kustomization живут в ns security, поэтому dependsOn допустим).
  • OCIRepository oci://ghcr.io/external-secrets/charts/external-secrets, tag 2.10.0 (версия чарта = appVersion). HelmRelease: installCRDs: true, валидирующий webhook и certController включены (сертификаты чарт выпускает сам, cert-manager не участвует), upgrade.remediation.strategy: uninstall — оператор без состояния, переустановка безопасна.
  • ClusterSecretStore/vault:
    • server: http://vault.security.svc:8200 — внутрикластерный адрес, потому что Vault слушает без TLS (tls_disable), и тогда ESO не нужно доверие к internal-ca. Снаружи UI остаётся на https через envoy.
    • path: kv, version: v2;
    • auth.kubernetes с mountPath: kubernetes, role: eso, serviceAccountRefexternal-secrets в ns security, audiences: [vault] (Vault 1.21+ без audience аутентификацию не принимает).
  • ExternalSecret/vault-smoke — проверочный объект, доказывающий всю цепочку.

Что нужно сделать в Vault (одна команда)

vault kv put kv/demo username=demo password=s3cr3t

(key в ExternalSecret указывается без префикса path: demokv/data/demo.)

Проверка

kubectl -n security get pods
kubectl -n security get clustersecretstore vault -o jsonpath='{.status.conditions[*].reason}'
kubectl -n security get externalsecret vault-smoke -o wide
kubectl -n security get secret vault-smoke -o jsonpath='{.data.username}' | base64 -d

Ожидаемо: поды external-secrets в Running, у стора и ExternalSecret Ready=True/Valid, SecretSynced, и в Secret лежат значения из Vault.

vault-smoke — временный: как только появится первый настоящий потребитель (например токен вебхука Flux или приложение), он удаляется, а приложения получают свои externalsecret.yaml в 2–6 строк.

Следующий слой после Vault: сам оператор и первый потребитель. Vault-сторона уже настроена руками: движок `kv` (v2), auth-метод `kubernetes`, политика `eso-read` и роль `eso` с `bound_service_account_names=external-secrets`, `bound_service_account_namespaces=security`, `audience=vault`, ttl 1h/4h. ## Что в PR - Flux-Kustomization `external-secrets` в ns `security` с `dependsOn: vault` (обе Kustomization живут в ns security, поэтому dependsOn допустим). - `OCIRepository` `oci://ghcr.io/external-secrets/charts/external-secrets`, tag `2.10.0` (версия чарта = appVersion). `HelmRelease`: `installCRDs: true`, валидирующий webhook и certController включены (сертификаты чарт выпускает сам, cert-manager не участвует), `upgrade.remediation.strategy: uninstall` — оператор без состояния, переустановка безопасна. - `ClusterSecretStore/vault`: - `server: http://vault.security.svc:8200` — внутрикластерный адрес, потому что Vault слушает без TLS (`tls_disable`), и тогда ESO не нужно доверие к `internal-ca`. Снаружи UI остаётся на https через envoy. - `path: kv`, `version: v2`; - `auth.kubernetes` с `mountPath: kubernetes`, `role: eso`, `serviceAccountRef` → `external-secrets` в ns `security`, `audiences: [vault]` (Vault 1.21+ без audience аутентификацию не принимает). - `ExternalSecret/vault-smoke` — проверочный объект, доказывающий всю цепочку. ## Что нужно сделать в Vault (одна команда) ``` vault kv put kv/demo username=demo password=s3cr3t ``` (`key` в ExternalSecret указывается без префикса `path`: `demo` → `kv/data/demo`.) ## Проверка ``` kubectl -n security get pods kubectl -n security get clustersecretstore vault -o jsonpath='{.status.conditions[*].reason}' kubectl -n security get externalsecret vault-smoke -o wide kubectl -n security get secret vault-smoke -o jsonpath='{.data.username}' | base64 -d ``` Ожидаемо: поды `external-secrets` в Running, у стора и ExternalSecret `Ready=True`/`Valid`, `SecretSynced`, и в Secret лежат значения из Vault. `vault-smoke` — временный: как только появится первый настоящий потребитель (например токен вебхука Flux или приложение), он удаляется, а приложения получают свои `externalsecret.yaml` в 2–6 строк.
hermes added 1 commit 2026-09-17 18:12:30 +00:00
feat(security): External Secrets Operator + ClusterSecretStore на Vault
Flate / Flate - Success (pull_request) Blocked by required conditions
Flate / Flate - Filter (pull_request) Successful in 5s
Flate / Flate (pull_request) Successful in 17s
b0678e5ccb
grachevko merged commit 07c32f9f79 into main 2026-09-17 18:15:36 +00:00
grachevko deleted branch feat/external-secrets 2026-09-17 18:15:36 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: grachevko/home-ops#8