Ich erhalte eine Fehlermeldung „Zugriff verweigert“, wenn ich versuche, eine Verbindung zu Amazon RDS for MySQL mithilfe der IAM-Authentifizierung herzustellen

Letzte Aktualisierung: 20.08.2021

Ich versuche mithilfe der AWS Identity Access Management (IAM) -Authentifizierung eine Verbindung zu meiner Amazon Relational Database Service (Amazon RDS) für MySQL-Instance herzustellen. Ich erhalte jedoch immer wieder einen „Zugriff verweigert“ -Fehler:

FEHLER 1045 (28000): Zugriff verweigert für Benutzer 'root'@'10.0.4.253' (mit Passwort: YES)

Wie kann ich dies beheben?

Kurzbeschreibung

Wenn Sie über die IAM-Authentifizierung keine Verbindung zu einer Amazon RDS for MySQL oder Aurora-DB-Instance herstellen können, überprüfen Sie die folgenden Gründe:

  • Die IAM-Authentifizierung ist deaktiviert
  • Unzureichende IAM-Rollenberechtigungen
  • Datenbankbenutzer ist falsch konfiguriert
  • Falsche Verbindungszeichenfolge

Lösung

Die IAM-Authentifizierung ist deaktiviert

Standardmäßig ist die IAM-Authentifizierung deaktiviert. Überprüfen Sie Ihre Konfigurationseinstellungen für Ihren Amazon-RDS-for-MySQL-Cluster und stellen Sie sicher, dass die IAM-Authentifizierung aktiviert ist. Von der Amazon-RDS-Konsole aus, können Sie die Instance ändern, indem Sie Datenbankauthentifizierung wählen. Wählen Sie dann Passwort und IAM-Datenbankauthentifizierung und Fortfahren, um Ihre Konfigurationseinstellungen zu aktualisieren.

Hinweis: Wenn Sie beim Aktualisieren Ihrer Cluster-Konfigurationseinstellungen Sofort anwenden wählen, werden alle ausstehenden Änderungen sofort (statt während eines Wartungsfensters) angewendet. Diese Aktion kann zu einem längeren Ausfall Ihrer Amazon-RDS-for-MySQL-Instance führen. Weitere Informationen finden Sie unter Verwendung der Einstellung Sofort anwenden.

Unzureichende IAM-Rollenberechtigungen

Um mithilfe der IAM-Datenbankauthentifizierung erfolgreich eine Verbindung zu Ihrer Amazon-RDS-for-MySQL-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 or DbClusterResourceId)/db-user-name"
        ]
    }]
}

Hinweis: Ersetzen Sie db-username durch den Datenbankkonto-Benutzer, 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). Um die Ressourcen-ID einer DB-Instance zu ermitteln, wählen Sie die Registerkarte Ressource in der AWS-Managementkonsole. Wählen Sie dann die Registerkarte 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.

Datenbankbenutzer ist falsch konfiguriert

Bei Amazon RDS for MySQL wird die IAM-Authentifizierung von AWSAuthenticationPlugin abgewickelt. Um über die IAM-Authentifizierung eine Verbindung zu Ihrer Amazon RDS for MySQL-Instanz herzustellen, müssen Sie daher AWSAuthenticationPlugin verwenden. Führen Sie den folgenden Befehl aus, um zu bestätigen, dass dieses Plugin Ihrer IAM-Rolle zugeordnet ist:

select user,plugin,host from mysql.user where user like '%db-user-name%';

Ihre Ausgabe sieht so aus:

+------+-------------------------+------+
| user | plugin | host |
+------+-------------------------+------+
| root | AWSAuthenticationPlugin | % |
+------+-------------------------+------+
1 row in set (0.00 sec)

Wenn die IAM-Rolle auf die Verwendung eines bestimmten Hosts beschränkt ist, stellen Sie sicher, dass Sie den richtigen Hostnamen verwenden. Stellen Sie außerdem sicher, dass Sie über die erforderlichen Berechtigungen für den Zugriff auf die angegebene Datenbank verfügen.

Verwenden Sie die folgende Befehlssyntax, um die einem Benutzer erteilten Berechtigungen anzuzeigen:

show grants for <user>;

Verwenden Sie die folgende Befehlssyntax, um einem anderen Benutzer Berechtigungen zu erteilen:

grant select on <mydb>.<mytable> to <user>;

Falsche Verbindungszeichenfolge

Wenn Sie eine Verbindung zur Amazon-RDS-for-MySQL-Datenbank herstellen, müssen Sie die Option —enable-cleartext-plugin in Ihrer Verbindungszeichenfolge verwenden. Die Syntax —enable-cleartext-plugin wird für die Übergabe des Passworts verwendet und fungiert als Authentifizierungstoken.

Beispiel:

$ mysql -h <endpoint> -P 3306 --enable-cleartext-plugin --user=RDSConnect --password=$

Die Syntax —enable-cleartext-plugin zeigt auch an, dass AWSAuthenticationPlugin für die Datenbankverbindung verwendet werden muss. Das Plug-In wird für die Konfiguration des Datenbankbenutzers benötigt und ist erforderlich, damit die IAM-Authentifizierung funktioniert. Wenn AWSAuthenticationPlugin falsch konfiguriert ist, funktioniert die IAM-Authentifizierung nicht. Infolgedessen erhalten Sie einen Fehler „Zugriff verweigert“, wenn Sie versuchen, eine Verbindung zu Ihrer Datenbank herzustellen.

Da Authentifizierungstoken aus mehreren Zeichen bestehen (was in der Befehlszeile unhandlich sein kann), speichern Sie das Token stattdessen in einer Umgebungsvariablen. Verwenden Sie dann diese Variable, wenn Sie eine Verbindung zu Ihrer MySQL-DB-Instance herstellen. Beispiel:

RDSHOST="rdsmysql.123456789012.us-west-2.rds.amazonaws.com"
TOKEN="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 3306 --region us-west-2 --username db-user-name)"
mysql --host=$RDSHOST --port=3306 --enable-cleartext-plugin --user=jane_doe --password=$TOKEN

Weitere Hinweise zum Herstellen einer Verbindung zu einer MySQL-DB-Instance mithilfe einer Umgebungsvariablen finden Sie unter Verbindumg mit einer DB-Instance.