Como soluciono o erro AccessDeniedException ao acessar uma tabela do Amazon DynamoDB?
Quero acessar uma tabela do Amazon DynamoDB, mas recebo um erro AccessDeniedException.
Breve descrição
Você pode receber esse erro pelos seguintes motivos:
- O perfil do AWS Identity and Access Management (IAM) que você usou para acessar a tabela do DynamoDB não tem as permissões necessárias.
- O acesso à tabela do DynamoDB é restrito no nível organizacional.
- A política associada ao endpoint da Amazon Virtual Private Cloud (Amazon VPC) para o DynamoDB restringe a operação.
- Você ativou a autenticação multifator (MFA) e não usou a MFA para fazer login e acessar a tabela.
- Você usa uma chave gerenciada pelo cliente ou uma chave gerenciada pela AWS para proteger suas tabelas do DynamoDB.
- Você não consegue acessar o Amazon CloudWatch Contributor Insights para DynamoDB.
Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solucionar erros da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.
Resolução
O perfil do IAM não tem as permissões necessárias
Ao criar uma tabela do DynamoDB, conceda as permissões necessárias ao perfil do IAM que você usa para acessar a tabela. Você pode 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 Como usar políticas baseadas em identidade com o Amazon DynamoDB.
Para solucionar falhas de chamada de API de permissão do IAM, use um script 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'",'
substitua your-ARN pelo ARN do IAM para seus recursos.
Observação: o script da AWS CLI requer o processador JSON da linha de comando jq. Para ver o tutorial e as instruções de download, consulte Formato de saída JSON.
Para distribuições que usam o pacote yum, execute o seguinte comando:
$ sudo yum install jq
A saída desse comando é semelhante ao 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
Na saída anterior, você não pode realizar a ação ListTables porque anexou uma permissão ao usuário 111122223333 que nega a operação. A segunda mensagem significa que nenhuma política baseada em identidade permite a ação dynamodb:ListTables.
As práticas recomendadas a seguir são para garantir que seu perfil do IAM tenha as permissões necessárias para acessar a tabela do DynamoDB:
- Não inclua o perfil do IAM em nenhuma instrução DENY da política de confiança.
- Inclua o perfil do IAM na instrução ALLOW da política de confiança.
- Confirme se todas as condições do IAM especificadas na instrução ALLOW são compatíveis com a ação de API sts:AssumeRole.
- Se você usar a AWS CLI para acessar a tabela do DynamoDB, use o ID da chave de acesso e a chave de acesso secreta corretos.
Para mais informações, consulte Como posso obter dados para ajudar na solução de problemas de erros de acesso negado ou de não autorizado de permissões do IAM?
O acesso à tabela do DynamoDB é restrito no nível organizacional
Se você receber o erro a seguir ao tentar acessar a tabela do DynamoDB, isso quer dizer que uma política de controle de serviços (SCP) negou seu acesso:
“O usuário: arn:aws:iam::11111222333:user/Admin não está autorizado a executar: dynamodb:ListTables no recurso: arn:aws:dynamodb:us-east-1:11111222333:table com uma negação explícita em uma política de controle de serviços”
Para solucionar esse problema, atualize a política definida no nível organizacional.
Observação: se você negar as operações do DynamoDB no nível organizacional, todos os perfis do IAM presentes nessa organização ou na conta da AWS serão negados. Mesmo que o perfil ou a conta tenham as permissões necessárias, o perfil ou a conta serão negados.
A política de endpoint da Amazon VPC restringe a operação
Para aprimorar a privacidade e a segurança da transferência de dados entre a tabela do DynamoDB e sua aplicação, você pode usar uma Amazon VPC. Se o endpoint da VPC tiver uma política de recursos do IAM que restringe o acesso dos usuários do IAM à tabela, você receberá o seguinte erro:
“Ocorreu um erro (AccessDeniedException) ao chamar a operação PutLogEvents: o usuário: arn:aws:iam::111222333444:user/Admin não está autorizado a executar: dynamodb:ListTables no recurso: arn:aws:dynamodb:us-east-1:11111222333:table/* com uma negação explícita em uma política de endpoint da VPC”
Se você receber esse erro, há uma instruçã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 de endpoint da VPC, execute o comando describe-vpc-endpoints da AWS CLI. Ou conclua as etapas a seguir para visualizar a política no console:
- Abra o console da Amazon VPC.
- No painel de navegação, selecione Endpoints.
- Selecione o endpoint da VPC.
- Escolha a guia Política para revisar a política de endpoint.
Para resolver esse problema, atualize a política de endpoint da VPC.
Você não usou a MFA para fazer login e acessar a tabela
Supondo 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 usar a MFA para autenticação, são negadas. Se o usuário do IAM não estiver conectado com a MFA, todas as ações que não estão listadas na política acima serão negadas, incluindo as ações do DynamoDB.
Para resolver esse problema, faça login com a MFA.
Sua tabela do DynamoDB usa a chave gerenciada pelo cliente ou a chave gerenciada pela AWS
As tabelas do DynamoDB que usam uma chave gerenciada pelo cliente ou uma chave do AWS Key Management Service (AWS KMS) devem ter as permissões corretas. As políticas de chaves do KMS devem dar permissão ao DynamoDB para usar a chave em seu nome. O usuário do IAM que está acessando a tabela deve ter 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, chamada chave da tabela. Para gerar e criptografar essa chave, você precisa ter a permissão kms:GenerateDataKey.
- Para acessar chaves criptografadas, a chave do AWS KMS deve ter as permissões kms:Encrypt e kms:Decrypt.
- 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 usa a nova chave da tabela para criptografar novamente as chaves de criptografia de dados. Para realizar esta operação, você deve ter a permissão kms:ReEncrypt.
- O DynamoDB usa a operação kms:DescribeKey para determinar se a chave gerenciada pelo cliente que você selecionou 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 tarefas de manutenção do sistema em segundo plano e de proteção contínua dos 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 mais informações, consulte Como o Amazon DynamoDB usa o AWS KMS.
Você não pode acessar o CloudWatch Contributor Insights para DynamoDB
Se você receber o erro ao tentar acessar o CloudWatch Contributor Insights para DynamoDB, talvez você não tenha as permissões do IAM corretas. Para acessar o CloudWatch Contributor Insights, você deve ter as seguintes permissões:
Para mais informações, consulte CloudWatch Contributor Insights para DynamoDB: Como funciona
Observação: o DynamoDB não oferece suporte ao controle de acesso por atributo (ABAC). Além disso, as condições baseadas em tags não podem ser usadas para controlar o acesso nas tabelas. Em vez disso, use as condições da política do IAM para controle de acesso refinado (FGAC).
Informações relacionadas
IAM: Permite e nega acesso a vários serviços programaticamente e no console
Conteúdo relevante
- AWS OFICIALAtualizada há 8 meses
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há 2 meses
- AWS OFICIALAtualizada há 3 anos