Wie behebe ich Probleme bei der Verbindung mit einem Cluster von Amazon RDS für PostgreSQL oder Aurora PostgreSQL mithilfe der IAM-Authentifizierung?
Ich möchte eine Verbindung zu meiner Instance von Amazon Relational Database Service (Amazon RDS) oder einem mit Amazon Aurora PostgreSQL kompatiblen Cluster herstellen. Wenn ich versuche, eine Verbindung mithilfe der AWS Identity Access Management (IAM)-Authentifizierung herzustellen, erhalte ich die Fehlermeldung „PAM authentication failed for user“ (PAM-Authentifizierung für Benutzer fehlgeschlagen).
Kurzbeschreibung
Möglicherweise können Sie aus einem der folgenden Gründe keine Verbindung zu Ihrer Instance von Amazon RDS für PostgreSQL oder Aurora DB mithilfe der IAM-Authentifizierung herstellen:
- Die IAM-Authentifizierung ist deaktiviert
- Unzureichende IAM-Rollenberechtigungen oder falsche Richtlinie
- Datenbankbenutzer falsch konfiguriert
- Falsche Verbindungszeichenfolge
- Falsche IAM-Entität
Lösung
Die IAM-Authentifizierung ist deaktiviert
Die IAM-Authentifizierung ist standardmäßig deaktiviert. Überprüfen Sie die Konfigurationseinstellungen für Ihre Instance von RDS für PostgreSQL oder Ihren Aurora-PostgreSQL-Cluster. Stellen Sie sicher, dass die IAM-Authentifizierung aktiviert ist. In der Amazon-RDS-Konsole können Sie den Aurora-Cluster oder die RDS-Instance ändern, indem Sie Database Authentication (Datenbankauthentifizierung) wählen. Wählen Sie dann IAM database authentication (IAM-Datenbankauthentifizierung) und Continue (Weiter), um Ihre Konfigurationseinstellungen zu aktualisieren.
Hinweis: Wenn Sie beim Aktualisieren Ihrer Cluster-Konfigurationseinstellungen die Option Apply Immediately (Sofort anwenden) wählen, werden alle ausstehenden Änderungen sofort angewendet. Diese Aktion führt nicht zu Ausfallzeiten.
Unzureichende IAM-Rollenberechtigungen
Um mithilfe der IAM-Datenbankauthentifizierung erfolgreich eine Verbindung zu Ihrer DB-Instance herzustellen, müssen Sie Zugriff auf die Aktion rds-db:connect haben. Die Aktion „rds-db:connect“ ermöglicht Verbindungen zur DB-Instance.
Beispiel:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "rds-db:connect" ], "Resource": [ " arn:aws:rds-db:region:account-id:dbuser:(DbiResourceId for RDS PostgreSQL or DbClusterResourceId for Aurora PostgreSQL)/db_user_name" ] }]
Hinweis: Ersetzen Sie db-username durch den Datenbank-Kontobenutzer, der mit der IAM-Authentifizierung verknüpft ist.
Stellen Sie außerdem sicher, dass Sie die richtige Ressourcen-ID verwenden (anstatt nur den ARN anzugeben). Wählen Sie die DB-Instance oder den Cluster in der Amazon-RDS-Konsole aus, um die Ressourcen-ID einer DB-Instance zu ermitteln. Wählen Sie dann die Registerkarte Configuration (Konfiguration), um die Ressourcen-ID anzuzeigen.
Weitere Informationen zu den in der Beispiel-IAM-Richtlinie aufgeführten Elementen finden Sie unter Erstellen und Verwenden einer IAM-Richtlinie für den IAM-Datenbankzugriff.
Hinweis: Die IAM-Authentifizierung unterstützt keine servicespezifischen Kontextschlüssel, die im Bedingungselement von Richtlinienanweisungen verwendet werden können. Die IAM-Authentifizierung unterstützt auch nicht alle globalen Bedingungskontextschlüssel. Weitere Informationen zu globalen Bedingungskontextschlüsseln finden Sie unter Globale AWS-Bedingungskontextschlüssel im IAM-Benutzerhandbuch.
Datenbankbenutzer falsch konfiguriert
Um die IAM-Authentifizierung mit PostgreSQL zu verwenden, weisen Sie dem Datenbankbenutzer die Rolle rds_iam zu. Führen Sie den folgenden Befehl aus, um zu bestätigen, dass diese Rolle dem Benutzer zugeordnet ist:
Hinweis: Dieser Befehl kann nur im PostgreSQL-Client ausgeführt werden.
\du
Ihre Ausgabe sieht ungefähr so aus:
List of roles Role name | Attributes | Member of -----------------+------------------------------------------------------------+------------------------------------------------------------- db_user_name | | {rds_iam} postgres | Create role, Create DB +| {rds_superuser} | Password valid until infinity |
Sie können auch diese Abfrage verwenden, die auf jeder Plattform ausgeführt werden kann:
SELECT r.rolname, ARRAY(SELECT b.rolname FROM pg_catalog.pg_auth_members m JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid) WHERE m.member = r.oid) memberof FROM pg_catalog.pg_roles r WHERE r.rolname !~ '^pg_' ORDER BY 1;
Führen Sie den folgenden Befehl aus, um einen Benutzer zu erstellen und ihm die Rolle „rds_iam“ zu gewähren:
CREATE USER db_user_name WITH LOGIN; GRANT rds_iam TO db_user_name;
Falsche Verbindungszeichenfolge
Authentifizierungstoken bestehen aus mehreren Zeichen, deren Verwendung in der Befehlszeile umständlich sein kann. Speichern Sie das Token stattdessen in einer Umgebungsvariablen und verwenden Sie diese Variable dann, wenn Sie eine Verbindung zu Ihrer PostgreSQL-DB-Instance herstellen.
Beispiel:
export RDSHOST='aurorapostgresql.cluster-abcdef12ghi.us-east-1.rds.amazonaws.com' export PGPASSWORD="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 5432 --region us-east-1 --username db_user_name)" psql "host=$RDSHOST port=5432 sslmode=verify-full sslrootcert=global-bundle.pem dbname=postgres user=db_user_name password=$PGPASSWORD"
Weitere Hinweise zum Herstellen einer Verbindung zu einer PostgreSQL-DB-Instance mithilfe einer Umgebungsvariablen finden Sie unter Verbinden mit einem Aurora-PostgreSQL-Cluster.
Wenn Sie einen ähnlichen Fehler wie in diesem Beispiel erhalten, versucht der Client, ohne SSL eine Verbindung zur DB-Instance herzustellen.
FATAL: no pg_hba.conf entry for host "host.ip", user "<username>", database "postgres", SSL off FATAL: password authentication failed for user "db_user_name"
Die IAM-Datenbankauthentifizierung erfordert eine SSL-Verbindung, und alle Daten, die zu und von Ihrer DB-Instance übertragen werden, sind verschlüsselt. Um diesen Fehler zu vermeiden, stellen Sie sicher, dass die Verbindung SSL verwendet. Es hat sich bewährt, die Option sslmode als „verify-full“ zu verwenden und das Zertifikat in der Option sslrootcert in Ihrer Verbindungszeichenfolge anzugeben.
Informationen zum Herunterladen des aktuellen CA-Zertifikats finden Sie unter Verwenden von SSL/TLS für die Verschlüsselung einer Verbindung zu einem DB-Cluster.
Falsche IAM-Entität
Stellen Sie sicher, dass das Authentifizierungstoken von der richtigen IAM-Rolle generiert wird. Führen Sie den folgenden Befehl aus, um die angenommene Rolle des aktuellen IAM-Benutzers zu überprüfen:
aws sts get-caller-identity
Wenn die angenommene Rolle nicht korrekt ist, können Sie zum richtigen IAM-Benutzer/zur richtigen IAM-Rolle wechseln oder die richtige Rolle annehmen. Stellen Sie sicher, dass Sie die richtige IAM-Rolle verwenden, um das Authentifizierungstoken zu generieren.
Wenn Sie immer noch eine Fehlermeldung wie „PAM-Authentifizierung für Ihren Benutzer fehlgeschlagen“ erhalten, überprüfen Sie, ob das AWS-Konto Teil einer AWS Organizations-Organisation ist. Wenn das Konto Teil einer Organisation ist, fügen Sie rds-db:* zur SCP der Organisation hinzu. Weitere Informationen finden Sie unter So erstellen, aktualisieren und löschen Sie Service-Kontrollrichtlinien.
Wenn das Konto Teil einer Organisation ist, überprüfen Sie, ob es eine Hierarchie des IAM-Benutzers gibt, der nicht über die Berechtigung „rds-db“ verfügt. Weitere Informationen finden Sie unter How to use service control policies to set permission guardrails across accounts in your AWS Organization (Verwenden von Service-Kontrollrichtlinien zum Festlegen eines kontenübergreifenden Integritätsschutzes für Berechtigungen in Ihrer AWS-Organisation).
Wenn Sie Berechtigungsgrenzen für IAM-Entitäten verwenden, stellen Sie sicher, dass die Aktion „rds-db:connect“ für Ihren IAM-Benutzer/Ihre IAM-Rolle zulässig ist. Weitere Informationen zu Berechtigungsgrenzen finden Sie unter Berechtigungsgrenzen für IAM-Entitäten. Informationen zum Ändern der Berechtigungsgrenzen für einen Benutzer finden Sie unter Ändern der Berechtigungsgrenze für einen Benutzer.
Relevanter Inhalt
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor 9 Monaten
- AWS OFFICIALAktualisiert vor 2 Jahren
- AWS OFFICIALAktualisiert vor einem Jahr