Ricevo un errore di accesso negato quando cerco di connettermi ad Amazon RDS for MySQL usando un’autenticazione IAM

Ultimo aggiornamento: 20/08/2021

Sto tentando di connettermi ad Amazon Relational Database Service (Amazon RDS) per l'istanza MySQL utilizzando l'autenticazione AWS Identity Access Management (IAM). Tuttavia, continuo a ricevere un errore "Accesso negato":

ERRORE 1045 (28000): Accesso negato per l'utente 'root' @'10.0.4.253' (utilizzando la password: YES)

In che modo posso risolvere il problema?

Breve descrizione

Se non riesci a connetterti a un'istanza database di Amazon RDS for MySQL o Aurora utilizzando l'autenticazione IAM, verifica i seguenti motivi:

  • L'autenticazione IAM è disabilitata
  • Autorizzazioni del ruolo IAM insufficienti
  • L'utente del database non è configurato correttamente
  • Stringa di connessione errata

Risoluzione

L'autenticazione IAM è disabilitata

L'autenticazione IAM è disabilitata per impostazione predefinita. Controlla le impostazioni di configurazione per il cluster Amazon RDS for MySQL e assicurati che l'autenticazione IAM sia abilitata. Dalla console di Amazon RDS puoi modificare l'istanza scegliendo Autenticazione del database. Quindi, scegli Password e autenticazione del database IAM e Continua per aggiornare le impostazioni di configurazione.

Nota: se scegli Applica immediatamente quando aggiorni le impostazioni di configurazione del cluster, tutte le modifiche in sospeso vengono applicate immediatamente (anziché durante una finestra di manutenzione). Questa azione può causare un'interruzione prolungata dell'istanza Amazon RDS for MySQL. Per ulteriori informazioni, consulta Utilizzo dell'impostazione Applica immediatamente.

Autorizzazioni del ruolo IAM insufficienti

Per connettersi correttamente all'istanza Amazon RDS for MySQL utilizzando l'autenticazione del database IAM, è necessario disporre dell'accesso all'azione rds-db:connect. L'azione rds-db:connect permette le connessioni all'istanza database.

Ad esempio:

{
    "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"
        ]
    }]
}

Nota: sostituisci db-user-name con l'utente dell'account del database associato all'autenticazione IAM.

Inoltre, assicurati di utilizzare l'ID risorsa corretto (invece di specificare solo l'ARN). Per trovare l'ID risorsa di un'istanza database, scegli la scheda Risorsa nella Console di gestione AWS. Quindi, scegli la scheda Configurazione per visualizzare l'ID risorsa.

Per ulteriori informazioni sugli elementi elencati nella policy IAM di esempio, consulta Creazione e utilizzo di una policy IAM per l'accesso al database IAM.

L'utente del database non è configurato correttamente

Con Amazon RDS for MySQL, l'autenticazione IAM viene gestita da AWSAuthenticationPlugin. Pertanto, per connettersi all'istanza Amazon RDS for MySQL utilizzando l'autenticazione IAM, è necessario utilizzare AWSAuthenticationPlugin. Per confermare che questo plugin è associato al tuo ruolo IAM, esegui il seguente comando:

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

L'output sarà simile al seguente:

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

Se il ruolo IAM è limitato all'utilizzo di un host specifico, assicurati di utilizzare il nome host corretto. Inoltre, assicurati di disporre delle autorizzazioni appropriate per accedere al database specificato.

Per visualizzare le autorizzazioni concesse a un utente, utilizza la seguente sintassi di comando:

show grants for <user>;

Per concedere privilegi a un altro utente, utilizza la seguente sintassi di comando:

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

Stringa di connessione errata

Quando ci si connette al database Amazon RDS for MySQL, è necessario utilizzare l'opzione --enable-cleartext-plugin nella stringa di connessione. La sintassi --enable-cleartext-plugin viene utilizzata per passare la password, fungendo da token di autenticazione.

Ad esempio:

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

La sintassi --enable-cleartext-plugin indica anche che deve essere usato AWSAuthenticationPlugin per la connessione al database. Il plugin è necessario durante la configurazione dell'utente del database ed è necessario per il funzionamento dell'autenticazione IAM. Se AWSAuthenticationPlugin è configurato in modo errato, l'autenticazione IAM non funziona. Di conseguenza, viene visualizzato un errore di Accesso negato quando si tenta di connettersi al database.

Inoltre, poiché i token di autenticazione sono costituiti da svariati caratteri (che possono essere poco gestibili sulla riga di comando), salva il token in una variabile di ambiente. Quindi, usa questa variabile quando ti connetti all'istanza database MySQL. Ad esempio:

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

Per ulteriori informazioni su come connettersi a un'istanza database MySQL utilizzando una variabile di ambiente, consulta Connessione a un'istanza database.