Obtengo el error Acceso denegado cuando intento conectarme a Amazon RDS for MySQL con la autenticación IAM

Última actualización: 20/08/2021

Intento conectarme a mi instancia de Amazon Relational Database Service (Amazon RDS) for MySQL mediante la autenticación de AWS Identity Access Management (IAM). Sin embargo, recibo un error de “Acceso denegado”:

ERROR 1045 (28 000): Acceso denegado para el usuario 'root'@'10.0.4.253' (mediante contraseña: YES)

¿Cómo soluciono este problema?

Descripción corta

Si no puede conectarse a una instancia de Amazon RDS for MySQL o de base de datos de Aurora mediante la autenticación de IAM, verifique los siguientes motivos:

  • La autenticación de IAM está deshabilitada
  • Permisos de rol de IAM insuficientes
  • El usuario de base de datos no está configurado adecuadamente
  • Cadena de conexión incorrecta

Resolución

La autenticación de IAM está deshabilitada

De forma predeterminada, la autenticación de IAM está deshabilitada. Revise los ajustes de configuración del clúster de Amazon RDS for MySQL y asegúrese de que la autenticación de IAM esté habilitada. En la consola de Amazon RDS, puede modificar la instancia al seleccionar Database Authentication (Autenticación de base de datos). A continuación, elija Password and IAM database authentication (Autenticación de base de datos de IAM y contraseña) y Continue (Continuar) para actualizar los ajustes de configuración.

Nota: Si elije Apply Immediately (Aplicar inmediatamente) al actualizar la configuración del clúster, todas las modificaciones pendientes se aplican inmediatamente (en lugar de durante un periodo de mantenimiento). Esta acción puede provocar una interrupción prolongada en la instancia de Amazon RDS for MySQL. Para obtener más información, consulte Uso de la configuración de aplicación inmediata.

Permisos de rol de IAM insuficientes

Para conectarse correctamente a la instancia de Amazon RDS for MySQL mediante la autenticación de base de datos de IAM, debe tener acceso a la acción rds-db:connect. La acción rds-db:connect permite las conexiones a la instancia de base de datos.

Por ejemplo:

{
    "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: Reemplace db-user-name por el usuario de la cuenta de base de datos asociado a la autenticación de IAM.

Además, asegúrese de que utiliza el ID de recurso correcto (en lugar de especificar solo el ARN). Para buscar el ID de recurso de una instancia de base de datos, elija la pestaña Resource (Recurso) en la consola de administración de AWS. A continuación, elija la pestaña Configuration (Configuración) para ver el ID del recurso.

Para obtener más información sobre los elementos enumerados en el ejemplo de política de IAM, consulte Creación y uso de una política de IAM para el acceso a base de datos de IAM.

El usuario de base de datos no está configurado adecuadamente

Con Amazon RDS for MySQL, la autenticación de IAM la gestiona AWSAuthenticationPlugin. Por lo tanto, para conectarse a su instancia de Amazon RDS for MySQL mediante la autenticación de IAM, debe utilizar AWSAuthenticationPlugin. Para confirmar que este complemento está asociado a su rol de IAM, ejecute el siguiente comando:

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

La salida se verá así:

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

Si el rol de IAM está restringido al uso de un host específico, asegúrese de que utiliza el nombre de host correcto. Además, debe asegurarse de que dispone de los permisos adecuados para acceder a la base de datos especificada.

Para ver los permisos concedidos a un usuario, utilice la siguiente sintaxis de comandos:

show grants for <user>;

Para conceder privilegios a otro usuario, utilice la siguiente sintaxis de comandos:

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

Cadena de conexión incorrecta

Al conectarse a la base de datos de Amazon RDS for MySQL, debe utilizar la opción --enable-cleartext-plugin en la cadena de conexión. La sintaxis --enable-cleartext-plugin se utiliza para pasar la contraseña y actúa como un token de autenticación.

Por ejemplo:

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

La sintaxis --enable-cleartext-plugin también indica que se debe utilizar AWSAuthenticationPlugin para la conexión a la base de datos. El complemento es necesario para configurar el usuario de la base de datos y es necesario para que funcione la autenticación de IAM. Si AWSAuthenticationPlugin está configurado incorrectamente, la autenticación de IAM no funciona. Como resultado, aparecerá un error Acceso denegado cuando intente conectarse a la base de datos.

Además, dado que los tokens de autenticación constan de varios caracteres (lo que puede resultar incómodo en la línea de comandos), guarde el token en una variable de entorno. A continuación, utilice esa variable cuando se conecte a la instancia de base de datos MySQL. Por ejemplo:

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

Para obtener más información sobre cómo conectarse a una instancia de base de datos MySQL mediante una variable del entorno, consulte Conexión a una instancia de base de datos.