Sichere Geheimnisse für Apps mit Vault Dedicated und dem External Secrets Operator

In diesem Tutorial erfahren Sie, wie Sie mit IBM Cloud und Vault Enterprise Geheimnisse für Anwendungen verwalten, die in Ihrem IBM Cloud Kubernetes Service-Cluster ausgeführt werden, und zwar mithilfe des Open-Source-Tools External Secrets Operator.

Sie sind Entwickler in einem Unternehmen, und Ihr Team nutzt Kubernetes Service, um containerisierte Anwendungen und Dienste auf IBM Cloud bereitzustellen. Sie möchten Ihre Anwendungsgeheimnisse in Vault Dedicated speichern, dem von IBM Cloud verwalteten HashiCorp Vault-Dienst, wo Sie diese im Ruhezustand verschlüsseln, ihren Lebenszyklus verwalten und sie problemlos rotieren lassen können.

Mit Vault Dedicated und dem External Secrets Operator können Sie die Geheimnisse, die von den in Ihren Kubernetes-Clustern ausgeführten Anwendungen verwendet werden, zentral verwalten und sichern. Anstatt Ihre Geheimnisse zum Zeitpunkt der Bereitstellung einzubinden, können Sie Ihre Anwendungen so konfigurieren, dass sie Geheimnisse zur Laufzeit sicher aus Vault Dedicated abrufen. Nehmen Sie beispielsweise folgendes Szenario an:

Das Diagramm zeigt den grundlegenden Ablauf zwischen Secrets Manager und Ihrem Kubernetes-Cluster. Ablauf" caption-side="bottom"}{: caption="externer Geheimnisse

  1. Als Entwickler nutzen Sie Vault Dedicated, um ein Geheimnis für eine Anwendung zu speichern, die Sie in einem Kubernetes-Cluster bereitstellen möchten.
  2. Sie konfigurieren den External Secrets Operator so, dass er über den HashiCorp Vault-Anbieter eine Verbindung zu Ihrer Vault Dedicated-Instanz herstellt.
  3. Der Controller für externe geheime Schlüssel ruft die ExternalSecrets-Objekte in der Konfigurationsdatei ab, die Sie mithilfe der Kubernetes-API definiert haben.
  4. Zur Laufzeit der Anwendung ruft der Controller die geheimen Daten aus Vault Dedicated ab und wandelt die Objekte ExternalSecrets in Kubernetes-Geheimnisse für Ihren Cluster um.

Dieses Szenario verfügt über ein Tool eines anderen Anbieters, das sich auf die Konformitätsbereitschaft von Workloads auswirken kann, die in Ihrem Kubernetes-Cluster ausgeführt werden. Wenn Sie ein Community-Tool oder ein Tool eines Drittanbieters hinzufügen, beachten Sie bitte, dass Sie für die Einhaltung der Compliance-Vorgaben Ihrer Anwendungen verantwortlich sind und bei der Behebung etwaiger Probleme mit dem jeweiligen Anbieter zusammenarbeiten müssen. Weitere Informationen finden Sie im Abschnitt Ihre Verantwortlichkeiten bei der Verwendung von IBM Cloud Kubernetes Service.

Vorbereitende Schritte

Stellen Sie vor dem ersten Start sicher, dass Sie über den Administrator-Plattformzugriff verfügen, damit Sie Kontoberechtigungsnachweise und Einrichtungsressourcen erstellen können. Außerdem müssen die folgenden Voraussetzungen erfüllt sein:

jq unterstützt Sie beim Ausschneiden und Filtern von JSON-Daten. Sie verwenden jq in diesem Lernprogramm, um gespeicherte Umgebungsvariablen zu erfassen und zu verwenden.

Umgebung einrichten

Um mit Vault Dedicated und Kubernetes Service arbeiten zu können, müssen Sie einen Cluster in Ihrem IBM Cloud-Konto erstellen und den Zugriff auf Ihre Vault Dedicated-Instanz konfigurieren.

Kubernetes-Cluster erstellen

Erstellen Sie einen Kubernetes-Cluster in Ihrem IBM Cloud-Konto.

  1. Melden Sie sich in der Befehlszeile bei IBM Cloud über die IBM Cloud-CLI an.

    ibmcloud login
    

    Wenn die Anmeldung fehlschlägt, führen Sie den Befehl ibmcloud login --sso aus, um es erneut zu versuchen. Der Parameter --sso ist erforderlich, wenn Sie sich mit einer föderierten ID anmelden. Wenn diese Option verwendet wird, rufen Sie den Link auf, der in der Ausgabe der Befehlszeilenschnittstelle aufgelistet ist, um einen einmalig verwendbaren Kenncode zu generieren.

  2. Wählen Sie das Konto, die Region und die Ressourcengruppe aus, in der Sie Ihren Cluster erstellen möchten.

    ibmcloud target -r REGION -g RESOURCE_GROUP
    

    Ersetzen Sie durch REGION Ihre Zielregion (zum Beispiel au-syd) und RESOURCE_GROUP durch den Namen Ihrer Ressourcengruppe.

  3. Erstellen Sie einen Kubernetes-Cluster.

    ibmcloud ks cluster create vpc-gen2 --zone ZONE --flavor FLAVOR --workers 1 --name eso-test-cluster --vpc-id VPC_ID --subnet-id SUBNET_ID
    

    Ersetzen Sie ZONE, FLAVOR, VPC_ID, und SUBNET_ID durch Ihre Werte. Die Bereitstellung Ihres Kubernetes-Clusters dauert 5 bis 15 Minuten.

  4. Bevor Sie mit dem nächsten Schritt fortfahren, vergewissern Sie sich, dass Ihr Cluster erfolgreich bereitgestellt wurde.

    ibmcloud ks worker ls --cluster eso-test-cluster
    

    Wenn Einrichtung Ihres Workerknotens abgeschlossen ist, ändert sich der Status in Bereit.

  5. Legen Sie den Kontext für Ihren Kubernetes-Cluster in der Befehlszeilenschnittstelle fest.

    ibmcloud ks cluster config --cluster eso-test-cluster
    
  6. Überprüfen Sie, ob kubectl-Befehle ordnungsgemäß ausgeführt werden und ob der Kubernetes-Kontext auf Ihren Cluster gesetzt ist.

    kubectl config current-context
    

Bereiten Sie Ihre Vault Dedicated-Instanz vor

Konfigurieren Sie Ihre Vault Dedicated-Instanz, um mit Geheimnissen zu arbeiten, und richten Sie die Authentifizierung für den External Secrets Operator ein.

  1. Exportieren Sie Umgebungsvariablen mit den Details Ihrer Vault Dedicated-Instanz.

    export VAULT_DEDICATED_ADDR="https://<your-vault_dedicated-instance-id>.vault.<region>.appdomain.cloud"
    export VAULT_DEDICATED_NAMESPACE="admin"
    

    Ersetzen Sie <your-vault_dedicated-instance-id> durch die ID Ihrer Vault Dedicated-Instanz und <region> durch Ihre Vault Dedicated-Region (zum Beispiel au-syd).

  2. Beziehen Sie ein Vault-Token von Ihrer Vault Dedicated-Instanz.

    Sie können ein Token über die Benutzeroberfläche von Vault Dedicated oder mithilfe der Vault-CLI generieren. Für Entwicklungs- und Testzwecke können Sie ein Root-Token verwenden. Erstellen Sie für die Produktionsumgebung ein Token mit entsprechenden Richtlinien.

    export VAULT_TOKEN="<your-vault-token>"
    
  3. Überprüfen Sie den Einhängepunkt der KV-Secrets-Engine in Vault Dedicated.

    Bei dedizierten Vault-Instanzen ist die KV- v2-Secrets-Engine kv/ standardmäßig unter eingebunden. Sie können dies in der Benutzeroberfläche von Vault Dedicated überprüfen oder durch Auflisten der Einbindungen.

    curl -k -X GET \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      $VAULT_DEDICATED_ADDR/v1/sys/mounts | jq
    
  4. Erstellen Sie ein Testgeheimnis in Vault Dedicated.

    curl -k -X POST \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      -d '{"data":{"username":"user123","password":"cloudy-rainy-coffee-book"}}' \
      $VAULT_DEDICATED_ADDR/v1/kv/data/example_username_password
    

    Beachten Sie, dass Vault Dedicated kv/ als Einhängepfad für die KV-Secrets-Engine verwendet.

  5. Überprüfen Sie, ob das Geheimnis erstellt wurde.

    curl -k -X GET \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      $VAULT_DEDICATED_ADDR/v1/kv/data/example_username_password | jq
    

External Secrets Operator installieren

Installieren Sie den External Secrets Operator mithilfe von Helm.

  1. Fügen Sie das Repository External Secrets Helm hinzu.

    helm repo add external-secrets https://charts.external-secrets.io
    helm repo update
    
  2. Installieren Sie den External Secrets Operator.

    helm install external-secrets \
      external-secrets/external-secrets \
      --namespace external-secrets \
      --create-namespace \
      --set installCRDs=true
    
  3. Überprüfen Sie die Installation.

    kubectl get pods -n external-secrets
    

    Warten Sie, bis sich alle Pods im Status Running befinden.

  4. Stellen Sie sicher, dass die Custom Resource Definitions (CRDs) installiert sind.

    kubectl get crd | grep external-secrets
    

    Sie sollten CRDs wie secretstores, clustersecretstores, und sehen externalsecrets.

SecretStore für Vault Dedicated konfigurieren

Erstellen Sie eine Ressource SecretStore, die beschreibt, wie der External Secrets Operator eine Verbindung zu Ihrer Vault Dedicated-Instanz herstellt.

  1. Erstellen Sie mit Ihrem Vault-Token einen Kubernetes-Secret.

    kubectl create secret generic vault-token \
      --namespace external-secrets \
      --from-literal=token="$VAULT_TOKEN"
    
  2. Erstellen Sie eine secretstore.yaml-Datei.

    touch secretstore.yaml
    
  3. Fügen Sie die folgende Konfiguration in die Datei ein.

    apiVersion: external-secrets.io/v1beta1
    kind: SecretStore
    metadata:
      name: vault-dedicated-secretstore
      namespace: default
    spec:
      provider:
        vault:
          server: "<VAULT_DEDICATED_ADDR>"
          path: "kv"
          version: "v2"
          namespace: "admin"
          auth:
            tokenSecretRef:
              name: "vault-token"
              key: "token"
              namespace: "external-secrets"
    

    Ersetzen Sie <VAULT_DEDICATED_ADDR> durch die Adresse Ihrer Vault Dedicated-Instanz. Beachten Sie, dass auf gesetzt ist path``kv, was dem Standard-Einhängepunkt für die KV-Secrets-Engine in Vault Dedicated entspricht.

  4. Wenden Sie die Konfiguration SecretStore an.

    kubectl apply -f secretstore.yaml
    
  5. Überprüfen Sie, ob der SecretStore gültig ist.

    kubectl get secretstore vault-dedicated-secretstore -n default
    kubectl describe secretstore vault-dedicated-secretstore -n default
    

    Der Status sollte Gültig anzeigen, wenn die Verbindung zu Vault Dedicated erfolgreich hergestellt wurde.

Erstellen Sie eine ExternalSecret

Erstellen Sie eine Ressource ExternalSecret, die festlegt, welche Geheimnisse aus Vault Dedicated abgerufen werden sollen.

  1. Erstellen Sie eine Datei externalsecret.yaml.

    touch externalsecret.yaml
    
  2. Fügen Sie die folgende Konfiguration hinzu.

    apiVersion: external-secrets.io/v1beta1
    kind: ExternalSecret
    metadata:
      name: vault-dedicated-app-secret
      namespace: default
    spec:
      refreshInterval: 1h
      secretStoreRef:
        name: vault-dedicated-secretstore
        kind: SecretStore
      target:
        name: my-k8s-secret
        creationPolicy: Owner
      data:
      - secretKey: username
        remoteRef:
          key: example_username_password
          property: username
      - secretKey: password
        remoteRef:
          key: example_username_password
          property: password
    

    Der legt refreshInterval fest, wie oft der External Secrets Operator Vault Dedicated nach Aktualisierungen abfragt. Der Standardwert und empfohlene Wert beträgt 1 Stunde.

  3. Wenden Sie die Konfiguration ExternalSecret an.

    kubectl apply -f externalsecret.yaml
    
  4. Stellen Sie sicher, dass der External Secrets Operator das Geheimnis aus Vault Dedicated abgerufen hat.

    kubectl get secret my-k8s-secret -o json | jq '.data | map_values(@base64d)'
    

    Beispielausgabe:

    {
        "password": "cloudy-rainy-coffee-book",
        "username": "user123"
    }
    

    Erfolgreich! Sie können nun vertrauliche Daten aus Ihrer Vault Dedicated-Instanz abrufen und in Ihrem Kubernetes-Cluster verwenden.

App für den Cluster implementieren

Schließlich können Sie in Ihrem Cluster eine Anwendung bereitstellen, die das Vault Dedicated Secret verwendet. Zur Laufzeit der Anwendung werden die aus Vault Dedicated abgerufenen geheimen Daten in ein Kubernetes-Geheimnis umgewandelt, das von Ihrem Cluster verwendet werden kann.

  1. Erstellen Sie eine einfache Testbereitstellung, die das Geheimnis verwendet.

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: test-app
      namespace: default
    spec:
      containers:
      - name: app
        image: busybox
        command: ['sh', '-c', 'echo "Username: \$USERNAME"; echo "Password: \$PASSWORD"; sleep 3600']
        env:
        - name: USERNAME
          valueFrom:
            secretKeyRef:
              name: my-k8s-secret
              key: username
        - name: PASSWORD
          valueFrom:
            secretKeyRef:
              name: my-k8s-secret
              key: password
    EOF
    
  2. Überprüfen Sie die Pod-Protokolle, um sicherzustellen, dass das Secret eingefügt wurde.

    kubectl logs test-app -n default
    

    Erwartete Ausgabe:

    Username: user123
    Password: cloudy-rainy-coffee-book
    

Suchen Sie nach weiteren Beispielen zur Bereitstellung einer App? Lesen Sie den Artikel Bereitstellung von Kubernetes-nativen Apps in Clustern, um mehr über die Bereitstellung von Anwendungen zu erfahren.

(Optional) Ressourcen bereinigen

Wenn Sie die Ressourcen, die Sie in diesem Lernprogramm erstellt haben, nicht mehr benötigen, können Sie die folgenden Schritte ausführen, um sie aus Ihrem Konto zu entfernen.

  1. Löschen Sie den Test Kubernetes-Cluster.

    ibmcloud ks cluster rm --cluster eso-test-cluster
    
  2. Test-Geheimnisse in einem dedizierten Vault bereinigen.

    curl -k -X DELETE \
      -H "X-Vault-Token: $VAULT_TOKEN" \
      -H "X-Vault-Namespace: $VAULT_DEDICATED_NAMESPACE" \
      $VAULT_DEDICATED_ADDR/v1/kv/metadata/example_username_password
    

Wichtige Hinweise

Beachten Sie beim Erstellen Ihrer YAML-Dokumente bitte die folgenden Punkte:

  1. Abfrageintervall: Standardmäßig ist das Abfrageintervall auf 1 Stunde eingestellt und stellt den bevorzugten Wert dar.refreshInterval: 1h Sie können diesen Wert in der Vorlage ExternalSecret ändern. Das Intervall kann in den Einheiten s, m, oder ausgedrückt werden h.

  2. Vault Dedicated-Einbindungspfad: Vault Dedicated verwendet kv/ als Standard-Einbindungspfad für die KV-Secrets-Engine, nicht secret/. Stellen Sie sicher, dass Sie in Ihrer Konfiguration unter SecretStore den richtigen Pfad angeben.

  3. Vault Dedicated-Namespaces: Vault Dedicated verwendet Vault Enterprise-Namespaces. Der Standard-Namespace lautet admin. Stellen Sie sicher, dass Sie in Ihrer SecretStore-Konfiguration den richtigen Namespace angeben.

  4. Authentifizierungsmethoden: In diesem Tutorial wird der Einfachheit halber die Token-Authentifizierung verwendet. In Produktionsumgebungen sollten Sie zur Erhöhung der Sicherheit die Authentifizierungsmethoden AppRole oder Kubernetes in Betracht ziehen.

  5. TLS Zu beachten: Für Vault Dedicated sind TLS-Verbindungen erforderlich. Stellen Sie in Produktionsumgebungen sicher, dass eine ordnungsgemäße Zertifikatsvalidierung konfiguriert ist, anstatt … zu verwenden skipTLSVerify.

Nächste Schritte

Gut gemacht! In diesem Tutorial haben Sie gelernt, wie Sie Vault Dedicated einrichten, um Anwendungsgeheimnisse mithilfe des External Secrets Operator sicher in Ihren Kubernetes-Cluster einzuspielen. Sehen Sie sich weitere Ressourcen an, die Ihnen den Einstieg in Vault Dedicated erleichtern.