¿Cómo se soluciona el error AccessDeniedException que se produce al intentar obtener acceso a una tabla de Amazon DynamoDB?

Actualización más reciente: 29 de agosto de 2022

Al intentar obtener acceso a una tabla de Amazon DynamoDB, aparece el error AccessDeniedException.

Descripción breve

Es posible que este error se produzca debido a las siguientes razones:

  • El rol de AWS Identity and Access Management (IAM) que utilizó para obtener acceso a la tabla de DynamoDB no cuenta con los permisos necesarios.
  • El acceso a la tabla de DynamoDB está restringido a nivel de organización.
  • La política asociada al punto de conexión de Amazon Virtual Private Cloud (Amazon VPC) para DynamoDB restringe la operación.
  • Activó la autenticación multifactor (MFA) e intentó acceder a la tabla sin iniciar sesión con MFA.
  • Utiliza una clave administrada por el cliente o una clave administrada de AWS para proteger las tablas de DynamoDB.

Resolución

El rol de IAM no cuenta con los permisos necesarios

DynamoDB no admite políticas basadas en recursos. Al crear una tabla de DynamoDB, asegúrese de conceder los permisos necesarios al rol de IAM que se utiliza para obtener acceso a la tabla. Las políticas se pueden asociar a usuarios, grupos o roles de IAM y así otorgar los permisos requeridos. Para obtener más información, consulte Utilizar políticas basadas en la identidad (políticas de IAM) con Amazon DynamoDB.

Es posible utilizar un script de la Interfaz de la línea de comandos de AWS (AWS CLI) para solucionar los errores de las llamadas a la API de permisos de IAM.

Nota: Este script de AWS CLI requiere el procesador JSON de la línea de comandos jq. Para conocer el tutorial y las instrucciones de descarga, consulte Formato de salida JSON. Para las distribuciones que utilizan el paquete yum, ejecute el siguiente comando:

$ sudo yum install jq

Ejecute el siguiente comando de 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'",'

Nota: Asegúrese de sustituir your-ARN por el ARN de IAM de los recursos.

La salida de este comando tiene un aspecto similar al siguiente:

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

El primer mensaje de este ejemplo indica que no se puede realizar la acción ListTables porque se asoció un permiso al usuario 111122223333 que deniega esta operación. El segundo mensaje indica que ninguna política basada en la identidad permite la acción dynamodb:ListTables.

Nota: Si se producen errores al ejecutar los comandos de AWS CLI, asegúrese de que utiliza la versión más reciente de AWS CLI.

Utilice las siguientes prácticas recomendadas para asegurarse de que el rol de IAM cuenta con los permisos necesarios para obtener acceso a la tabla de DynamoDB:

  • Asegúrese de que el rol de IAM no está incluido en ninguna instrucción DENY de la política de confianza.
  • Asegúrese de que el rol de IAM está incluido en la instrucción ALLOW de la política de confianza.
  • Asegúrese de que todas las condiciones de IAM especificadas en la instrucción ALLOW son compatibles con la acción de la API sts:AssumeRole.
  • Si intenta obtener acceso a la tabla de DynamoDB a través de AWS CLI, asegúrese de haber utilizado el ID de la clave de acceso y la clave de acceso secreta correctos.

Para obtener más información, consulte ¿Cómo se pueden obtener datos que sirvan de ayuda para solucionar los errores de acceso denegado o no autorizado de IAM?

El acceso a la tabla de DynamoDB está restringido a nivel de la organización

Si obtiene el siguiente error al intentar obtener acceso a la tabla de DynamoDB, significa que el acceso se ha denegado debido a una política de control de servicios.

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 este problema, revise la política definida a nivel de la organización.

Nota: Si se deniegan las operaciones de DynamoDB a nivel de la organización, ninguno de los roles de IAM presentes en esa organización o cuenta de AWS podrá obtener acceso a DynamoDB, incluso al contar con los permisos necesarios.

La política de punto de conexión de Amazon VPC restringe el funcionamiento

Puede utilizar una VPC de Amazon para mejorar la privacidad y la seguridad a la hora de transferir datos entre la tabla de DynamoDB y la aplicación. Al crear el punto de conexión, puede optar por restringir el acceso a la tabla de ciertos usuarios al asociar una política de recursos de IAM con una denegación explícita o implícita al punto de conexión de VPC. Si restringió el acceso del usuario de IAM que intenta acceder a la tabla, aparecerá un error similar al siguiente:

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

Este error indica que hay una instrucción DENY explícita en la política del punto de conexión de VPC que deniega la operación ListTables al usuario Administrador.

Para ver la política de punto de conexión de VPC, ejecute el comando de AWS CLI describe-vpc-endpoints.

O

Haga lo siguiente:

  1. Abra la consola de Amazon VPC.
  2. En el panel de navegación, elija Puntos de conexión.
  3. Seleccione el punto de conexión de VPC.
  4. Elija la pestaña Política para ver la política de punto de conexión.

Intentó obtener acceso a la tabla sin iniciar sesión con MFA

Suponga que configuró MFA en la cuenta con la siguiente política basada en la identidad:

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

En este caso, se deniegan todas las acciones, excepto las que se requieren para la autenticación mediante MFA. Si el usuario de IAM no inició sesión con MFA, se denegarán todas las acciones que no estén incluidas en la política mencionada, incluidas las acciones de DynamoDB.

La tabla de DynamoDB utiliza la clave administrada por el cliente o la clave administrada de AWS

Al crear una tabla de DynamoDB con una clave administrada por el cliente o una clave de AWS Key Management Service (AWS KMS), las políticas de esa clave de KMS deben conceder permiso a DynamoDB para utilizar la clave en su nombre.

Asegúrese de que el usuario de IAM que accede a la tabla tiene los siguientes permisos mínimos en la clave de AWS KMS:

  • DynamoDB utiliza la clave de AWS KMS para generar y cifrar una clave de datos única para la tabla, denominada clave de la tabla. Para generar y cifrar esta clave, debe contar con el permiso kms:GenerateDataKey.
  • La clave de la tabla se utiliza para proteger las claves de cifrado de datos que se utilizan para cifrar los datos de la tabla. Si se modifica la clave administrada por el cliente para una tabla, DynamoDB produce una nueva clave de tabla. Posteriormente, DynamoDB utiliza la nueva clave de la tabla para volver a cifrar las claves de cifrado de datos. Para realizar esta operación, debe tener el permiso kms:ReEncrypt.
  • DynamoDB utiliza la operación kms:DescribeKey para determinar si la clave administrada por el cliente seleccionada existe dentro de la cuenta y la región. Si se elimina la clave de forma aleatoria, la llamada DescribeKey devuelve un error.
  • DynamoDB utiliza concesiones para establecer permisos en una clave administrada por el cliente. Estos permisos de concesión se utilizan cuando DynamoDB realiza tareas de mantenimiento del sistema en segundo plano y de protección continua de datos. Los permisos de concesión también se utilizan para generar claves de tabla. Por lo tanto, asegúrese de contar con el permiso kms:CreateGrant.

Para obtener más información, consulte Cómo Amazon DynamoDB utiliza AWS KMS.


¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?