Secrets de la plateforme
Les services tiers lisent leurs identifiants dans des Secrets Kubernetes créés par External Secrets (deploy/external-secrets/secrets, composant Argo CD platform-secrets). Aucune valeur n'est versionnée.
Ordre d'amorçage
- cert-manager crée l'autorité racine interne (
cert-manager/eai-root-ca,deploy/cert-manager/cluster-issuers.yaml) ; le certificat TLS d'OpenBao est émis par cette autorité. - OpenBao est initialisé et descellé (
bao operator init,bao operator unseal), puisdeploy/openbao/bootstrap.shactive KV v2 (kv), transit, l'auth kubernetes et les politiques. - L'opérateur écrit chaque entrée du tableau ci-dessous :
bao kv put kv/eai/platform/<namespace>/<secret> <propriété>=<valeur> .... - Argo CD applique
platform-secrets: la ClusterSecretStoreopenbao(deploy/openbao/k8s/clustersecretstore.yaml) synchronise les ExternalSecrets (rafraîchissement 1h,creationPolicy: Owner,deletionPolicy: Retain). - Le Secret
kyverno/cosign-public-key(clécosign.pub) vient du module Terraformplatform-bootstrap(variablecosign_public_key), car l'admission en a besoin avant tout le reste.
Entrées OpenBao
| Chemin OpenBao (kv) | Propriétés | Consommateur | Génération |
|---|---|---|---|
eai/platform/apisix/redis-acl-apisix | apisix-password | apisix/redis-acl-apisix: APISIX (limit-count Redis) | openssl rand -base64 32 ; son sha256 va dans user.acl (utilisateur apisix) |
eai/platform/eai-data/nats-users | control-plane, multimodal, worker | eai-data/nats-users: NATS (empreintes bcrypt) | bcrypt d'un openssl rand -base64 32 : nats server passwd -p <mot de passe> |
eai/platform/eai-data/redis-acl | user.acl | eai-data/redis-acl: Redis (fichier ACL complet, deploy/data/redis/values.yaml) | le fichier ACL avec #<sha256> par utilisateur : printf %s <mot de passe> | sha256sum |
eai/platform/eai-data/redis-password | password | eai-data/redis-password : Redis, utilisateur default (opérateur et réplication uniquement) | openssl rand -base64 32 |
eai/platform/eai-data/redis-opik-acl | user.acl | eai-data/redis-opik-acl: Redis dédié à Opik (fichier ACL, deploy/data/redis-opik/values.yaml) | le fichier ACL avec #<sha256> par utilisateur : printf %s <mot de passe> | sha256sum |
eai/platform/eai-data/redis-opik-password | password | eai-data/redis-opik-password : Redis dédié à Opik, utilisateur default (opérateur et réplication uniquement) | openssl rand -base64 32 |
eai/platform/eai-data/cnpg-s3 | ACCESS_KEY_ID, SECRET_ACCESS_KEY | eai-data/cnpg-s3 : sauvegardes CloudNativePG (bucket eai-backups, préfixe cnpg) | clés d'un utilisateur S3 limité au bucket eai-backups |
eai/platform/velero/velero-s3 | cloud | velero/velero-s3 : Velero (fichier d'identifiants au format AWS) | section [default] avec aws_access_key_id et aws_secret_access_key d'un utilisateur S3 limité au bucket Velero |
eai/platform/eai-data/qdrant-api-key | api-key, read-only-api-key | eai-data/qdrant-api-key: Qdrant (control plane, workers) | openssl rand -base64 32 pour chacune |
eai/platform/eai-data/temporal-db-credentials | username, password | eai-data/temporal-db-credentials: Temporal (rôle Postgres temporal) | username temporal ; openssl rand -base64 32, identique au rôle CloudNativePG |
eai/platform/eai-data/livekit-keys | api-key, api-secret | eai-data/livekit-keys: LiveKit, même paire que EAI_LIVEKIT_API_KEY / EAI_LIVEKIT_API_SECRET du control plane | api-key : openssl rand -hex 8 ; api-secret : openssl rand -base64 48 (au moins 32 octets) |
eai/platform/eai-data/livekit-redis | password | eai-data/livekit-redis: LiveKit (utilisateur ACL Redis livekit) | openssl rand -base64 32 ; son sha256 va dans user.acl |
eai/platform/eai-security/keycloak-bootstrap-admin | username, password | eai-security/keycloak-bootstrap-admin: Keycloak (administrateur temporaire) | openssl rand -base64 32 |
eai/platform/eai-security/keycloak-db | username, password | eai-security/keycloak-db: Keycloak (rôle Postgres keycloak) | openssl rand -base64 32 |
eai/platform/eai-security/openfga-db | uri | eai-security/openfga-db: OpenFGA | postgres://openfga:<mot de passe>@eai-postgres-rw.eai-data.svc:5432/openfga?sslmode=verify-full&sslrootcert=/etc/openfga/db-ca/ca.crt |
eai/platform/eai-security/openfga-preshared | keys | eai-security/openfga-preshared: OpenFGA (également EAI_OPENFGA_API_TOKEN) | openssl rand -base64 32, séparées par des virgules |
eai/platform/observability/clickhouse-operator-access | username, password | observability/clickhouse-operator-access: opérateur ClickHouse (métriques, schéma) | username clickhouse_operator ; openssl rand -base64 32 |
eai/platform/observability/clickhouse-users | eai-reader, eai-writer, opik | observability/clickhouse-users: ClickHouse (empreintes sha256 hexadécimales) | printf %s <mot de passe> | sha256sum (le mot de passe en clair de opik va dans clickhouse-credentials et opik-backend-credentials) |
eai/platform/observability/otel-opensearch | password | observability/otel-opensearch: OpenTelemetry Collector (utilisateur OpenSearch otel-writer, journaux) | openssl rand -base64 32 |
eai/platform/observability/opensearch-internal-users | internal_users.yml | observability/opensearch-internal-users: OpenSearch (utilisateurs du greffon de sécurité, empreintes bcrypt) | plugins/opensearch-security/tools/hash.sh -p <mot de passe> pour chaque utilisateur |
eai/platform/observability/opensearch-bootstrap | password | observability/opensearch-bootstrap: Job opensearch-bootstrap (modèles d'index, ISM, Security Analytics) | openssl rand -base64 32 |
eai/platform/observability/jaeger-opensearch | password, ca.crt | observability/jaeger-opensearch: Jaeger (utilisateur OpenSearch jaeger, stockage des intervalles) | openssl rand -base64 32 ; ca.crt de eai-root-ca |
eai/platform/observability/opik-backend-credentials | STATE_DB_PASS, ANALYTICS_DB_PASS, ANALYTICS_DB_MIGRATIONS_PASS, REDIS_URL, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY | observability/opik-backend-credentials: Opik (MySQL fournie par le client, ClickHouse opik, redis-opik, bucket S3 opik) | mot de passe MySQL du client ; mot de passe en clair de opik ; rediss://opik:<mot de passe>@redis-opik-master.eai-data.svc.cluster.local:6379/0 ; utilisateur S3 du stockage objet |
eai/platform/observability/clickhouse-credentials | password | observability/clickhouse-credentials: Opik (adminUser de la ClickHouseInstallation opik-clickhouse) | mot de passe en clair de opik |
eai/platform/observability/otel-clickhouse | password | observability/otel-clickhouse: OpenTelemetry Collector (ClickHouse otel) | openssl rand -base64 32 |
eai/platform/observability/alertmanager-webhooks | default-url, oncall-url, finops-url, security-url | observability/alertmanager-webhooks: récepteurs Alertmanager | URL des webhooks des outils d'astreinte |
eai/platform/spire-server/spire-server-db | password | spire-server/spire-server-db: serveur SPIRE (rôle Postgres spire) | openssl rand -base64 32 |
Copies d'autorités de certification
Les certificats publics (clé ca.crt uniquement, jamais tls.key) sont copiés par le fournisseur kubernetes d'External Secrets (deploy/external-secrets/secrets/ca-stores.yaml) : eai-root-ca vers apisix, observability et eai-data (eai-internal-ca) et vers spire-server (openbao-ca) ; la CA CloudNativePG eai-data/eai-postgres-ca vers eai-security et spire-server. Chaque magasin a son ServiceAccount et un Role limité à get sur le Secret source.