Dienstkonto-Secrets in Hashicorp Vault speichern
Mit diesem Feature können Sie Google-Dienstkonto-Zertifikate für Apigee Hybrid in Hashicorp Vault, einem externen Secret Manager, speichern. Externe Secret Manager ermöglichen Ihnen die Verwaltung der Speicherung von Daten in Kubernetes, einschließlich der Verwaltung von Datenstandorten und detaillierter Zugriffssteuerung.
Wenn Sie Workload Identity in GKE-Clustern oder Identitätsföderation von Arbeitslasten für EKS und AKS nicht verwenden, müssen Ihre Apigee Hybrid-Komponenten Google-Dienstkonten authentifizieren, um ihre Aufgaben ausführen zu können. “ Es gibt drei Methoden zum Speichern von und Verweisen auf Google-Dienstkontoschlüssel in Apigee Hybrid:
-
Zertifikatsdateien des Dienstkontos (
.json
-Dateien), die auf einer Festplatte gespeichert sind. Verweisen Sie mit dem KonfigurationsattributserviceAccountPath
in Ihren Überschreibungen auf diese Werte. Beispiel:logger: serviceAccountPath: service-accounts/myhybridorg-apigee-logger.json
-
Zertifikatsdateien des Dienstkontos (
.json
-Dateien), die auf einer Festplatte gespeichert sind. Verweisen Sie mit dem KonfigurationsattributserviceAccountPath
in Ihren Überschreibungen auf diese Werte. Siehe Informationen zu Dienstkonten. -
Dienstkontozertifikate, die in einem Kubernetes-Secret gespeichert sind. Verweisen Sie mit dem Konfigurationsattribut
serviceAccountRef
in Ihren Überschreibungen auf diese Werte. Siehe auch Daten in einem Kubernetes Secret speichern -
Dienstkonto-Zertifikate, die in Hashicorp Vault gespeichert sind (siehe diese Anleitung). Verweisen Sie mit dem Konfigurationsattribut
serviceAccountSecretProviderClass
in Ihren Überschreibungen auf diese Werte.
Zum Speichern von Dienstkonto-Secrets in Vault einrichten
CSI-Treiber und Vault-Anbieter installieren
Wenn Sie den CSI-Treiber noch nicht mit Helm in Ihrem Cluster installiert haben, folgen Sie der Anleitung unter CSI-Treiber für den Secrets-Speicher: Installation. Weitere Informationen finden Sie in der Vault-Dokumentation unter Vault-CSI-Anbieter installieren.
Informationen zu den von Apigee Hybrid unterstützten Mindestversionen von CSI-Treibern finden Sie unter Von Apigee Hybrid unterstützte Plattformen und Versionen.
Vault-Secrets, -Richtlinien und -Rollen erstellen
Verwenden Sie die Vault-UI oder -APIs, um Secrets zu erstellen und den von Apigee Hybrid verwendeten Kubernetes-Dienstkonten die Berechtigung zum Lesen dieser Secrets zu erteilen.
-
Erstellen Sie die organisations- und umgebungsspezifischen Secrets im folgenden Format:
Geheimer Schlüssel Secret-Daten secret/data/apigee/orgsakeys
{ "cassandraBackup": "***", "cassandraRestore": "***", "connectAgent": "***", "logger": "***", "mart": "***", "metrics": "***", "mint": "***", "udca": "***", "watcher": "***" }
secret/data/apigee/envsakeys-ENV_NAME
{ "runtime": "***", "synchronizer": "***", "udca": "***". }
Ersetzen Sie
"***"
in jedem Paar durch den Inhalt der JSON-Datei für das Google-Dienstkonto, das der Apigee-Komponente entspricht.apigee-cassandra-backup
undapigee-cassandra-restore
verwenden beide das Dienstkontoapigee-cassandra
. Beispiel:{ "cassandraBackup": "{ "type": "service_account", "project_id": "myhybridorg", "private_key_id": "PRIVATE_KEY_ID", "private_key": "-----BEGIN PRIVATE KEY-----\nPRIVATE_KEY_TEXT\n-----END PRIVATE KEY-----\n", "client_email": "apigee-cassandra@myhybridorg.iam.gserviceaccount.com", "client_id": "123456789012345678901", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/apigee-cassandra%40myhybridorg.iam.gserviceaccount.com", "universe_domain": "googleapis.com" }", "cassandraRestore":... ... }
- Gewähren Sie Zugriff auf das Organisations-Secret. Erstellen Sie eine Textdatei mit dem Namen „orgsakeys-auth-policy.txt“ und folgendem Inhalt:
path "secret/data/apigee/orgsakeys" { capabilities = ["read"] }
-
Erstellen Sie in Vault eine Richtlinie, die Zugriff auf das Organisations-Secret gewährt:
vault policy write apigee-orgsakeys-auth orgsakeys-auth-policy.txt
-
Erstellen Sie für jede Umgebung eine Textdatei mit dem Namen
envsakeys-ENV_NAME-auth-policy.txt
und folgendem Inhalt:path "secret/data/apigee/envsakeys-ENV_NAME" { capabilities = ["read"] }
Wiederholen Sie den Schritt für jede Umgebung:
-
Erstellen Sie in Vault eine Richtlinie, die Zugriff auf das Umgebung-Secret gewährt:
vault policy write apigee-envsakeys-ENV_NAME-auth envsakeys-ENV_NAME-auth-policy.txt
Wiederholen Sie den Schritt für jede Umgebung:
-
Erstellen Sie ein Script mit dem Namen
generate-encoded-sas.sh
und mit folgendem Inhalt:# generate-encoded-sas.sh ORG=$APIGEE_ORG # Apigee organization name ENVS=$APIGEE_ENV_LIST # comma separated env names, for example: dev,prod ORG_SHORT_NAME=$(echo $ORG | head -c 15) ENCODE=$(echo -n $ORG | shasum -a 256 | head -c 7) ORG_ENCODE=$(echo "$ORG_SHORT_NAME-$ENCODE") NAMES=apigee-manager,apigee-cassandra-default,apigee-cassandra-backup-sa,apigee-cassandra-restore-sa,apigee-cassandra-schema-setup-${ORG_ENCODE},apigee-cassandra-schema-val-${ORG_ENCODE},apigee-cassandra-user-setup-${ORG_ENCODE},apigee-mart-${ORG_ENCODE},apigee-mint-task-scheduler-${ORG_ENCODE},apigee-connect-agent-${ORG_ENCODE},apigee-watcher-${ORG_ENCODE},apigee-udca-${ORG_ENCODE},apigee-metrics-apigee-telemetry,apigee-open-telemetry-collector-apigee-telemetry,apigee-logger-apigee-telemetry for ENV in ${ENVS//,/ } do ENV_SHORT_NAME=$(echo $ENV | head -c 15) ENCODE=$(echo -n $ORG:$ENV | shasum -a 256 | head -c 7) ENV_ENCODE=$(echo "$ORG_SHORT_NAME-$ENV_SHORT_NAME-$ENCODE") NAMES+=,apigee-synchronizer-${ENV_ENCODE},apigee-runtime-${ENV_ENCODE} done echo $NAMES
-
Führen Sie das Skript aus, um die Liste der Dienstkontonamen zu generieren und die Richtlinie an folgende zu binden:
./generate-encoded-sas.sh
Die Ausgabe sollte eine durch Kommas getrennte Liste von Kubernetes-Dienstkontonamen sein, ähnlich dem folgenden Beispiel:
./generate-encoded-sas.sh
apigee-manager,apigee-cassandra-default,apigee-cassandra-backup-sa, apigee-cassandra-restore-sa,apigee-cassandra-schema-setup-myhybrido rg-5b044c1,apigee-cassandra-schema-val-myhybridorg-5b044c1,apigee-c assandra-user-setup-myhybridorg-5b044c1,apigee-mart-myhybridorg-5b0 44c1,apigee-mint-task-scheduler-myhybridorg-5b044c1,apigee-connect- agent-myhybridorg-5b044c1,apigee-watcher-myhybridorg-5b044c1,apigee -udca-myhybridorg-5b044c1,apigee-metrics-apigee-telemetry,apigee-op en-telemetry-collector-apigee-telemetry,apigee-logger-apigee-teleme try,apigee-synchronizer-myhybridorg-dev-ee52aca,apigee-runtime-myhy bridorg-dev-ee52aca,apigee-synchronizer-myhybridorg-prod-2d0221c,ap igee-runtime-myhybridorg-prod-2d0221c -
Kopieren Sie den Ausgabetext in Listen und teilen Sie ihn auf: eine Liste für die org Dienstkontonamen und eine separate Liste für den env Dienstkontonamen für jede Umgebung. Die org-Dienstkonten stehen in der Ausgabeliste bis
apigee-logger-apigee-telemetry
an erster Stelle.org-Dienstnamen aus dem vorherigen Beispiel:
apigee-manager,apigee-cassandra-default,apigee-cassandra-backup-sa, apigee-cassandra-restore-sa,apigee-cassandra-schema-setup-myhybrido rg-5b044c1,apigee-cassandra-schema-val-myhybridorg-5b044c1,apigee-c assandra-user-setup-myhybridorg-5b044c1,apigee-mart-myhybridorg-5b0 44c1,apigee-mint-task-scheduler-myhybridorg-5b044c1,apigee-connect- agent-myhybridorg-5b044c1,apigee-watcher-myhybridorg-5b044c1,apigee -udca-myhybridorg-5b044c1,apigee-metrics-apigee-telemetry,apigee-op en-telemetry-collector-apigee-telemetry,apigee-logger-apigee-teleme try
Die Namen der env-Dienstkonten haben das Muster
apigee-synchronizer-ORG_NAME-ENV_NAME-HASH_TEXT
undapigee-runtime-ORG_NAME-ENV_NAME-HASH_TEXT
. Trennen Sie sie in separate Listen für jede Umgebung. Die Ausgabe aus dem vorherigen Beispiel kann beispielsweise in die folgenden beiden Listen unterteilt werden:dev
Umgebung:apigee-synchronizer-myhybridorg-dev-ee52aca,apigee-runtime-myhybrid org-dev-ee52aca
prod
Umgebung:apigee-synchronizer-myhybridorg-prod-2d0221c,apigee-runtime-myhybri dorg-prod-2d0221c
-
Erstellen Sie mit der Richtlinie eine Vault-Rolle, die die organisationsspezifischen Apigee-Dienstkonten bindet:
vault write auth/kubernetes/role/apigee-orgsakeys \ bound_service_account_names=LIST_OF_ORG_SA_NAMES \ bound_service_account_namespaces=apigee \ policies=apigee-orgsakeys-auth \ ttl=1m
-
Erstellen Sie für jede Umgebung eine Vault-Rolle für die Dienstkontoschlüssel:
vault write auth/kubernetes/role/apigee-envsakeys-ENV_NAME \ bound_service_account_names=LIST_OF_ENV_NAME_SA_NAMES \ bound_service_account_namespaces=apigee \ policies=apigee-envsakeys-ENV_NAME-auth \ ttl=1m
Wiederholen Sie diesen Schritt für jede Umgebung.
SecretProviderClass
-Objekte erstellen
Die Ressource SecretProviderClass
teilt dem CSI-Treiber mit, mit welchem Anbieter beim Anfordern von Secrets kommuniziert werden soll. Die Dienstkontoschlüssel müssen über dieses Objekt konfiguriert werden. Die folgende Tabelle zeigt die von Apigee Hybrid erwarteten Dateinamen (objectNames
):
Dienstkonto | Erwartete Namen der Secret-Dateien |
---|---|
Cassandra-Sicherung | cassandraBackup |
Cassandra-Wiederherstellung | cassandraRestore |
Connect-Agent | connectAgent |
Logger | logger |
MART | mart |
Messwerte | metrics |
Monetarisierung (bei Verwendung der Monetarisierung für Apigee Hybrid) |
mint |
Laufzeit | runtime |
Synchronizer | synchronizer |
UDCA | udca |
Watcher | watcher |
-
Verwenden Sie die folgende
SecretProviderClass
-Vorlage, um diese Ressource für die organisationsspezifischen Secrets zu konfigurieren:apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: apigee-orgsakeys-spc spec: provider: vault parameters: roleName: apigee-orgsakeys vaultAddress: VAULT_ADDRESS # "objectName" is an alias used within the SecretProviderClass to reference # that specific secret. This will also be the filename containing the secret. # Apigee Hybrid expects these exact values so they must not be changed. # "secretPath" is the path in Vault where the secret should be retrieved. # "secretKey" is the key within the Vault secret response to extract a value from. objects: | - objectName: "cassandraBackup" secretPath: "" secretKey: "" - objectName: "cassandraRestore" secretPath: "" secretKey: "" - objectName: "connectAgent" secretPath: "" secretKey: "" - objectName: "logger" secretPath: "" secretKey: "" - objectName: "mart" secretPath: "" secretKey: "" - objectName: "metrics" secretPath: "" secretKey: "" - objectName: "mint" secretPath: "" secretKey: "" - objectName: "udca" secretPath: "" secretKey: "" - objectName: "watcher" secretPath: "" secretKey: ""
VAULT_ADDRESS ist der Endpunkt, auf dem Ihr Vault-Server ausgeführt wird. Wenn Vault im selben Cluster wie Apigee ausgeführt wird, ist das Format in der Regel
http://vault.APIGEE_NAMESPACE.svc.cluster.local:VAULT_SERVICE_PORT
.Speichern Sie die Vorlage in einer Datei mit dem Namen
spc-org.yaml
. -
Wenden Sie die organisationsspezifische
SecretProviderClass
auf Ihren Apigee-Namespace an:kubectl -n APIGEE_NAMESPACE apply -f spc-org.yaml
-
Verwenden Sie für jede Umgebung die folgende
SecretProviderClass
-Vorlage, um diese Ressource für die umgebungsspezifischen Secrets zu konfigurieren. Wiederholen Sie diesen Schritt für jede Umgebung.apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: apigee-envsakeys-ENV_NAME-spc spec: provider: vault parameters: roleName: apigee-envsakeys-ENV_NAME vaultAddress: VAULT_ADDRESS # "objectName" is an alias used within the SecretProviderClass to reference # that specific secret. This will also be the filename containing the secret. # Apigee Hybrid expects these exact values so they must not be changed. # "secretPath" is the path in Vault where the secret should be retrieved. # "secretKey" is the key within the Vault secret response to extract a value from. objects: | - objectName: "runtime" secretPath: "" secretKey: "" - objectName: "synchronizer" secretPath: "" secretKey: "" - objectName: "udca" secretPath: "" secretKey: ""
VAULT_ADDRESS ist der Endpunkt, auf dem Ihr Vault-Server ausgeführt wird. Wenn Vault im selben Cluster und Namespace wie Apigee ausgeführt wird, ist das Format in der Regel
http://vault.APIGEE_NAMESPACE.svc.cluster.local:VAULT_SERVICE_PORT
.Speichern Sie die Vorlage in einer Datei mit dem Namen
spc-env-ENV_NAME.yaml
. -
Wenden Sie für jede Umgebung die umgebungsspezifische
SecretProviderClass
auf Ihren Apigee-Namespace an:kubectl -n APIGEE_NAMESPACE apply -f spc-env-ENV_NAME.yaml
Wiederholen Sie diesen Schritt für jede Umgebung.
Externe Secrets für Google-Dienstkonten aktivieren
-
Fügen Sie in der Überschreibungendatei die Konfigurationseigenschaften
serviceAccountSecretProviderClass
undenvs[].serviceAccountSecretProviderClass
hinzu, um die Verwendung externer Secrets für Google-Dienstkonten zu aktivieren. Sie können die KonfigurationsattributeserviceAccountPath
undserviceAccountPaths
entfernen oder auskommentieren:serviceAccountSecretProviderClass: apigee-orgsakeys-spc envs: - name: ENV_NAME serviceAccountSecretProviderClass: apigee-envsakeys-ENV_NAME-spc
-
Wenden Sie jedes Helm-Diagramm an:
helm upgrade datastore apigee-datastore/ \ --install \ --namespace APIGEE_NAMESPACE \ --atomic \ -f overrides.yaml
helm upgrade telemetry apigee-telemetry/ \ --install \ --namespace APIGEE_NAMESPACE \ --atomic \ -f overrides.yaml
helm upgrade redis apigee-redis/ \ --install \ --namespace APIGEE_NAMESPACE \ --atomic \ -f overrides.yaml
helm upgrade ORG_NAME apigee-org/ \ --install \ --namespace APIGEE_NAMESPACE \ --atomic \ -f overrides.yaml
-
Wenden Sie das
apigee-env
-Diagramm für jede Umgebung an:helm upgrade ENV_NAME apigee-env/ \ --install \ --namespace APIGEE_NAMESPACE \ --set env=ENV_NAME \ --atomic \ -f overrides.yaml
Rollback zur Verwendung von Zertifikatsdateien des Dienstkontos
Wenn Sie ein Rollback zur Verwendung gespeicherter Zertifikatsdateien des Google-Dienstkontos durchführen müssen, gehen Sie so vor:
-
Aktualisieren Sie die Überschreibungsdatei:
-
Entfernen Sie die Zeilen
serviceAccountSecretProviderClass
undenvs:serviceAccountSecretProviderClass
oder kommentieren Sie sie aus. -
Fügen Sie die Konfigurationseigenschaften
serviceAccountPath
undserviceAccountPaths
mit den Pfaden zu den entsprechenden Dienstkonten hinzu.
Beispiel:
# serviceAccountSecretProviderClass: apigee-orgsakeys-spc - (commented out) cassandra: backup: serviceAccountPath: service-accounts/myhybridorg-apigee-cassandra.json restore: serviceAccountPath: service-accounts/myhybridorg-apigee-cassandra.json connectAgent: serviceAccountPath: service-accounts/myhybridorg-apigee-mart.json envs: - name: test # serviceAccountSecretProviderClass: apigee-envsakeys-spc - (commented out) serviceAccountPaths: runtime: service-accounts/myhybridorg-apigee-runtime.json synchronizer: service-accounts/myhybridorg-apigee-synchronizer.json logger: serviceAccountPath: service-accounts/myhybridorg-apigee-logger.json mart: serviceAccountPath: service-accounts/myhybridorg-apigee-mart.json metrics: serviceAccountPath: service-accounts/myhybridorg-apigee-metrics.json udca: serviceAccountPath: service-accounts/myhybridorg-apigee-udca.json mint: # Required if using Monetization for Apigee hybrid (v1.14.3 and later) serviceAccountPath: service-accounts/myhybridorg-apigee-mint-task-scheduler.json watcher: serviceAccountPath: service-accounts/myhybridorg-apigee-watcher.json
-
Entfernen Sie die Zeilen
-
Wenden Sie jedes Helm-Diagramm an:
helm upgrade datastore apigee-datastore/ \ --install \ --namespace APIGEE_NAMESPACE \ --atomic \ -f overrides.yaml
helm upgrade telemetry apigee-telemetry/ \ --install \ --namespace APIGEE_NAMESPACE \ --atomic \ -f overrides.yaml
helm upgrade redis apigee-redis/ \ --install \ --namespace APIGEE_NAMESPACE \ --atomic \ -f overrides.yaml
helm upgrade ORG_NAME apigee-org/ \ --install \ --namespace APIGEE_NAMESPACE \ --atomic \ -f overrides.yaml
-
Wenden Sie das
apigee-env
-Diagramm für jede Umgebung an:helm upgrade ENV_NAME apigee-env/ \ --install \ --namespace APIGEE_NAMESPACE \ --set env=ENV_NAME \ --atomic \ -f overrides.yaml
Wiederholen Sie diesen Schritt für jede Umgebung.