Je reçois une erreur Access Denied (Accès refusé) lorsque j'essaie de me connecter à Amazon RDS for MySQL à l'aide de l'authentification IAM

Date de la dernière mise à jour : 20/08/2021

J'essaie de me connecter à mon instance Amazon Relational Database Service (Amazon RDS) for MySQL à l'aide de l'authentification AWS Identity Access Management (IAM). Cependant, je reçois toujours une erreur « Access Denied » (Accès refusé) :

ERROR 1045 (28000): Access denied for user 'root'@'10.0.4.253' (using password: YES) [ERREUR 1045 (28000) : accès refusé pour l'utilisateur 'racine'@'10.0.4.253 ' (par mot de passe : OUI)]

Comment résoudre ce problème ?

Brève description

Si vous ne parvenez pas à vous connecter à une instance de base de données Amazon RDS for MySQL ou Aurora à l'aide de l'authentification IAM, vérifiez les raisons suivantes :

  • Authentification IAM désactivée
  • Autorisations de rôle IAM insuffisantes
  • Utilisateur de la base de données mal configuré
  • Chaîne de connexion incorrecte

Résolution

Authentification IAM désactivée

Par défaut, l'authentification IAM est désactivée. Vérifiez les paramètres de configuration de votre cluster Amazon RDS for MySQL et assurez-vous que l'authentification IAM est activée. À partir de la console Amazon RDS, vous pouvez modifier l'instance en sélectionnant Authentification de base de données. Ensuite, sélectionnez Authentification de base de données par mot de passe et IAM et Continuer pour mettre à jour vos paramètres de configuration.

Remarque : si vous sélectionnez Appliquer immédiatement lors de la mise à jour des paramètres de configuration de votre cluster, toutes les modifications en attente sont appliquées immédiatement (plutôt que lors d'une fenêtre de maintenance). Cette action peut entraîner une interruption prolongée de votre instance Amazon RDS for MySQL. Pour en savoir plus, consultez la section Utilisation du paramètre Appliquer immédiatement.

Autorisations de rôle IAM insuffisantes

Pour vous connecter avec succès à votre instance Amazon RDS for MySQL à l'aide de l'authentification de base de données IAM, vous devez avoir accès à l'action rds-db:connect. L'action rds-db:connect autorise les connexions à l'instance de base de données.

Par exemple :

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

Remarque : remplacez db-user-name par l'utilisateur du compte de base de données associé à l'authentification IAM.

En outre, veillez à utiliser le bon ID de ressource (plutôt que de spécifier uniquement l'ARN). Pour trouver l'ID de ressource d'une instance de base de données, sélectionnez l'onglet Ressource dans la console de gestion AWS. Ensuite, sélectionnez l'onglet Configuration pour afficher l'ID de ressource.

Pour en savoir plus sur les éléments répertoriés dans l'exemple de stratégie IAM, consultez la section Création et utilisation d'une stratégie IAM pour l'accès à la base de données IAM.

Utilisateur de la base de données mal configuré

Avec Amazon RDS for MySQL, l'authentification IAM est gérée par AWSAuthenticationPlugin. Par conséquent, pour vous connecter à votre instance Amazon RDS for MySQL à l'aide de l'authentification IAM, vous devez utiliser AWSAuthenticationPlugin. Pour vérifier que ce plugin est associé à votre rôle IAM, exécutez la commande suivante :

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

Votre sortie doit se présenter comme suit :

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

Si le rôle IAM est limité à l'utilisation d'un hôte spécifique, veillez à utiliser le bon nom d'hôte. Assurez-vous également que vous disposez des autorisations appropriées pour accéder à la base de données spécifiée.

Pour afficher les autorisations accordées à un utilisateur, utilisez la syntaxe de commande suivante :

show grants for <user>;

Pour octroyer des privilèges à un autre utilisateur, utilisez la syntaxe de commande suivante :

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

Chaîne de connexion incorrecte

Lorsque vous vous connectez à la base de données Amazon RDS for MySQL, vous devez utiliser l'option --enable-cleartext-plugin dans votre chaîne de connexion. La syntaxe --enable-cleartext-plugin est utilisée pour transmettre le mot de passe. Elle agit comme jeton d'authentification.

Par exemple :

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

La syntaxe --enable-cleartext-plugin indique également que AWSAuthenticationPlugin doit être utilisé pour la connexion à la base de données. Le plugin est requis lors de la configuration de l'utilisateur de la base de données et pour que l'authentification IAM fonctionne. Si AWSAuthenticationPlugin n'est pas correctement configuré, l'authentification IAM ne fonctionne pas. Par conséquent, vous obtiendrez une erreur Access Denied (Accès refusé) lorsque vous tenterez de vous connecter à votre base de données.

De plus, comme les jetons d'authentification sont composés de plusieurs caractères (ce qui peut être complexe sur la ligne de commande), enregistrez plutôt le jeton dans une variable d'environnement. Ensuite, utilisez cette variable lorsque vous vous connectez à votre instance de base de données MySQL. Par exemple :

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

Pour en savoir plus sur la façon de se connecter à une instance de base de données MySQL à l'aide d'une variable d'environnement, consultez la section Connexion à une instance de base de données.