Como soluciono o erro AccessDeniedException quando tento acessar uma tabela do Amazon DynamoDB?

7 minuto de leitura
0

Estou tentando acessar uma tabela do Amazon DynamoDB, mas recebo o erro AccessDeniedException.

Descrição breve

Este erro pode ocorrer devido aos seguintes motivos:

  • O perfil do AWS Identity and Access Management (IAM) usado para acessar a tabela do DynamoDB não tem as permissões necessárias.
  • O acesso à tabela do DynamoDB é restrito em nível de organização.
  • A política associada ao endpoint da Amazon Virtual Private Cloud (Amazon VPC) para DynamoDB restringe a operação.
  • Você ativou a autenticação multifator (MFA) e tentou acessar a tabela sem fazer login usando a MFA.
  • Você usa uma chave gerenciada pelo cliente ou uma chave gerenciada pela AWS para proteger suas tabelas do DynamoDB.

Resolução

O perfil do IAM não tem as permissões necessárias

O DynamoDB não oferece suporte a políticas baseadas em recursos. Ao criar uma tabela do DynamoDB, certifique-se de conceder as permissões necessárias ao perfil do IAM usado para acessar a tabela. É possível anexar as políticas a usuários, grupos ou perfis do IAM para conceder as permissões necessárias. Para obter mais informações, consulte Using identity-based policies (IAM policies) with Amazon DynamoDB (Usar políticas baseadas em identidade (políticas do IAM) com o Amazon DynamoDB).

Um script da AWS Command Line Interface (AWS CLI) pode ser usado para solucionar problemas de falhas de chamada de API causadas por permissões do IAM.

Observação: esse script da AWS CLI requer o processador de linha de comando JSON jq. Para obter o tutorial e as instruções de download, consulte JSON Output Format (Formato de saída JSON). Para distribuições que usam o pacote yum, execute o seguinte comando:

$ sudo yum install jq

Execute o seguinte comando da AWS CLI:

( echo "Time,Identity ARN,Event ID,Service,Action,Error,Message";
>   aws cloudtrail lookup-events --start-time "2022-08-04T13:23:00Z" --end-time "2022-08-04T13:27:00Z" --query "Events[*].CloudTrailEvent" --output text \
>     | jq -r ". | select(.userIdentity.arn == \"your-ARN\" and .eventType == \"AwsApiCall\" and .errorCode != null
>     and (.errorCode | ascii_downcase | (contains(\"accessdenied\") or contains(\"unauthorized\"))))
>     | [.eventTime, .userIdentity.arn, .eventID, .eventSource, .eventName, .errorCode, .errorMessage] | @csv"
> ) | column -t -s'",'

Observação: certifique-se de substituir seu ARN pelo ARN do IAM para seus recursos.

A saída desse comando é semelhante à seguinte:

Time                 Identity ARN                           Event ID                             Service                Action     Error Message 
2022-08-04T13:24:14Z arn:aws:iam::111122223333:user/article 42f420fe-ef06-43be-98a6-d5a0a90d7b4c dynamodb.amazonaws.com ListTables AccessDenied User: arn:aws:iam::111122223333:user/article is not authorized to perform: dynamodb:ListTables on resource: arn:aws:dynamodb:us-east-1:111122223333:table/* with an explicit deny in an identity-based policy
2022-08-04T13:51:22Z arn:aws:iam::111122223333:user/article b174e4e1-94a7-403e-a15f-1234aec796a6 dynamodb.amazonaws.com ListTables AccessDenied User: arn:aws:iam::111122223333:user/article is not authorized to perform: dynamodb:ListTables on resource: arn:aws:dynamodb:us-east-1:111122223333:table/* because no identity-based policy allows the dynamodb:ListTables action

A primeira mensagem neste exemplo significa que não é possível executar a ação ListTables porque você anexou uma permissão ao usuário 111122223333 que proíbe essa operação. A segunda mensagem significa que nenhuma política baseada em identidade permite a ação dynamodb:ListTables.

Observação: em caso de erros ao executar comandos da AWS CLI, certifique-se de estar utilizando a versão mais recente da AWS CLI.

Use as práticas recomendadas a seguir para garantir que seu perfil do IAM tenha as permissões necessárias para acessar a tabela do DynamoDB:

  • Verifique se o perfil do IAM não está incluído em nenhuma declaração DENY da política de confiança.
  • Verifique se o perfil do IAM está incluído na declaração ALLOW da política de confiança.
  • Verifique se todas as condições do IAM especificadas na declaração ALLOW são compatíveis com a ação da API sts:AssumeRole.
  • Se estiver tentando acessar a tabela do DynamoDB via AWS CLI, certifique-se de ter usado o ID da chave de acesso e a chave de acesso secreta corretos.

Para obter mais informações, consulte How can I get data to assist in troubleshooting IAM permission access denied or unauthorized errors? (Como posso obter dados para ajudar a solucionar erros de acesso negado ou não autorizado em permissões do IAM?)

O acesso à tabela do DynamoDB é restrito em nível de organização

Se você receber o erro a seguir ao tentar acessar a tabela do DynamoDB, o acesso foi negado devido a uma política de controle de serviço.

User: arn:aws:iam::11111222333:user/Admin is not authorized to perform: 
dynamodb:ListTables on resource: arn:aws:dynamodb:us-east-1:11111222333:table with an explicit deny in a service control policy

Para solucionar esse problema, verifique a política definida em nível de organização.

Observação: se você negar operações do DynamoDB em um nível de organização, nenhum dos perfis do IAM presentes nessa organização ou conta da AWS poderá acessar o DynamoDB, mesmo que tenha as permissões necessárias.

A política de endpoint da Amazon VPC restringe a operação

Você pode usar uma Amazon VPC para melhorar a privacidade e a segurança da transferência de dados entre a tabela do DynamoDB e a aplicação. Ao criar o endpoint, você pode optar por restringir o acesso à tabela a determinados usuários anexando uma política de recursos do IAM com uma negação explícita ou implícita ao endpoint da VPC. Se você restringiu o acesso ao usuário do IAM que está tentando acessar a tabela, receberá um erro semelhante ao seguinte:

An error occurred (AccessDeniedException) when calling the ListTables operation: User: arn:aws:iam::111222333444:user/Admin is not authorized to perform: dynamodb:ListTables on resource: arn:aws:dynamodb:us-east-1:11111222333:table/* with an explicit deny in a VPC endpoint policy

Esse erro indica que há uma declaração DENY explícita na política de endpoint da VPC que nega a operação ListTables para o usuário Admin.

Para visualizar a política do endpoint da VPC, execute o comando describe-vpc-endpoints da AWS CLI.

-ou-

Faça o seguinte:

  1. Abra o console da Amazon VPC.
  2. No painel de navegação, escolha Endpoints.
  3. Selecione o endpoint da VPC.
  4. Em seguida, escolha a guia Policy (Política) para revisar a política de endpoints.

Você tentou acessar a tabela sem fazer login usando a MFA

Suponha que você tenha configurado a MFA em sua conta com a seguinte política baseada em identidade:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyAllExceptListedIfNoMFA",
      "Effect": "Deny",
      "NotAction": [
        "iam:CreateVirtualMFADevice",
        "iam:EnableMFADevice",
        "iam:GetUser",
        "iam:ListMFADevices",
        "iam:ListVirtualMFADevices",
        "iam:ResyncMFADevice",
        "sts:GetSessionToken"
      ],
      "Resource": "",
      "Condition": {
        "BoolIfExists": {
          "aws:MultiFactorAuthPresent": "false"
        }
      }
    }
  ]
}

Nesse caso, todas as ações, exceto aquelas que são necessárias para autenticar usando a MFA, serão negadas. Se o usuário do IAM não tiver feito login com a MFA, todas as ações que não estiverem listadas na política acima serão negadas, incluindo as ações do DynamoDB.

A tabela do DynamoDB usa a chave gerenciada pelo cliente ou a chave gerenciada pela AWS

Quando você cria uma tabela do DynamoDB com uma chave gerenciada pelo cliente ou uma chave do AWS Key Management Service (AWS KMS), as políticas dessa chave do KMS devem conceder ao DynamoDB permissão para usar a chave em seu nome.

Certifique-se de que o usuário do IAM que está acessando a tabela tenha as seguintes permissões mínimas na chave do AWS KMS:

  • O DynamoDB usa a chave do AWS KMS para gerar e criptografar uma chave de dados exclusiva para a tabela que é chamada de chave da tabela. Para gerar e criptografar essa chave, é necessário ter a permissão kms:GenerateDataKey.
  • A chave da tabela é usada para proteger as chaves de criptografia de dados usadas para criptografar os dados da tabela. Se a chave gerenciada pelo cliente for modificada para uma tabela, o DynamoDB produzirá uma nova chave da tabela. Em seguida, o DynamoDB usará a nova chave da tabela para criptografar novamente as chaves de criptografia de dados. Para realizar essa operação, é necessário ter a permissão kms:ReEncrypt.
  • O DynamoDB usa a operação kms:DescribeKey para determinar se a chave gerenciada pelo cliente selecionada existe na conta e na região. Se a chave for removida aleatoriamente, a chamada DescribeKey retornará um erro.
  • O DynamoDB usa concessões para definir permissões em uma chave gerenciada pelo cliente. Essas permissões de concessão são usadas quando o DynamoDB executa em segundo plano tarefas de manutenção do sistema e proteção contínua de dados. As permissões de concessão também são usadas para gerar chaves de tabela. Portanto, certifique-se de ter a permissão kms:CreateGrant.

Para obter mais informações, consulte How Amazon DynamoDB uses AWS KMS (Como o Amazon DynamoDB usa o AWS KMS).


AWS OFICIAL
AWS OFICIALAtualizada há 2 anos