¿Cómo soluciono los problemas al conectarme a un clúster de Amazon RDS para PostgreSQL o de Aurora PostgreSQL mediante la autenticación de IAM?

6 minutos de lectura
0

Quiero conectarme a una instancia de Amazon Relational Database Service (Amazon RDS) para PostgreSQL o a un clúster de Amazon Aurora PostgreSQL-Compatible. Cuando intento conectarme mediante la autenticación de AWS Identity Access Management (IAM), aparece el error “PAM authentication failed for user” (Error de autenticación PAM para el usuario).

Descripción breve

Es posible que no pueda conectarse a su instancia de base de datos de Amazon RDS para PostgreSQL o Aurora mediante la autenticación de IAM por uno de los siguientes motivos:

  • Autenticación de IAM desactivada
  • Permisos de rol de IAM insuficientes o política incorrecta
  • Usuario de base de datos no configurado adecuadamente
  • Cadena de conexión incorrecta
  • Entidad de IAM incorrecta

Solución

La autenticación de IAM está desactivada

De forma predeterminada, la autenticación de IAM está desactivada. Revise los ajustes de configuración de su instancia de RDS para PostgreSQL o del clúster de Aurora PostgreSQL. Asegúrese de que la autenticación de IAM esté activada. En la consola de Amazon RDS, puede modificar la instancia de RDS o el clúster de Aurora al seleccionar Database Authentication (Autenticación de bases de datos). A continuación, elija IAM database authentication (Autenticación de bases de datos de IAM) y, después, Continue (Continuar) para actualizar los ajustes de configuración.

Nota: Cuando elige Apply Immediately (Aplicar inmediatamente) al actualizar la configuración del clúster, todas las modificaciones pendientes se aplican al instante. Esta acción no produce tiempo de inactividad.

Permisos de rol de IAM insuficientes

Para conectarse de forma correcta a la instancia de base de datos mediante la autenticación de bases 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 for RDS PostgreSQL or DbClusterResourceId for Aurora PostgreSQL)/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.

También, asegúrese de que utiliza el ID de recurso correcto (en lugar de especificar solo el ARN). Para encontrar el ID de recurso de una instancia de base de datos, elija la instancia o el clúster de base de datos en la consola de Amazon RDS. 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 mencionados en el ejemplo de política de IAM, consulte Creación y uso de una política de IAM para el acceso a bases de datos de IAM.

Nota: La autenticación de IAM no admite claves de contexto específicas del servicio que se puedan usar en el elemento condición de las declaraciones de política. La autenticación de IAM tampoco admite todas las claves de contexto de condición globales. Para obtener más información sobre las claves de contexto de condición globales, consulte Claves de contexto de condición globales de AWS en la Guía del usuario de IAM.

Usuario de base de datos no configurado adecuadamente

Para usar la autenticación de IAM con PostgreSQL, otorgue al usuario de la base de datos el rol rds_iam. Para confirmar que este rol está asociado al usuario, ejecute este comando:

Nota: Este comando solo se ejecuta en el cliente de PostgreSQL.

\du

El resultado es similar a esto:

List of roles
   Role name    |                         Attributes                         |                          Member of                          
-----------------+------------------------------------------------------------+-------------------------------------------------------------
db_user_name    |                                                            | {rds_iam}                                
postgres        | Create role, Create DB                                    +| {rds_superuser}          
                | Password valid until infinity                              |

También puede usar esta consulta, que se ejecuta en cualquier plataforma:

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) memberof
FROM pg_catalog.pg_roles r
WHERE r.rolname !~ '^pg_'
ORDER BY 1;

Para crear un usuario y otorgarle el rol rds_iam, ejecute este comando:

CREATE USER db_user_name WITH LOGIN; 
GRANT rds_iam TO db_user_name;

Cadena de conexión incorrecta

Los tokens de autenticación constan de varios caracteres que pueden resultar difíciles de manejar en la línea de comandos. En su lugar, guarde el token en una variable del entorno y, luego, utilice esa variable cuando se conecte a la instancia de base de datos de PostgreSQL.

Por ejemplo:

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"

Para obtener más información sobre cómo conectarse a una instancia de base de datos de PostgreSQL mediante una variable del entorno, consulte Conexión a un clúster de Aurora PostgreSQL.

Si aparece un error similar al de este ejemplo, significa que el cliente está intentando conectarse a la instancia de base de datos sin un certificado SSL.

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"

La autenticación de bases de datos de IAM requiere una conexión SSL y todos los datos que se transmiten hacia y desde la instancia de base de datos están cifrados. Para evitar este error, asegúrese de que la conexión utiliza SSL. Se recomienda utilizar la opción sslmode como verify-full y proporcionar el certificado en la opción sslrootcert de la cadena de conexión.

Para descargar el certificado de CA más reciente, consulte Uso de SSL/TLS para cifrar una conexión a un clúster de bases de datos.

Entidad de IAM incorrecta

Asegúrese de que el rol de IAM correcto genere el token de autenticación. Para comprobar el rol asumido por el usuario de IAM actual, ejecute este comando:

aws sts get-caller-identity

Si el rol asumido no es correcto, puede cambiar al usuario/rol de IAM correcto o asumir el rol correcto. Asegúrese de utilizar el rol de IAM correcto para generar el token de autenticación.

Si sigue apareciendo un error similar al de “error de autenticación PAM para el usuario”, compruebe si la cuenta de AWS forma parte de una organización de AWS Organizations. Si la cuenta forma parte de una organización, agregue rds-db:* al SCP de la organización. Para obtener más información, consulte Creación, actualización y eliminación de políticas de control de servicios.

Si la cuenta forma parte de una organización, compruebe si hay una jerarquía del usuario de IAM que no tenga el permiso rds-db. Para obtener más información, consulte How to use service control policies to set permission guardrails across accounts in your AWS Organization (Cómo utilizar las políticas de control de servicios para establecer barreras de protección de permisos en su organización de AWS).

Si utiliza límites de permisos para las entidades de IAM, asegúrese de que la acción rds-db:connect esté permitida para su usuario/rol de IAM. Para obtener más información sobre los límites de permisos, consulte Límites de permisos para las entidades de IAM. Para modificar los límites de permisos de un usuario, consulte Cambio del límite de permisos de un usuario.


OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año