Zertifikatbasierten Zugriff für die Identitätsföderation von Arbeitslasten konfigurieren

In diesem Dokument wird beschrieben, wie Sie den zertifikatbasierten Zugriff für die Workload Identity-Föderation mit X.509-Zertifikaten konfigurieren.

Beim zertifikatsbasierten Zugriff wird Mutual TLS (mTLS) verwendet, um sowohl den Client als auch den Server während eines TLS-Handshakes zu authentifizieren. Bei diesem Prozess werden in eine mTLS-Bindung Richtlinien auf Grundlage des Transportkontexts aufgenommen und der Status des Clientzertifikats in der TLS-Sitzung verwendet, um Autorisierungsentscheidungen zu treffen.

Bei der X.509-Identitätsföderation von Arbeitslasten sorgt eine mTLS-Bindung dafür, dass der gesamte Authentifizierungsablauf sicher an eine vertrauenswürdige Arbeitslast gebunden ist. Dadurch wird das Risiko eines Diebstahls von Anmeldedaten verringert, da die Authentifizierung an einen bestimmten, vertrauenswürdigen Endpunkt gebunden ist.

Übersicht über den zertifikatbasierten Zugriff für die Konfiguration der Workload Identity-Föderation

Im Folgenden finden Sie einen allgemeinen Überblick über den Prozess zum Konfigurieren des zertifikatbasierten Zugriffs für die Identitätsföderation von Arbeitslasten:

  1. Richten Sie eine Workload Identity-Föderation ein, indem Sie das Vertrauen mit dem Vertrauensanker der X.509-Zertifikate konfigurieren.

  2. Erstellen Sie eine Zugriffsebene für den zertifikatbasierten Zugriff.

  3. Fügen Sie die Zugriffsebene einer Richtlinie für den kontextsensitiven Zugriff hinzu, die die mTLS-Bindung erzwingt.

Hinweise

Prüfen Sie, ob die folgenden Voraussetzungen erfüllt sind:

  • Die neueste Version der Google Cloud CLI

    Führen Sie den folgenden Befehl aus, um auf die neueste Version der Google Cloud CLI zu aktualisieren:

    gcloud components update
    

    Informationen zur Installation der Google Cloud CLI finden Sie unter Google Cloud CLI installieren.

  • Eine Konfiguration für die Workload Identity-Föderation, die den Vertrauensanker Ihrer X.509-Zertifikate verwendet

  • Wenn Sie dieses Feature verwenden möchten, füllen Sie das folgende Formular aus, um auf die Zulassungsliste gesetzt zu werden: Formular für die Zulassungsliste. Sie werden benachrichtigt, sobald Sie auf die Zulassungsliste gesetzt wurden.

Zugriffsebene für Zertifikate erstellen

  1. Erstellen Sie eine mTLS-Zugriffsebene. Bei der mTLS-Zugriffsebene werden Zertifikate validiert, wenn der Zugriff auf Ressourcen bestimmt wird.

    Console

    Erstellen Sie in Access Context Manager eine benutzerdefinierte Zugriffsebene und geben Sie den folgenden Ausdruck in das Feld für CEL-Ausdrücke ein: request.auth.matchesMtlsTokens(origin) == true.

    gcloud

    Führen Sie den folgenden Befehl aus, um eine benutzerdefinierte Zugriffsebene zu erstellen:

       gcloud access-context-manager levels create ACCESS_LEVEL_NAME 
    --title=TITLE
    --custom-level-spec=FILE
    --description=DESCRIPTION
    --policy=POLICY_NAME

    Ersetzen Sie Folgendes:

    • ACCESS_LEVEL_NAME: der Name der Zugriffsebene.
    • TITLE: Der Titel der Zugriffsebene.
    • FILE: Eine YAML-Datei mit dem folgenden Inhalt: request.auth.matchesMtlsTokens(origin) == true.
    • DESCRIPTION: Eine Beschreibung der Zugriffsebene.
    • POLICY_NAME: Der Name der Zugriffsrichtlinie.
  2. Exportieren Sie die erstellte Zugriffsebene in eine Umgebungsvariable. Diese Variable wird in den folgenden Schritten verwendet.

      export ACCESS_LEVEL_ID=ACCESS_LEVEL_ID
      

    Ersetzen Sie ACCESS_LEVEL_ID durch den Namen der Zugriffsebene, z. B. accessPolicies/12345/accessLevels/acl_1.

Bindung für kontextsensitiven Zugriff für einen Workload Identity-Pool erstellen

  1. Legen Sie die folgenden Umgebungsvariablen fest:

    export ORG_ID=ORG_ID
    export CALLER_PROJECT_ID=CALLER_PROJECT_ID
    export FEDERATED_PRINCIPAL=FEDERATED_PRINCIPAL
    

    Ersetzen Sie Folgendes:

    • ORG_ID: ID Ihrer Organisation.
    • CALLER_PROJECT_ID: Die ID des Projekts, das zum Aufrufen der APIs verwendet werden soll.
    • FEDERATED_PRINCIPAL: Der Name des Identitätshauptkontos im Workload Identity-Pool, das der richtlinienbasierten Zugriffsrichtlinie entspricht. Sie haben die folgenden Möglichkeiten:

      eine einzelne Identität mit dem Format – principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUE

      ODER

      Alle Identitäten in einem Pool mit dem Format – principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*

    gcloud

    gcloud alpha access-context-manager cloud-bindings create \
    --organization=ORG_ID \
    --federated-principal=FEDERATED_PRINCIPAL \
    --level=ACCESS_LEVEL_ID
    --dry-run-level=DRY_RUN_ACCESS_LEVEL_ID
    

    Ersetzen Sie Folgendes:

    • ACCESS_LEVEL_ID: der Name der Zugriffsebene.
    • DRY_RUN_ACCESS_LEVEL_ID: der Name der Zugriffsebene für den Probebetrieb. Wir empfehlen, zuerst eine Richtlinienbindung für den Probelauf zu aktivieren, um die potenziellen Auswirkungen auf den vorhandenen Traffic zu ermitteln.

    curl

    1. Erstellen Sie eine JSON-Datei mit der kontextsensitiven Zugriffsberechtigungsbindung.

      Sie können in einer Anfrage nur eine Zugriffsebene angeben, auch wenn das Feld wiederholt wird. Sie können die folgenden Arten von föderierten Identitäten verwenden:

      • Einzelne Identität: principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUE
      • Alle Identitäten in einem Pool: principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*
      echo { \
        \"principal\": { \
          \"federatedPrincipal\": \"${FEDERATED_PRINCIPAL:?}\" \
        },\
        \"accessLevels\": [\"${ACCESS_LEVEL_ID:?}\"] \
      } \
      >> request.json
      
    2. Verwenden Sie curl, um die folgende HTTP-Anfrage zu senden.

      curl -H "X-Goog-User-Project: ${CALLER_PROJECT_ID:?}" -X POST \
         -H "Authorization: Bearer $(gcloud auth print-access-token)" \
         -H "Content-Type: application/json; charset=utf-8" \
         -d @request.json \
       "https://accesscontextmanager.googleapis.com/v1alpha/organizations/${ORG_ID:?}/gcpUserAccessBindings"
      

Autorisierung mit den Google Cloud Clientbibliotheken

Führen Sie die folgenden Schritte aus, um Arbeitslasten der Mitarbeiteridentitätsföderation mit denGoogle Cloud -Clientbibliotheken zu autorisieren.

  1. Erstellen Sie eine ADC-Datei (Standardanmeldedaten für Anwendungen), die für die Authentifizierung mit der Mitarbeiteridentitätsföderation konfiguriert ist.

    gcloud iam workload-identity-pools create-cred-config IDENTITY_POOL_ID \
    --credential-cert-path WORKLOAD_CERTIFICATE_PATH \
    --credential-cert-private-key-path WORKLOAD_KEY_PATH \
    --output-file ADC_FILE_OUTPUT_PATH
    

    Ersetzen Sie Folgendes:

    • IDENTITY_POOL_ID: die ID Ihres Workload Identity-Pools.
    • WORKLOAD_CERTIFICATE_PATH: der Pfad zur Zertifikatsdatei Ihres Arbeitslast.
    • WORKLOAD_KEY_PATH: der Pfad zur privaten Schlüsseldatei Ihrer Arbeitslast.
    • ADC_FILE_OUTPUT_PATH: Der Ausgabepfad für die ADC-Datei.

    Mit diesem Befehl wird auch eine Zertifikatskonfigurationsdatei in Ihrem Standardkonfigurationsverzeichnis der gcloud CLI generiert. Die Zertifikatskonfigurationsdatei unterstützt die anfängliche Authentifizierung und richtet mTLS-Handshakes für nachfolgende Anfragen an Google Cloud -Ressourcen ein.

  2. Legen Sie eine Umgebungsvariable fest, die auf die ADC-Datei verweist. Dadurch können Ihre Anmeldedaten von Google-Clientbibliotheken gefunden werden.

    export GOOGLE_APPLICATION_CREDENTIALS=${application_default_credentials.json}
    

    Dieser Schritt ist optional, wenn Sie das Argument --output-file beim Generieren der ADC-Datei weglassen. Wenn Sie das Argument weglassen, wird die ADC-Datei in Ihrem Standardkonfigurationsverzeichnis der gcloud CLI erstellt und daraus gelesen.

  3. Führen Sie die folgenden Schritte aus, um den Zugriff auf die Google Cloud APIs einzurichten und zu testen. Sie können entweder Go oder Python verwenden.

    Go

    1. Verwenden Sie das folgende Beispiel, um eine Go-Datei wie golang_test.go zu erstellen.

      package golang_test
      
      import (
           "io"
           "log"
           "testing"
      
           "cloud.google.com/go/auth/credentials"
           "cloud.google.com/go/auth/httptransport"
      )
      
      func TestGoExample(t *testing.T) {
      
           scopes := []string{
                   "https://www.googleapis.com/auth/pubsub", // Scope for Pub/Sub access
                   // Add other scopes as needed
           }
      
           dopts := credentials.DetectOptions{
                   Scopes: scopes,
           }
      
           // Create httptransport.Options with the scopes
           opts := &httptransport.Options{
                   DetectOpts: &dopts,
           }
           hc, err := httptransport.NewClient(opts)
           if err != nil {
                   t.Fatalf("NewHTTPClient: %v", err)
           }
      
           resp, err := hc.Get("https://pubsub.mtls.googleapis.com/v1/projects/PROJECT_ID/topics")
           if err != nil {
                   t.Fatalf("Get: %v", err)
           }
           t.Logf("Status: %s", resp.Status)
      
           t.Cleanup(func() {
                  resp.Body.Close()
           })
      
           b, err := io.ReadAll(resp.Body)
           if err != nil {
                  t.Fatal(err)
           }
           log.Println(string(b))
      }
      

      Ersetzen Sie PROJECT_ID durch die ID Ihres gcloud CLI-Projekts.

    2. Verwenden Sie den folgenden Befehl, um einen Test auf einer Compute Engine-VM auszuführen.

    go mod init example.com
    go mod tidy
    go test -v golang_test.go --count=1
    

    Python

    1. Verwenden Sie das folgende Beispiel, um eine Testdatei wie python_test.py zu erstellen.

      import google.auth
      import google.auth.transport.requests
      import requests
      
      def test_go_example():
      # Define the required scopes for your application
      scopes = [
         "https://www.googleapis.com/auth/pubsub",  # Scope for Pub/Sub access
         # Add other scopes as needed
      ]
      
      # Obtain Application Default Credentials (ADC) with the specified scopes
      credentials, _ = google.auth.default(scopes=scopes)
      
      # Create an authorized HTTP session using the ADC credentials
      authed_session = google.auth.transport.requests.AuthorizedSession(credentials)
      
      try:
      # Make a GET request to the Pub/Sub API endpoint
      response = authed_session.get(
          "https://pubsub.mtls.googleapis.com/v1/projects/PROJECT_ID/topics"
      )
      
      # Check if the request was successful
      response.raise_for_status()  # Raise an exception for error statuses
      
      # Log the response status and content
      print(f"Status: {response.status_code}")
      print(response.text)
      
      except requests.exceptions.RequestException as e:
      print(f"Error making the request: {e}")
      
      if __name__ == "__main__":
      test_go_example()
      

      Ersetzen Sie PROJECT_ID durch Ihre gcloud CLI-Projekt-ID.

    2. Führen Sie die folgenden Schritte aus, um einen Test auf einer Compute Engine-VM auszuführen.

      1. Richten Sie eine virtuelle Python-Umgebung ein.
      2. Installieren Sie die erforderlichen Bibliotheken.

        pip install google-auth google-auth-httplib2 requests
        
      3. Test ausführen:

        python3 python_test.py
        

Mit einfachen HTTP-Anfragen autorisieren

Führen Sie die folgenden Schritte aus, um Arbeitslasten der Workforce Identity-Föderation mit einfachen HTTP-Anfragen zu autorisieren.

  1. Ein zertifikatsgebundenes Zugriffstoken vom Google Cloud Security Token Service über einen standardmäßigen mTLS-Handshake abrufen.

  2. Rufen Sie die Google Cloud -Dienste mit dem Zugriffstoken auf, das Sie vom Security Token Service erhalten haben. In diesem Beispiel wird Cloud Storage abgefragt.

    $ curl --key ${workload_key.pem} --cert ${workload_cert.pem} -X GET 'https://storage.mtls.googleapis.com/{replace_with_your_resources}' -H "Authorization: Bearer $ACCESS_TOKEN"
    
  3. Die mTLS-Bindung erzwingt die Verwendung von mTLS. Führen Sie den folgenden Befehl aus, um zu prüfen, ob eine Nicht-mTLS-Verbindung mit einem Autorisierungsfehler fehlschlägt.

    $ curl -X GET 'https://storage.googleapis.com/{replace_with_your_resources}' -H "Authorization: Bearer $ACCESS_TOKEN"
    

Richtlinienbindung auflisten

Führen Sie den folgenden Befehl aus, um die Richtlinienbindung für die Workload Identity Federation aufzulisten.

gcloud

Mit dem folgenden Befehl werden bestimmte Bindungen in einer bestimmten Organisation aufgelistet und nach Bindungen gefiltert, die für Verbundhauptkonten gelten.

gcloud alpha access-context-manager cloud-bindings list \
--organization=ORG_ID \
--filter='principal:federatedPrincipal'

curl

curl -H "X-Goog-User-Project: ${CALLER_PROJECT_ID:?}" -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://accesscontextmanager.googleapis.com/v1alpha/organizations/${ORG_ID:?}/gcpUserAccessBindings?filter=principal%3Afederated_principal"

Richtlinienbindung aktualisieren

Wenn Sie eine Richtlinienbindung aktualisieren möchten, fügen Sie die neue Zugriffsebene in eine JSON-Datei ein und führen Sie den folgenden Befehl aus.

gcloud

gcloud alpha access-context-manager cloud-bindings update \
--binding=BINDING_ID \
--level=NEW_ACCESS_LEVEL_ID

curl

curl -H "X-Goog-User-Project: ${CALLER_PROJECT_ID:?}" -X PATCH \
 -H "Authorization: Bearer $(gcloud auth print-access-token)" \
 -H "Content-Type: application/json; charset=utf-8" \
 -d @request.json \
"https://accesscontextmanager.googleapis.com/v1alpha/organizations/${ORG_ID:?}/gcpUserAccessBindings/${BINDING_ID:?}?updateMask=access_levels"

Richtlinienbindung löschen

Führen Sie den folgenden Befehl aus, um eine Richtlinienbindung zu löschen.

gcloud

gcloud alpha access-context-manager cloud-bindings delete \
--binding=BINDING_ID

curl

curl -H "X-Goog-User-Project: ${CALLER_PROJECT_ID:?}" -X DELETE \
   -H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://accesscontextmanager.googleapis.com/v1alpha/organizations/${ORG_ID:?}/gcpUserAccessBindings/${BINDING_ID:?}"

Fehlerbehebung

Im Folgenden finden Sie einige häufige Probleme und Vorschläge, wie Sie sie beheben können:

  • Fehler: 403 Forbidden, user does not have permission.

    Maßnahme:Prüfen Sie in der IAM-Richtlinie, ob der Workload-Identitätspool Zugriff auf Ihre Google Cloud -Ressource hat.

  • Fehler: Unauthorized_client: Could not obtain a value for google.subject from the given credential.

    Aktion:Das Backend konnte anhand der Attributzuordnung keinen Wert für google.subject aus Ihrem Clientzertifikat extrahieren. Prüfen Sie Ihr Clientzertifikat, um festzustellen, ob das Feld, das Sie für die Zuordnung verwenden, einen Wert hat.

  • Wenn nach der Aktivierung des kontextsensitiven Zugriffs unerwartete Zugriffsverweigerungen auftreten, können Sie den Traffic schnell entsperren, indem Sie die Bindung für den kontextsensitiven Zugriff mit dem folgenden Befehl entfernen:

    gcloud alpha access-context-manager cloud-bindings delete
    

    Nachdem der Zugriff wiederhergestellt wurde, sehen Sie sich das Audit-Log an, um festzustellen, warum die Anfragen abgelehnt wurden.