Perché ricevo un errore di accesso negato quando cerco di connettermi ad Amazon RDS per MySQL usando un’autenticazione IAM?

Ultimo aggiornamento: 02/12/2022

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 riscontrare l’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 per MySQL o Aurora utilizzando l'autenticazione IAM, verifica i seguenti motivi:

  • L'autenticazione IAM è disattivata
  • Le autorizzazioni del ruolo IAM sono insufficienti
  • L'utente del database non è configurato correttamente
  • Stringa di connessione errata

Risoluzione

L'autenticazione IAM è disattivata

L'autenticazione IAM è disabilitata per impostazione predefinita. Controlla le impostazioni di configurazione per il cluster Amazon RDS per MySQL e assicurati che l'autenticazione IAM sia disabilitata. 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 per 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 per MySQL, l'autenticazione IAM viene gestita da AWSAuthenticationPlugin. Pertanto, per connettersi all'istanza Amazon RDS per 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%';

Riceverai un output 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 questa sintassi di comando:

show grants for <user>;

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

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

Stringa di connessione errata

Quando ci si connette al database Amazon RDS per 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=db-user-name --password=$TOKEN

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