feat(security): External Secrets Operator + ClusterSecretStore на Vault
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
---
|
||||
apiVersion: external-secrets.io/v1
|
||||
kind: ClusterSecretStore
|
||||
metadata:
|
||||
name: vault
|
||||
spec:
|
||||
provider:
|
||||
vault:
|
||||
# Внутрикластерный адрес, а не https://vault.<домен>: Vault слушает без TLS
|
||||
# (tls_disable), а поход через шлюз потребовал бы ещё и доверия к internal-ca
|
||||
# внутри ESO. Снаружи UI остаётся на https через envoy.
|
||||
server: http://vault.security.svc:8200
|
||||
path: kv
|
||||
version: v2
|
||||
auth:
|
||||
kubernetes:
|
||||
mountPath: kubernetes
|
||||
role: eso
|
||||
# Service account оператора: имя и namespace должны совпадать с
|
||||
# bound_service_account_names/namespaces роли eso в Vault.
|
||||
serviceAccountRef:
|
||||
name: external-secrets
|
||||
namespace: security
|
||||
# Vault 1.21+ требует audience в роли, ESO по умолчанию просит "vault".
|
||||
audiences:
|
||||
- vault
|
||||
@@ -0,0 +1,30 @@
|
||||
---
|
||||
# Проверочный ExternalSecret: доказывает всю цепочку ESO -> kubernetes-auth ->
|
||||
# Vault -> Secret в кластере. Значение кладётся в Vault командой
|
||||
# vault kv put kv/demo username=demo password=s3cr3t
|
||||
# (key в ExternalSecret указывается без префикса path: demo -> kv/data/demo).
|
||||
# Когда появятся настоящие потребители (токен вебхука Flux и приложения),
|
||||
# этот объект можно удалить.
|
||||
apiVersion: external-secrets.io/v1
|
||||
kind: ExternalSecret
|
||||
metadata:
|
||||
name: vault-smoke
|
||||
namespace: security
|
||||
spec:
|
||||
refreshInterval: 1h
|
||||
secretStoreRef:
|
||||
name: vault
|
||||
kind: ClusterSecretStore
|
||||
target:
|
||||
name: vault-smoke
|
||||
creationPolicy: Owner
|
||||
deletionPolicy: Retain
|
||||
data:
|
||||
- secretKey: username
|
||||
remoteRef:
|
||||
key: demo
|
||||
property: username
|
||||
- secretKey: password
|
||||
remoteRef:
|
||||
key: demo
|
||||
property: password
|
||||
@@ -0,0 +1,36 @@
|
||||
---
|
||||
apiVersion: helm.toolkit.fluxcd.io/v2
|
||||
kind: HelmRelease
|
||||
metadata:
|
||||
name: external-secrets
|
||||
spec:
|
||||
interval: 1h
|
||||
chartRef:
|
||||
kind: OCIRepository
|
||||
name: external-secrets
|
||||
install:
|
||||
crds: CreateReplace
|
||||
upgrade:
|
||||
crds: CreateReplace
|
||||
cleanupOnFail: true
|
||||
remediation:
|
||||
retries: 3
|
||||
# Оператор без состояния: переустановка с нуля безопасна, поэтому при
|
||||
# падении апгрейда релиз снимается и ставится заново, а не залипает.
|
||||
strategy: uninstall
|
||||
values:
|
||||
replicaCount: 1
|
||||
# CRD ставит и обновляет сам чарт.
|
||||
installCRDs: true
|
||||
# Валидирующий вебхук и его certController включены: сертификаты чарт
|
||||
# выпускает и продлевает сам, cert-manager для этого не нужен.
|
||||
webhook:
|
||||
create: true
|
||||
certController:
|
||||
create: true
|
||||
resources:
|
||||
requests:
|
||||
cpu: 10m
|
||||
memory: 64Mi
|
||||
limits:
|
||||
memory: 256Mi
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
resources:
|
||||
- ./ocirepository.yaml
|
||||
- ./helmrelease.yaml
|
||||
- ./clustersecretstore.yaml
|
||||
- ./externalsecret.yaml
|
||||
@@ -0,0 +1,15 @@
|
||||
---
|
||||
apiVersion: source.toolkit.fluxcd.io/v1
|
||||
kind: OCIRepository
|
||||
metadata:
|
||||
name: external-secrets
|
||||
spec:
|
||||
interval: 15m
|
||||
layerSelector:
|
||||
mediaType: application/vnd.cncf.helm.chart.content.v1.tar+gzip
|
||||
operation: copy
|
||||
ref:
|
||||
# Версия чарта external-secrets (равна appVersion). Релизы чарта тегируются
|
||||
# как helm-chart-<version>, в ghcr публикуется тег без префикса.
|
||||
tag: 2.10.0
|
||||
url: oci://ghcr.io/external-secrets/charts/external-secrets
|
||||
Reference in New Issue
Block a user