Estou recebendo um erro de acesso negado quando tento me conectar ao Amazon RDS for MySQL usando autenticação IAM

Data da última atualização: 20/08/2021

Estou tentando me conectar à minha instância do Amazon Relational Database Service (Amazon RDS) for MySQL usando a autenticação do AWS Identity Access Management (IAM). No entanto, continuo recebendo um erro de “Acesso negado”:

ERRO 1045 (28000):Acesso negado para o usuário 'root'@'10.0.4.253' (usando senha: SIM)

Como corrigir isso?

Descrição breve

Se você não conseguir se conectar a uma instância de banco de dados do Amazon RDS for MySQL ou Aurora usando a autenticação do IAM, confira os seguintes motivos:

  • A autenticação do IAM está desabilitada
  • Permissões de função IAM insuficientes
  • Usuário do banco de dados está configurado incorretamente
  • String de conexão incorreta

Resolução

A autenticação do IAM está desabilitada

Por padrão, a autenticação do IAM está desabilitada. Analise as definições de configuração do cluster do Amazon RDS for MySQL e verifique se a autenticação do IAM está habilitada. No console do Amazon RDS, você pode modificar a instância escolhendo Autenticação de banco de dados. Em seguida, escolha Senha e autenticação de banco de dados do IAM e Continuar para atualizar as configurações.

Observação: se você escolher Aplicar imediatamente ao atualizar as definições de configuração do cluster, todas as modificações pendentes serão aplicadas imediatamente (em vez de durante uma janela de manutenção). Esta ação pode causar uma interrupção prolongada para sua instância do Amazon RDS for MySQL. Para obter mais informações, consulte Uso da configuração Aplicar imediatamente.

Permissões de função IAM insuficientes

Para se conectar com êxito à sua instância do Amazon RDS for MySQL 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 or DbClusterResourceId)/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 de recurso de uma instância de banco de dados, escolha a guia Recurso no console de gerenciamento da AWS. Em seguida, escolha a guia 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 Criação e uso de uma política do IAM para acesso ao banco de dados do IAM.

Usuário do banco de dados está configurado incorretamente

Com o Amazon RDS for MySQL, a autenticação do IAM é tratada pelo AWSAuthenticationPlugin. Portanto, para se conectar à sua instância do Amazon RDS for MySQL usando a autenticação do IAM, você deve usar o AWSAuthenticationPlugin. Para confirmar se esse plugin está associado à sua função do IAM, execute o seguinte comando:

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

Sua saída ficará assim:

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

Se a função do IAM estiver restrita ao uso de um host específico, verifique se você está usando o nome de host correto. Além disso, verifique se você tem as permissões adequadas para acessar o banco de dados especificado.

Para exibir as permissões concedidas a um usuário, use a seguinte sintaxe de comando:

show grants for <user>;

Para conceder privilégios a outro usuário, use a seguinte sintaxe de comando:

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

String de conexão incorreta

Ao se conectar ao banco de dados do Amazon RDS for MySQL, você deve usar a opção --enable-cleartext-plugin na cadeia de conexão. A sintaxe--enable-cleartext-plugin é usada para passar a senha, agindo como um token de autenticação.

Por exemplo:

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

A sintaxe --enable-cleartext-plugin também indica que o AWSAuthenticationPlugin deve ser usado para a conexão de banco de dados. O plugin é necessário ao configurar o usuário do banco de dados e é necessário para que a autenticação do IAM funcione. Se o AWSAuthenticationPlugin estiver configurado incorretamente, a autenticação do IAM não funcionará. Como resultado, você receberá um erro Acesso negado ao tentar se conectar ao banco de dados.

Além disso, como os tokens de autenticação consistem em vários caracteres (o que pode ser desordenado na linha de comando), salve o token em uma variável de ambiente. Em seguida, use essa variável ao se conectar à sua instância de banco de dados MySQL. Por exemplo:

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

Para obter mais informações sobre como se conectar a uma instância de banco de dados MySQL usando uma variável de ambiente, consulte Estabelecendo conexão a uma instância de banco de dados.