Como soluciono problemas ao me conectar ao Amazon RDS para PostgreSQL ou a um cluster do Aurora PostgreSQL usando a autenticação do IAM?

7 minuto de leitura
0

Quero me conectar à minha instância do Amazon Relational Database Service (Amazon RDS) para PostgreSQL ou a um cluster compatível com o Amazon Aurora PostgreSQL. Quando tento me conectar usando a autenticação do AWS Identity Access Management (IAM), recebo um erro “PAM authentication failed for user” (“Falha na autenticação do PAM para o usuário”).

Breve descrição

Talvez você não consiga se conectar à sua instância de banco de dados do Amazon RDS para PostgreSQL ou do Aurora usando a autenticação do IAM por um dos seguintes motivos:

  • A autenticação do IAM está desativada
  • Permissões de perfil do IAM insuficientes ou política incorreta
  • O usuário do banco de dados está configurado incorretamente
  • String de conexão incorreta
  • Entidade IAM incorreta

Resolução

Autenticação do IAM desativada

Por padrão, a autenticação do IAM está desativada. Revise as definições de configuração da sua instância do RDS para PostgreSQL ou do cluster do Aurora PostgreSQL. Certifique-se de que a autenticação do IAM esteja ativada. No console do Amazon RDS, você pode modificar o cluster do Aurora ou a instância do RDS escolhendo Database Authentication(Autenticação de banco de dados). Depois, escolha IAM database authentication (Autenticação de banco de dados do IAM) e Continue (Continuar) para atualizar as suas definições de configuração.

Observação: se você escolher Apply Immediately (Aplicar imediatamente) ao atualizar as suas definições de configuração do cluster, todas as modificações pendentes serão aplicadas imediatamente. Essa ação não resulta em tempo de inatividade.

Permissões de perfil do IAM insuficientes

Para se conectar à sua instância de banco de dados usando a autenticação de banco de dados do IAM, você deve ter acesso à ação rds-db:connect. A ação rds-db:connect permite conexões com a instância de banco de dados.

Por exemplo:

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

Observação: substitua db-user-name pelo usuário da conta do banco de dados associado à autenticação do IAM.

Além disso, verifique se você está usando o ID de recurso correto (em vez de especificar apenas o ARN). Para encontrar o ID do recurso de uma instância de banco de dados, escolha a instância de banco de dados ou cluster no console do Amazon RDS. Em seguida, escolha a guia Configuration (Configuração) para exibir o ID do recurso.

Para obter mais informações sobre os elementos listados no exemplo de política do IAM, consulte Creating and using an IAM policy for IAM database access (Comno criar e usar uma política do IAM para acesso ao banco de dados do IAM).

Observação: a autenticação do IAM não oferece suporte a chaves de contexto específicas do serviço que possam ser usadas no elemento de condição das declarações de política. A autenticação do IAM também não oferece suporte a todas as chaves de contexto de condição global. Para obter mais informações sobre chaves de contexto de condição global, consulte as AWS global condition context keys (Chaves de contexto de condição global da AWS) no Guia do usuário do IAM.

O usuário do banco de dados está configurado incorretamente

Para usar a autenticação do IAM com o PostgreSQL, conceda ao usuário do banco de dados o perfil rds_iam. Para confirmar se esse perfil está associado ao usuário, execute este comando:

Observação: esse comando é executado somente no cliente PostgreSQL.

\du

A sua saída é semelhante a esta:

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

Você também pode usar essa consulta, que é executada em qualquer 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 criar um usuário e conceder o perfil rds_iam, execute este comando:

CREATE USER db_user_name WITH LOGIN; 
GRANT rds_iam TO db_user_name;

String de conexão incorreta

Os tokens de autenticação consistem em vários caracteres que podem ser difíceis de usar na linha de comando. Em vez disso, salve o token em uma variável de ambiente e use essa variável ao se conectar à sua instância de banco de dados do PostgreSQL.

Por exemplo:

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 obter mais informações sobre como se conectar a uma instância de banco de dados do PostgreSQL usando uma variável de ambiente, consulte Connecting to an Aurora PostgreSQL cluster (Como estabelecer conexão a um cluster do Aurora PostgreSQL).

Se você receber um erro semelhante ao deste exemplo, é porque o cliente está tentando se conectar à instância de banco de dados sem 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"

A autenticação do banco de dados do IAM requer uma conexão SSL, e todos os dados transmitidos de e para sua instância de banco de dados são criptografados. Para evitar esse erro, verifique se a conexão está usando SSL. É uma prática recomendada usar a opção sslmode como verify-full e fornecer o certificado na opção sslrootcert em sua string de conexão.

Para baixar o certificado CA mais recente, consulte Using SSL/TLS to encrypt a connection to a DB cluster (Como usar o modo SSL/TLS para criptografar uma conexão com um cluster de banco de dados).

Entidade IAM incorreta

Certifique-se de que o token de autenticação esteja sendo gerado pelo perfil correto do IAM. Para verificar o perfil assumido pelo usuário atual do IAM, execute este comando:

aws sts get-caller-identity

Se o perfil assumido não estiver correto, você poderá mudar para o usuário/perfil correto do IAM ou assumir o perfil correto. Verifique se você está usando o perfil correto do IAM para gerar o token de autenticação.

Se você ainda receber um erro semelhante a “PAM authentication failed for your user” (“Falha na autenticação do PAM para seu usuário”), verifique se a conta da AWS faz parte de uma organização do AWS Organizations. Se a conta fizer parte de uma organização, adicione rds-db:* ao SCP da organização. Para obter mais informações, consulte Creating, updating, and deleting service control policies (Como criar, atualizar e excluir políticas de controle de serviço).

Se a conta fizer parte de uma organização, verifique se há uma hierarquia do usuário do IAM que não tenha a permissão rds-db. Para obter mais informações, consulte How to use service control policies to set permission guardrails across accounts in your AWS Organization (Como usar políticas de controle de serviço para definir barreiras de proteção de permissão entre contas no AWS Organizations).

Se você estiver usando limites de permissões para entidades IAM, certifique-se de que a ação rds-db:connect seja permitida para seu usuário/perfil do IAM. Para obter mais informações sobre limites de permissões, consulte Permissions boundaries for IAM entities (Limites de permissões para entidades IAM). Para modificar os limites de permissões de um usuário, consulte Changing the permissions boundary for a user (Como alterar o limite de permissões de um usuário).


AWS OFICIAL
AWS OFICIALAtualizada há um ano