Je rencontre des erreurs lorsque j'utilise l'authentification Gestion des identités et des accès AWS (AWS IAM) pour me connecter à mon instance Amazon Relational Database Service (Amazon RDS) pour PostgreSQL ou à mon cluster Amazon Aurora édition compatible avec PostgreSQL.
Brève description
Le message d'erreur « PAM authentication failed for user » peut s'afficher dans les cas suivants :
- L'authentification IAM est désactivée
- La stratégie IAM n'inclut pas l'action rds-db:connection
- Le rôle rds_iam n'est pas associé à l'utilisateur de la base de données
- La connexion est incorrecte
- Un rôle IAM incorrect est utilisé
Résolution
Remarque : Si des erreurs surviennent lorsque vous exécutez des commandes de l'interface de la ligne de commande AWS (AWS CLI), consultez la section Résoudre des erreurs liées à l’AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l'interface.
L'authentification IAM est désactivée
L'authentification IAM est désactivée par défaut. Activez l'authentification IAM pour votre instance Amazon RDS pour PostgreSQL ou votre cluster Aurora compatible avec PostgreSQL.
La stratégie IAM n'inclut pas l'action rds-db:connect
Pour utiliser l'authentification de base de données IAM pour vous connecter à votre instance de base de données, mettez à jour votre stratégie afin d'inclure l'action rds-db:connect.
Vous trouverez ci-dessous un exemple de politique :
{ "Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"rds-db:connect"
],
"Resource": [
" arn:aws:rds-db:region:account-id:dbuser:(DbiResourceId for RDS PostgreSQL or DbClusterResourceId for Aurora PostgreSQL)/db_user_name"
]
}
]
}
Remarque : Assurez-vous d'utiliser l'ID de ressource et l’Amazon Resource Name (ARN) corrects dans la politique.
Pour trouver l'ID de ressource d'une instance de base de données, sélectionnez l'instance de base de données ou le cluster sur la console Amazon RDS, puis choisissez l'onglet Configuration. Pour en savoir plus, consultez la section Création et utilisation d'une stratégie IAM pour l'accès à la base de données IAM.
Remarque : L'authentification IAM ne prend pas en charge les clés de contexte globales ou spécifiques à un service dans l'élément Condition des instructions de stratégie.
Le rôle rds_iam n'est pas associé à l'utilisateur de la base de données
Pour utiliser l'authentification IAM avec PostgreSQL, l’utilisateur de base de données doit endosser le rôle rds_iam. Pour confirmer que ce rôle est associé à l'utilisateur, exécutez la commande suivante dans le client PostgreSQL :
\du
La sortie attendue est la suivante :
List of rolesRole name | Attributes | Member of
----------------+------------------------------------------------------------+-------------------------------------------------------------
db_user_name | | {rds_iam}
postgres | Create role, Create DB | {rds_superuser}
| Password valid until infinity |
Vous pouvez également exécuter la requête suivante sur n'importe quelle plateforme :
SELECT r.rolname, ARRAY(
SELECT b.rolname
FROM pg_catalog.pg_auth_members m
JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
WHERE m.member = r.oid
) AS memberof
FROM pg_catalog.pg_roles r
WHERE r.rolname !~ '^pg_'
ORDER BY 1;
Pour créer un utilisateur et lui attribuer le rôle rds_iam role, exécutez la commande suivante :
CREATE USER db_user_name WITH LOGIN;GRANT rds_iam TO db_user_name;
La connexion est incorrecte
Les jetons d'authentification incluent plusieurs caractères qui peuvent être difficiles à utiliser dans la ligne de commande. À la place, enregistrez le jeton d'authentification dans une variable d'environnement. Puis, utilisez la variable d'environnement lorsque vous vous connectez à votre cluster Aurora PostgreSQL.
Vous trouverez ci-dessous un exemple de génération de jetons d'authentification avec des variables d'environnement :
export RDSHOST='aurorapostgresql.cluster-abcdef12ghi.us-east-1.rds.amazonaws.com'export PGPASSWORD="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 5432 --region us-east-1 --username db_user_name)"
psql "host=$RDSHOST port=5432 sslmode=verify-full sslrootcert=global-bundle.pem dbname=postgres user=db_user_name password=$PGPASSWORD"
Lorsque le client tente de se connecter à l'instance de base de données sans connexion SSL/TLS, le message d'erreur suivant s'affiche :
« FATAL: no pg_hba.conf entry for host "host.ip", user "<username>", database "postgres", SSL off FATAL: password authentication failed for user "db_user_name" »
L'authentification de la base de données IAM requiert une connexion SSL/TLS, car toutes les données transmises depuis et vers votre instance de base de données sont chiffrées. Pour éviter l'erreur précédente, assurez-vous d’utiliser une connexion SSL/TLS. Il est recommandé d'utiliser l'option sslmode comme verify-full et de fournir le certificat dans l'option sslrootcert de votre chaîne de connexion.
Pour télécharger le dernier certificat de l’autorité de certification (CA), consultez la section Utilisation de SSL/TLS pour chiffrer une connexion à un cluster de bases de données.
Un rôle IAM incorrect est utilisé
Il est possible que vous receviez un message d'erreur car vous utilisez un rôle IAM incorrect pour générer le jeton d'authentification. Pour vérifier le rôle endossé par l'utilisateur IAM actuel, exécutez la commande get-caller-identity :
aws sts get-caller-identity
Si le rôle endossé est incorrect, passez d'un utilisateur IAM au rôle IAM approprié ou endossez le rôle approprié. Si un message d'erreur persiste, vérifiez si le compte AWS fait partie d'une organisation AWS Organizations. Si le compte fait partie d'une organisation, créez une stratégie de contrôle des services (SCP) qui autorise rds-db:. Pour plus d'informations sur les SCP, consultez la section Effets de la SCP sur les autorisations.
Vérifiez également s'il existe une hiérarchie de l'utilisateur IAM qui ne possède pas l'autorisation rds-db. Pour plus d'informations, consultez la section Comment utiliser les stratégies de contrôle des services pour définir des barrières de protection d'autorisation sur les comptes de votre organisation AWS.
Si vous utilisez des limites d'autorisations pour les entités IAM, autorisez l'action rds-db:connect pour votre utilisateur ou votre rôle IAM. Pour modifier les limites d'autorisations d'un utilisateur, consultez la section Pour modifier la limite d'autorisations d'un utilisateur.