Probleme mit der IAM-Authentifizierung beheben

Auf dieser Seite wird beschrieben, wie Sie Probleme mit der IAM-Authentifizierung (Identity and Access Management) für AlloyDB for PostgreSQL beheben.

So ermitteln Sie die Ursache eines fehlgeschlagenen IAM-basierten Authentifizierungsversuchs:

  1. Rufen Sie in der Google Cloud Console die Seite „Log-Explorer“ auf:

    Zum Log-Explorer

  2. Wählen Sie in der Drop-down-Liste Alle Ressourcen die Option AlloyDB-Instanz aus.

  3. Klicken Sie unter Schweregrad auf Benachrichtigung.

    Wenn Benachrichtigung keine Option ist, wurden im ausgewählten Zeitraum keine Authentifizierungsfehler protokolliert. Möglicherweise müssen Sie das Zeitfenster mit den Steuerelementen des Log-Explorers anpassen.

  4. Sehen Sie sich unter Abfrageergebnisse die Logeinträge an, um nach einer der folgenden Meldungen zu suchen:

    Request had invalid authentication credentials.
    Das Zugriffstoken ist ungültig.
    Caller does not have required permission to use project.
    Der IAM-Prinzipal hat nicht die erforderlichen IAM-Rollen oder Berechtigungen. In der vollständigen Fehlermeldung werden die fehlenden Rollen oder Berechtigungen angegeben.
    IAM principal does not match database user.

    Das authentifizierte IAM-Hauptkonto, das durch das Zugriffstoken angegeben wird, stimmt nicht mit dem Datenbanknutzer überein, als der Sie sich verbinden möchten.

    Führen Sie den folgenden Befehl aus, um den vom Token angegebenen Prinzipal aufzurufen:

    curl -H "Content-Type: application/x-www-form-urlencoded" \
        -d "access_token=ACCESS_TOKEN" \
        https://www.googleapis.com/oauth2/v1/tokeninfo
    

    Ersetzen Sie ACCESS_TOKEN durch das OAuth 2.0-Zugriffstoken.

    Dieser Fehler tritt auch auf, wenn der gekürzte Prinzipal des Dienstkontos, also die E‑Mail-Adresse ohne das Suffix .gserviceaccount.com, mehr als 63 Zeichen umfasst.

    In PostgreSQL dürfen Rollen- und Nutzer-IDs maximal 63 Zeichen lang sein. Obwohl Sie den Nutzer in AlloyDB erstellen können, kürzt PostgreSQL den Rollennamen im internen Katalog auf 63 Byte. Bei der Anmeldung vergleicht die IAM-Authentifizierungsebene von AlloyDB das vollständige, nicht gekürzte Hauptkonto aus dem OAuth-Token mit der gekürzten Datenbankrolle, was zu einer Nichtübereinstimmung der Strings führt.

    Problemumgehung: Identitätsübernahme des Dienstkontos verwenden

    Wenn Sie den Namen des Dienstkontos nicht kürzen können, können Sie diese Einschränkung umgehen, indem Sie die Identitätsübernahme des Dienstkontos verwenden. Dadurch wird die Identität, mit der die Arbeitslast ausgeführt wird, von der Identität entkoppelt, mit der sich in der Datenbank angemeldet wird:

    1. Erstellen Sie ein Proxy-Dienstkonto mit einem Namen, dessen gekürztes Hauptkonto (ohne das Suffix .gserviceaccount.com) maximal 63 Zeichen lang ist, z. B. db-proxy@PROJECT_ID.iam.gserviceaccount.com.
    2. Fügen Sie das Proxy-Dienstkonto dem AlloyDB-Cluster als IAM_BASED-Datenbanknutzer mit dem Nutzernamen db-proxy@PROJECT_ID.iam hinzu.
    3. Weisen Sie dem ursprünglichen Dienstkonto der Arbeitslast in IAM die Rolle „Ersteller von Dienstkonto-Tokens“ (roles/iam.serviceAccountTokenCreator) für das Proxy-Dienstkonto zu.
    4. Konfigurieren Sie Ihre Anwendung, Ihren Connector oder Ihren Auth-Proxy so, dass die Verbindung über die Proxy-Identität hergestellt wird.

    Sie können beispielsweise mit dem Befehl gcloud beta alloydb connect und dem Flag --impersonate-service-account eine Verbindung herstellen:

    gcloud beta alloydb connect INSTANCE_ID \
        --cluster=CLUSTER_ID \
        --region=REGION_ID \
        --impersonate-service-account=PROXY_SERVICE_ACCOUNT_EMAIL \
        --auto-iam-authn
    

    Ersetzen Sie Folgendes:

    • INSTANCE_ID: Die ID der AlloyDB-Instanz.
    • CLUSTER_ID: Die ID des Clusters, der die Instanz enthält.
    • REGION_ID: Die Region, in der sich der Cluster befindet.
    • PROXY_SERVICE_ACCOUNT_EMAIL: die vollständige E-Mail-Adresse des Proxy-Dienstkontos.

    Hinweis: Das ursprüngliche Dienstkonto benötigt keinen direkten Anmeldezugriff auf die Datenbank, sondern nur die Berechtigung, die Identität des Proxykontos zu übernehmen. Das Proxy-Dienstkonto hat die Datenbankberechtigungen.

    Request had insufficient scopes.
    Das Zugriffstoken enthält weder den Bereich alloydb.login noch den Bereich cloud-platform. Mindestens einer dieser Bereiche ist erforderlich.