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

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

Beim zertifikatsbasierten Zugriff wird gegenseitiges TLS (mTLS) verwendet, um sowohl den Client als auch den Server während eines TLS-Handshakes zu authentifizieren. In diesem Prozess werden in einer mTLS-Bindung Richtlinien basierend auf dem Transportkontext berücksichtigt und der Status des Clientzertifikats innerhalb der TLS-Sitzung wird verwendet, um Autorisierungsentscheidungen zu treffen.

Bei der X.509-Workload Identity-Föderation sorgt eine mTLS-Bindung dafür, dass der gesamte Authentifizierungsablauf sicher an eine vertrauenswürdige Arbeitslast gebunden ist. Dadurch wird das Risiko des Diebstahls von Anmeldedaten verringert, da das System die Authentifizierung an einen bestimmten, vertrauenswürdigen Endpunkt bindet.

Zertifikatbasierter Zugriff für die Workload Identity-Föderation – Übersicht

Im Folgenden finden Sie eine allgemeine Übersicht über den Prozess zum Konfigurieren des zertifikatsbasierten Zugriffs für die Workload Identity-Föderation:

  1. Richten Sie die Workload Identity-Föderation ein, indem Sie die Vertrauensstellung mit dem Trust-Anchor 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 kontextsensitiven Zugriff hinzu, die die mTLS-Bindung erzwingt.

Hinweis

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

Zugriffsebene für Zertifikate erstellen

  1. Erstellen Sie eine mTLS-Zugriffsebene. Auf 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 CEL-Ausdruck 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 folgendem Inhalt: expression: "request.auth.matchesMtlsTokens(origin) == true".
    • DESCRIPTION: eine Beschreibung der Zugriffsebene.
    • POLICY_NAME: Der Name der Zugriffsrichtlinie.
  2. Exportieren Sie die von Ihnen erstellte Zugriffsebene in eine Umgebungsvariable, die Sie in den folgenden Schritten verwenden können:

      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äts-Hauptkontos im Workload Identity-Pool, das der Richtlinie für kontextsensitiven Zugriff entspricht. Sie haben folgende Möglichkeiten:

      • Eine 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/*

    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 Probelauf. Wir empfehlen, zuerst eine Probelauf-Richtlinienbindung zu aktivieren, um die potenziellen Auswirkungen auf den vorhandenen Traffic zu verstehen.

    curl

    1. Erstellen Sie eine JSON-Datei mit der kontextsensitiven Zugriffsbereitstellung:

      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 Hauptkonten 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/*
      cat <<EOF > request.json
      {
        "principal": {
          "federatedPrincipal": "${FEDERATED_PRINCIPAL:?}"
        },
        "accessLevels": ["${ACCESS_LEVEL_ID:?}"]
      }
      EOF
      
    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"
      

Mit den Clientbibliotheken von Cloud de Confiance by S3NS autorisieren

Führen Sie die folgenden Schritte aus, um Workloads der Identitätsföderation von Arbeitslasten mit denCloud de Confiance -Clientbibliotheken zu autorisieren:

  1. Erstellen Sie eine ADC-Datei (Standardanmeldedaten für Anwendungen), die für die Authentifizierung mit Workload Identity Federation 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 Ihrer 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 im Standardkonfigurationsverzeichnis der gcloud CLI generiert. Die Zertifikatkonfigurationsdatei unterstützt die anfängliche Authentifizierung und richtet mTLS-Handshakes für nachfolgende Anfragen an Cloud de Confiance -Ressourcen ein.

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

    export GOOGLE_APPLICATION_CREDENTIALS=ADC_FILE_OUTPUT_PATH
    

    Dieser Schritt ist optional, wenn Sie das Argument --output-file beim Generieren der ADC-Datei weglassen. Wenn Sie das Argument weglassen, erstellt und liest die gcloud CLI die ADC-Datei aus dem Standardkonfigurationsverzeichnis der gcloud CLI.

  3. Die Funktion unterstützt die Clientbibliotheken in Go, Python und Java. Sie müssen die Umgebungsvariable festlegen, um mTLS für Python und Java zu aktivieren.

  4. Mit den folgenden Codebeispielen können Sie den mTLS-Zugriff auf die Cloud de Confiance APIs schnell einrichten und testen:

    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 Ihre Projekt-ID inCloud de Confiance .

    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_python_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_python_example()
      

      Ersetzen Sie PROJECT_ID durch Ihre Projekt-ID inCloud de Confiance .

    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 Workload Identity-Föderations-Arbeitslasten mit einfachen HTTP-Anfragen zu autorisieren:

  1. Zertifikatsgebundenes Zugriffstoken vom Cloud de Confiance Security Token Service über einen standardmäßigen mTLS-Handshake abrufen.

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

    curl --key WORKLOAD_KEY_PATH --cert WORKLOAD_CERTIFICATE_PATH \
     -X GET "https://storage.mtls.googleapis.com/RESOURCE_PATH" \
     -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 Fehler „Nicht autorisiert“ fehlschlägt:

    curl -X GET "https://storage.googleapis.com/RESOURCE_PATH" \
     -H "Authorization: Bearer $ACCESS_TOKEN"
    

Richtlinienbindung auflisten

Führen Sie den folgenden Befehl aus, um die Richtlinienbindung für die Identitätsföderation von Arbeitslasten aufzulisten:

gcloud

Mit dem folgenden Befehl werden bestimmte Bindungen innerhalb einer bestimmten Organisation aufgelistet und nach Bindungen gefiltert, die für föderierte Hauptkonten 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

So aktualisieren Sie eine Richtlinienbindung:

gcloud

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

curl

Fügen Sie die neue Zugriffsebene der Datei request.json hinzu und führen Sie den folgenden Befehl aus:

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 \
--organization=ORG_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:?}"

Nächste Schritte