Saltar al contenido

¿Cómo soluciono los errores cuando uso la autenticación de IAM para conectarme a una instancia de Amazon RDS para PostgreSQL o a un clúster de Aurora PostgreSQL?

7 minutos de lectura
0

Se producen errores cuando uso la autenticación de AWS Identity Access Management (IAM) para conectarme a mi instancia de Amazon Relational Database Service (Amazon RDS) para PostgreSQL o a un clúster de edición compatible con Amazon Aurora PostgreSQL.

Descripción breve

Es posible que se muestre el mensaje de error "PAM authentication failed for user" cuando ocurra lo siguiente:

  • La autenticación de IAM está desactivada
  • La política de IAM no incluye la acción rds-db:connect
  • El rol rds_iam no está asociado al usuario de la base de datos
  • La conexión es incorrecta
  • Se utiliza un rol de IAM incorrecto

Resolución

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulta Solución de errores de AWS CLI. Además, asegúrate de utilizar la versión más reciente de AWS CLI.

La autenticación de IAM está desactivada

De forma predeterminada, la autenticación de IAM está desactivada. Activa la autenticación de IAM en tu instancia de Amazon RDS para PostgreSQL o en un clúster compatible con Aurora PostgreSQL.

La política de IAM no incluye la acción rds-db:connect

Para usar la autenticación de bases de datos de IAM para conectarte a la instancia de base de datos, actualiza la política para incluir la acción rds-db:connect.

A continuación se muestra una política de 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: Asegúrate de utilizar el ID de recurso y el nombre de recurso de Amazon (ARN) correctos en la política.

Para buscar el ID de recurso de una instancia de base de datos, selecciona la instancia de base de datos o el clúster en la consola de Amazon Aurora y RDS y, a continuación, selecciona la pestaña Configuración. Para obtener más información, consulta 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 las claves de contexto de condición global específicas del servicio en el elemento de condición de las declaraciones de política.

El rol rds_iam no está asociado al usuario de la base de datos

Para usar la autenticación de IAM con PostgreSQL, el usuario de la base de datos debe asumir el rol rds_iam. Para confirmar que este rol está asociado al usuario, ejecuta el siguiente comando en el cliente PostgreSQL:

\du

El resultado esperado es el siguiente:

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

Para crear un usuario y conceder el rol rds_iam, ejecuta el siguiente comando:

CREATE USER db_user_name WITH LOGIN;
GRANT rds_iam TO db_user_name;

La conexión es incorrecta

Los tokens de autenticación incluyen varios caracteres que pueden resultar difíciles de usar en la línea de comandos. En su lugar, guarda el token de autenticación en una variable de entorno. A continuación, utiliza la variable de entorno cuando te conectes a tu clúster de Aurora PostgreSQL.

A continuación se muestra un ejemplo de generación de tokens de autenticación con variables de entorno:

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"

Cuando el cliente intenta conectarse a la instancia de base de datos sin una conexión SSL/TLS, aparece el siguiente error:

"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/TLS, porque todos los datos transmitidos hacia y desde tu instancia de base de datos están cifrados. Para evitar el error anterior, asegúrate de usar una conexión SSL/TLS. 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 autoridad de certificación (CA) más reciente, consulta Uso de SSL/TLS para cifrar una conexión a un clúster de base de datos.

Se utiliza un rol de IAM incorrecto

Es posible que recibas un mensaje de error porque estás usando un rol de IAM incorrecto para generar el token de autenticación. Para comprobar el rol asumido por el usuario de IAM actual, ejecuta el comando get-caller-identity:

aws sts get-caller-identity

Si el rol asumido es incorrecto, [cambie de un usuario de IAM al rol de IAM correcto o asuma el rol correcto](https://repost.aws/es/knowledge-center/iam-assume-role-cli). Si se sigue mostrando un mensaje de error, comprueba si la cuenta de AWS forma parte de una organización de AWS Organizations. Si la cuenta forma parte de una organización, crea una política de control de servicio (SCP) que permita rds-db:. Para obtener más información, consulta Efectos de las SCP en los permisos.

Además, comprueba si hay una jerarquía del usuario de IAM que no tenga el permiso rds-db:. Para obtener más información, consulte Cómo utilizar las políticas de control de servicio para establecer barreras de protección de permisos en las cuentas de su organización de AWS.

Si usas límites de permisos para las entidades de IAM, permite la acción rds-db:connect para tu usuario o rol de IAM. Para modificar los límites de permisos de un usuario, consulta Cómo modificar el límite de permisos de un usuario.

Conéctate desde una cuenta de AWS diferente

Si te conectas a un clúster compatible con Aurora PostgreSQL desde una cuenta de AWS diferente, genera el token de autenticación con las credenciales temporales de la cuenta del clúster. Ejecuta el comando de la CLI de AWS assume-role para asumir un rol en la cuenta del clúster:

aws sts assume-role \
    --role-arn arn:aws:iam::CLUSTER-ACCOUNT-ID:role/ROLE-NAME \
    --role-session-name cross-account-session

Nota: Sustituye CLUSTER-ACCOUNT-ID con el ID de la cuenta de AWS donde reside el clúster y ROLE-NAME por el nombre de su rol de IAM.

A continuación, exporta las credenciales temporales y genera el token de autenticación:

export AWS_ACCESS_KEY_ID=TEMPORARY-ACCESS-KEY
export AWS_SECRET_ACCESS_KEY=TEMPORARY-SECRET-KEY
export AWS_SESSION_TOKEN=TEMPORARY-SESSION-TOKEN

export PGPASSWORD="$(aws rds generate-db-auth-token --hostname CLUSTER-ENDPOINT --port 5432 --region REGION --username DB-USER-NAME)"

Nota: Sustituye ** TEMPORARY-ACCESS-KEY**, ** TEMPORARY-SECRET-KEY** y TEMPORARY-SESSION-TOKEN por los valores de salida assume-role. Sustituye CLUSTER-ENDPOINT con el punto de enlace del clúster, REGION con tu región de AWS y DB-USER-NAME con el nombre de usuario de la base de datos.

Si generas el token directamente con las credenciales de la cuenta de origen, recibirás el error “no se pudo autenticar con la contraseña” aunque todas las políticas de IAM y las relaciones de confianza estén configuradas correctamente. El token debe generarse a partir de credenciales que pertenezcan a la misma cuenta que el clúster.

Información relacionada

Autenticación de bases de datos de IAM para Aurora

Conectar tu clúster de base de datos mediante la autenticación de IAM

Para cambiar el límite de permisos de un usuario

OFICIAL DE AWSActualizada hace un año