

# Uso del control de acceso basado en atributos con DynamoDB
<a name="attribute-based-access-control"></a>

El [control de acceso basado en atributos (ABAC)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html) es una estrategia de autorización que define los permisos de acceso en función de las [condiciones de etiqueta](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.html) de las políticas basadas en la identidad u otras políticas de AWS, como las políticas basadas en recursos y las políticas de IAM de la organización. Puede asociar etiquetas a las tablas de DynamoDB, que después se evalúan en función de las condiciones basadas en etiquetas. Los índices asociados a una tabla heredan las etiquetas que agregue a la tabla. Puede agregar un máximo de 50 etiquetas para cada tabla de DynamoDB. El tamaño máximo admitido para todas las etiquetas de una tabla es de 10 KB. Para obtener más información sobre el etiquetado de recursos de DynamoDB y las restricciones de etiquetado, consulte [Etiquetado de recursos en DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.Operations.html) y [Restricciones de etiquetado en DynamoDB](Tagging.md#TaggingRestrictions).

Para obtener más información sobre cómo utilizar etiquetas para controlar el acceso a los recursos de AWS, consulte los siguientes temas en la Guía del usuario de IAM:
+ [Qué es ABAC para AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)
+ [Control de acceso a los recursos de AWS mediante etiquetas](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html)

Con ABAC, puede aplicar distintos niveles de acceso para que los equipos y aplicaciones realicen acciones en las tablas de DynamoDB con menos políticas. Puede especificar una etiqueta en el [elemento de condición](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html) de una política de IAM para controlar el acceso a las tablas o los índices de DynamoDB. Estas condiciones determinan el nivel de acceso que una entidad principal, un usuario o un rol de IAM tiene a las tablas y los índices de DynamoDB. Cuando una entidad principal de IAM realiza una solicitud de acceso a DynamoDB, las etiquetas del recurso y de la identidad se evalúan con respecto a las condiciones de etiqueta de la política de IAM. Posteriormente, la política entra en vigor solo si se cumplen las condiciones de etiqueta. De este modo, podrá crear una política de IAM que indique de forma efectiva una de las siguientes acciones:
+ *Permitir al usuario administrar solo los recursos que tengan una etiqueta con una clave `X` y un valor `Y`*.
+ *Denegar el acceso a todos los usuarios a los recursos etiquetados con una clave `X`*.

Por ejemplo, puede crear una política que permita a los usuarios actualizar una tabla solo si tiene el par clave-valor de etiqueta: `"environment": "staging"`. Puede utilizar la clave de condición [aws:ResourceTag](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) para permitir o denegar el acceso a una tabla en función de las etiquetas que estén asociadas a dicha tabla.

Puede incluir condiciones basadas en atributos al crear la política o, posteriormente, con la Consola de administración de AWS, la API de AWS, la AWS Command Line Interface (AWS CLI), AWS SDK o AWS CloudFormation.

El siguiente ejemplo permite la acción [UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html) en una tabla denominada `MusicTable` si incluye una clave de etiqueta con el nombre `environment` y el valor `production`.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:UpdateItem"
      ],
      "Resource": "arn:aws:dynamodb:*:*:table/MusicTable",
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/environment": "production"
        }
      }
    }
  ]
}
```

------

**Topics**
+ [¿Por qué debo utilizar ABAC?](#why-use-abac)
+ [Claves de condición para implementar ABAC con DynamoDB](#condition-keys-implement-abac)
+ [Consideraciones para utilizar ABAC con DynamoDB](#abac-considerations)
+ [Habilitación de ABAC en DynamoDB](abac-enable-ddb.md)
+ [Uso de ABAC con tablas e índices de DynamoDB](abac-implementation-ddb-tables.md)
+ [Ejemplos para utilizar ABAC con tablas e índices de DynamoDB](abac-example-use-cases.md)
+ [Solución de errores de ABAC común en tablas e índices de DynamoDB](abac-troubleshooting.md)

## ¿Por qué debo utilizar ABAC?
<a name="why-use-abac"></a>
+ **Administración de políticas más sencilla:** utilizará menos políticas porque no tendrá que crear políticas diferentes para definir el nivel de acceso de cada entidad principal de IAM.
+ **Control de acceso escalable:** el control de acceso de escalado es más fácil con ABAC porque no tiene que actualizar las políticas cuando crea nuevos recursos de DynamoDB. Puede utilizar etiquetas para autorizar el acceso a entidades principales de IAM que contengan etiquetas que coincidan con las etiquetas del recurso. Puede incorporar nuevas entidades principales de IAM o recursos de DynamoDB y aplicar las etiquetas adecuadas para conceder de forma automática los permisos necesarios sin tener que realizar ningún cambio de política.
+ **Administración de permisos detallada:** es una práctica recomendada [conceder el privilegio mínimo](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege) cuando se crean políticas. Con ABAC, puede crear etiquetas para la entidad principal de IAM y utilizarlas a fin de conceder acceso a acciones y recursos específicos que coincidan con las etiquetas de la entidad principal de IAM. 
+ **Alineación con el directorio corporativo:** puede asignar etiquetas con atributos de empleado existentes en el directorio corporativo para alinear las políticas de control de acceso con la estructura organizativa.

## Claves de condición para implementar ABAC con DynamoDB
<a name="condition-keys-implement-abac"></a>

Puede utilizar las siguientes claves de condición en las políticas de AWS para controlar el nivel de acceso a las tablas y los índices de DynamoDB:
+ [aws:ResourceTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag): controla el acceso en función de si el par clave-valor de la etiqueta en una tabla o un índice de DynamoDB coincide o no con la clave y el valor de la etiqueta de una política. Esta clave de condición es relevante para todas las API que operan en una tabla o un índice existente.

  Las condiciones `dynamodb:ResourceTag` se evalúan como si no hubiera asociado ninguna etiqueta a un recurso.
+ [aws:RequestTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag): permite comparar el par clave-valor de etiqueta que se ha pasado en la solicitud con el par de etiqueta que se especifica en la política. Esta clave de condición es relevante para las API que contienen etiquetas como parte de la carga útil de la solicitud. Estas API incluyen [CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html) y [TagResource](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TagResource.html).
+ [aws:TagKeys](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys): compara las claves de etiqueta de una solicitud con las claves que especifique en la política. Esta clave de condición es relevante para las API que contienen etiquetas como parte de la carga útil de la solicitud. Estas API incluyen `CreateTable`, `TagResource` y `UntagResource`.

## Consideraciones para utilizar ABAC con DynamoDB
<a name="abac-considerations"></a>

Cuando utilice ABAC con tablas o índices de DynamoDB, se aplicarán las siguientes consideraciones:
+ El etiquetado y ABAC no son compatibles con DynamoDB Streams.
+ El etiquetado y ABAC no son compatibles con las copias de seguridad de DynamoDB. Para utilizar ABAC con las copias de seguridad, le recomendamos que utilice [AWS Backup](https://docs.aws.amazon.com/aws-backup/latest/devguide/whatisbackup.html).
+ Las etiquetas no se conservan en las tablas restauradas. Debe agregar etiquetas a las tablas restauradas para poder utilizar las condiciones basadas en etiquetas en las políticas.

# Habilitación de ABAC en DynamoDB
<a name="abac-enable-ddb"></a>

En la mayoría de las Cuentas de AWS, ABAC está activado de forma predeterminada. Mediante la [consola de DynamoDB](https://console.aws.amazon.com/dynamodb/), puede confirmar si ABAC se ha habilitado para la cuenta. Para ello, asegúrese de abrir la consola de DynamoDB con un rol que tenga el permiso [dynamodb:GetAbacStatus](#required-permissions-abac). A continuación, abra la página **Configuración** de la consola de DynamoDB.

Si no ve la tarjeta **Control de acceso basado en atributos** o si esta muestra el estado **Activado**, significa que ABAC se ha habilitado para la cuenta. No obstante, si ve la tarjeta **Control de acceso basado en atributos** con el estado **Desactivado**, como se muestra en la siguiente imagen, ABAC no se ha habilitado para la cuenta.

## Control de acceso basado en atributos: no habilitado
<a name="abac-disabled-image"></a>

![\[Página Configuración en la consola de DynamoDB que muestra la tarjeta Control de acceso basado en atributos.\]](http://docs.aws.amazon.com/es_es/amazondynamodb/latest/developerguide/images/ddb-console-settings-page.png)


ABAC no se ha habilitado para las Cuentas de AWS cuyas condiciones basadas en etiquetas especificadas en las políticas basadas en identidad u otras políticas aún deban auditarse. Si ABAC no se ha habilitado para la cuenta, las condiciones basadas en etiquetas de las políticas destinadas a actuar en tablas o índices de DynamoDB se evalúan como si no hubiera etiquetas presentes para los recursos o las solicitudes de la API. Cuando ABAC se ha habilitado para la cuenta, las condiciones basadas en etiquetas de las políticas de la cuenta se evalúan teniendo en cuenta las etiquetas asociadas a las tablas o a las solicitudes de la API.

Para habilitar ABAC en la cuenta, le recomendamos que primero audite las políticas tal y como se describe en la sección [Auditoría de políticas](#policy-audit-for-abac). A continuación, incluya los [permisos necesarios para ABAC](#required-permissions-abac) en la política de IAM. Por último, realice los pasos descritos en [Habilitación de ABAC en la consola](#abac-enable-console) para habilitar ABAC en la cuenta en la región actual. Después de habilitar ABAC, podrá desactivarlo en los siete días naturales posteriores a la activación.

**Topics**
+ [Auditoría de las políticas antes de habilitar ABAC](#policy-audit-for-abac)
+ [Permisos de IAM necesarios para habilitar ABAC](#required-permissions-abac)
+ [Habilitación de ABAC en la consola](#abac-enable-console)

## Auditoría de las políticas antes de habilitar ABAC
<a name="policy-audit-for-abac"></a>

Antes de activar ABAC en la cuenta, audite las políticas para confirmar que las condiciones basadas en etiquetas que puedan existir en las políticas de la cuenta están configuradas según lo previsto. La auditoría de las políticas lo ayudará a evitar sorpresas derivadas de los cambios de autorización en los flujos de trabajo de DynamoDB una vez habilitado ABAC. Para ver ejemplos de utilización de condiciones basadas en atributos con etiquetas y el comportamiento antes y después de la implementación de ABAC, consulte [Ejemplos para utilizar ABAC con tablas e índices de DynamoDBEjemplos de casos de uso](abac-example-use-cases.md).

## Permisos de IAM necesarios para habilitar ABAC
<a name="required-permissions-abac"></a>

Necesita el permiso `dynamodb:UpdateAbacStatus` para habilitar ABAC en la cuenta en la región actual. Para confirmar si ABAC se ha habilitado en la cuenta, también debe tener el permiso `dynamodb:GetAbacStatus`. Con este permiso, puede ver el estado de ABAC de una cuenta en cualquier región. Necesitará estos permisos además del permiso necesario para acceder a la consola de DynamoDB.

La siguiente política de IAM concede el permiso para habilitar ABAC y ver el estado para una cuenta en la región actual.

```
{
"version": "2012-10-17", 		 	 	 &TCX5-2025-waiver;
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:UpdateAbacStatus",
                "dynamodb:GetAbacStatus"
             ],
            "Resource": "*"
        }
    ]
}
```

## Habilitación de ABAC en la consola
<a name="abac-enable-console"></a>

1. Inicie sesión en la Consola de administración de AWS y abra la consola de DynamoDB en [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/).

1. En el panel de navegación superior, elija la región para la que desea habilitar ABAC.

1. En el panel de navegación izquierdo, elija **Configuración**.

1. En la página **Configuración**, haga lo siguiente:

   1. En la tarjeta **Control de acceso basado en atributos**, elija **Habilitar**.

   1. En el cuadro **Confirmar la configuración del control de acceso basado en atributos**, elija **Habilitar** para confirmar la elección.

      Esto habilita ABAC para la región actual y la tarjeta **Control de acceso basado en atributos** muestra el estado **Activado**.

      Si desea desactivar ABAC después de habilitarlo en la consola, puede hacerlo en los siete días naturales posteriores a la activación. Para desactivarlo, elija **Deshabilitar** en la tarjeta **Control de acceso basado en atributos** de la página **Configuración**.
**nota**  
La actualización del estado de ABAC es una operación asíncrona. Si las etiquetas de las políticas no se evalúan de inmediato, es posible que tenga que esperar algún tiempo hasta que la aplicación de los cambios sea coherente.

# Uso de ABAC con tablas e índices de DynamoDB
<a name="abac-implementation-ddb-tables"></a>

En los pasos siguientes se muestra cómo configurar permisos con ABAC. En este escenario de ejemplo, agregará etiquetas a una tabla de DynamoDB y creará un rol de IAM con una política que incluya condiciones basadas en etiquetas. Después, probará los permisos permitidos en la tabla de DynamoDB mediante la coincidencia de las condiciones de etiqueta.

**Topics**
+ [Paso 1: Adición etiquetas a una tabla de DynamoDB](#abac-add-table-tags)
+ [Paso 2: Creación de un rol de IAM con una política que incluya condiciones basadas en etiquetas](#abac-create-iam-role)
+ [Paso 3: Prueba de los permisos permitidos](#abac-test-permissions)

## Paso 1: Adición etiquetas a una tabla de DynamoDB
<a name="abac-add-table-tags"></a>

Puede agregar etiquetas a tablas de DynamoDB nuevas o existentes mediante la Consola de administración de AWS, la API de AWS, la AWS Command Line Interface (AWS CLI), AWS SDK o AWS CloudFormation. Por ejemplo, el siguiente comando de la CLI [tag-resource](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/tag-resource.html) agrega una etiqueta a una tabla denominada `MusicTable`.

```
aws dynamodb tag-resource —resource-arn arn:aws:dynamodb:us-east-1:123456789012:table/MusicTable —tags Key=environment,Value=staging
```

## Paso 2: Creación de un rol de IAM con una política que incluya condiciones basadas en etiquetas
<a name="abac-create-iam-role"></a>

[Cree una política de IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html#access_policies_create-json-editor) mediante la clave de condición [aws:ResourceTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) para comparar el par clave-valor de la etiqueta que se especifica en la política de IAM con el par clave-valor que está asociado a la tabla. La siguiente política de ejemplo permite a los usuarios colocar o actualizar elementos en tablas si estas contienen el par clave-valor de etiqueta: `"environment": "staging"`. Si una tabla no tiene el par clave-valor de etiqueta especificado, estas acciones se deniegan.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:PutItem",
                "dynamodb:UpdateItem"
            ],
            "Resource": "arn:aws:dynamodb:*:*:table/*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/environment": "staging"
                }
            }
        }
    ]
}
```

------

## Paso 3: Prueba de los permisos permitidos
<a name="abac-test-permissions"></a>

1. Asocie la política de IAM a un usuario o rol de prueba en la Cuenta de AWS. Asegúrese de que la entidad principal de IAM que utiliza ya no tiene acceso a la tabla de DynamoDB a través de una política diferente.

1. Asegúrese de que la tabla de DynamoDB contiene la clave de etiqueta `"environment"` con un valor de `"staging"`.

1. Realice las acciones `dynamodb:PutItem` y `dynamodb:UpdateItem` en la tabla etiquetada. Estas acciones deberían realizarse de forma correcta si el par clave-valor de etiqueta `"environment": "staging"` está presente.

   Si lleva a cabo estas acciones en una tabla que no tiene el par clave-valor de etiqueta `"environment": "staging"`, se producirá el error `AccessDeniedException` en la solicitud.

También puede revisar los otros [casos de uso de ejemplo](abac-example-use-cases.md) descritos en la siguiente sección para implementar ABAC y realizar más pruebas.

# Ejemplos para utilizar ABAC con tablas e índices de DynamoDB
<a name="abac-example-use-cases"></a>

En los siguientes ejemplos se describen algunos casos de uso para implementar condiciones basadas en atributos mediante etiquetas.

**Topics**
+ [Ejemplo 1: Permitir una acción con aws:ResourceTag](#abac-allow-example-resource-tag)
+ [Ejemplo 2: Concesión de permiso a una acción mediante aws:RequestTag](#abac-allow-example-request-tag)
+ [Ejemplo 3: Denegación de una acción mediante aws:TagKeys](#abac-deny-example-tag-key)

## Ejemplo 1: Permitir una acción con aws:ResourceTag
<a name="abac-allow-example-resource-tag"></a>

Con la clave de condición `aws:ResourceTag/tag-key`, puede comparar el par clave-valor de etiqueta que está especificado en una política de IAM con el par clave-valor que está asociado con una tabla de DynamoDB. Por ejemplo, puede permitir una acción específica, como [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html), si las condiciones de etiqueta coinciden en una política de IAM y en una tabla. Para ello, siga estos pasos:

------
#### [ Using the AWS CLI ]

1. Crear una tabla. En el siguiente ejemplo se utiliza el comando [create-table](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/create-table.html) de la AWS CLI para crear una tabla denominada `myMusicTable`.

   ```
   aws dynamodb create-table \
     --table-name myMusicTable \
     --attribute-definitions AttributeName=id,AttributeType=S \
     --key-schema AttributeName=id,KeyType=HASH \
     --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \
     --region us-east-1
   ```

1. Agregue una etiqueta a esta tabla. El siguiente ejemplo de comando [tag-resource](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/tag-resource.html) de la AWS CLI agrega el par clave-valor de etiqueta `Title: ProductManager` a `myMusicTable`.

   ```
   aws dynamodb tag-resource --region us-east-1 --resource-arn arn:aws:dynamodb:us-east-1:123456789012:table/myMusicTable --tags Key=Title,Value=ProductManager
   ```

1. Cree una [política insertada](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies) y agréguela a un rol que tenga asociada la política administrada [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html) de AWS, como se muestra en el siguiente ejemplo.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": "dynamodb:PutItem",
         "Resource": "arn:aws:dynamodb:*:*:table/*",
         "Condition": {
           "StringEquals": {
             "aws:ResourceTag/Title": "ProductManager"
           }
         }
       }
     ]
   }
   ```

------

   Esta política permite la `PutItem` en la tabla cuando la clave y el valor de etiqueta asociados a la tabla coinciden con las etiquetas especificadas en la política.

1. Asuma el rol con las políticas descritas en el paso 3.

1. Utilice el comando [put-item](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/put-item.html) de la AWS CLI para colocar un elemento en `myMusicTable`.

   ```
   aws dynamodb put-item \
       --table-name myMusicTable --region us-east-1 \
       --item '{
           "id": {"S": "2023"},
           "title": {"S": "Happy Day"},
           "info": {"M": {
               "rating": {"N": "9"},
               "Artists": {"L": [{"S": "Acme Band"}, {"S": "No One You Know"}]},
               "release_date": {"S": "2023-07-21"}
           }}
       }'
   ```

1. Examine la tabla para comprobar si el elemento se ha agregado a ella.

   ```
   aws dynamodb scan --table-name myMusicTable  --region us-east-1
   ```

------
#### [ Using the AWS SDK for Java 2.x ]

1. Crear una tabla. En el siguiente ejemplo se utiliza la API [CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html) para crear una tabla denominada `myMusicTable`.

   ```
   DynamoDbClient dynamoDB = DynamoDbClient.builder().region(region).build();
   CreateTableRequest createTableRequest = CreateTableRequest.builder()
       .attributeDefinitions(
           Arrays.asList(
               AttributeDefinition.builder()
               .attributeName("id")
               .attributeType(ScalarAttributeType.S)
               .build()
           )
       )
       .keySchema(
           Arrays.asList(
               KeySchemaElement.builder()
               .attributeName("id")
               .keyType(KeyType.HASH)
               .build()
           )
       )
       .provisionedThroughput(ProvisionedThroughput.builder()
           .readCapacityUnits(5L)
           .writeCapacityUnits(5L)
           .build()
       )
       .tableName("myMusicTable")
       .build();
   
   CreateTableResponse createTableResponse = dynamoDB.createTable(createTableRequest);
   String tableArn = createTableResponse.tableDescription().tableArn();
   String tableName = createTableResponse.tableDescription().tableName();
   ```

1. Agregue una etiqueta a esta tabla. La API [TagResource](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TagResource.html) del siguiente ejemplo agrega el par clave-valor de etiqueta `Title: ProductManager` a `myMusicTable`.

   ```
   TagResourceRequest tagResourceRequest = TagResourceRequest.builder()
       .resourceArn(tableArn)
       .tags(
           Arrays.asList(
               Tag.builder()
               .key("Title")
               .value("ProductManager")
               .build()
           )
       )
       .build();
   dynamoDB.tagResource(tagResourceRequest);
   ```

1. Cree una [política insertada](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies) y agréguela a un rol que tenga asociada la política administrada [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html) de AWS, como se muestra en el siguiente ejemplo.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": "dynamodb:PutItem",
         "Resource": "arn:aws:dynamodb:*:*:table/*",
         "Condition": {
           "StringEquals": {
             "aws:ResourceTag/Title": "ProductManager"
           }
         }
       }
     ]
   }
   ```

------

   Esta política permite la `PutItem` en la tabla cuando la clave y el valor de etiqueta asociados a la tabla coinciden con las etiquetas especificadas en la política.

1. Asuma el rol con las políticas descritas en el paso 3.

1. Utilice la API [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html) para colocar un elemento en `myMusicTable`.

   ```
   HashMap<String, AttributeValue> info = new HashMap<>();
   info.put("rating", AttributeValue.builder().s("9").build());
   info.put("artists", AttributeValue.builder().ss(List.of("Acme Band","No One You Know").build());
   info.put("release_date", AttributeValue.builder().s("2023-07-21").build());
   
   HashMap<String, AttributeValue> itemValues = new HashMap<>();
   itemValues.put("id", AttributeValue.builder().s("2023").build());
   itemValues.put("title", AttributeValue.builder().s("Happy Day").build());
   itemValues.put("info", AttributeValue.builder().m(info).build());
   
   
   PutItemRequest putItemRequest = PutItemRequest.builder()
                   .tableName(tableName)
                   .item(itemValues)
                   .build();
   dynamoDB.putItem(putItemRequest);
   ```

1. Examine la tabla para comprobar si el elemento se ha agregado a ella.

   ```
   ScanRequest scanRequest = ScanRequest.builder()
                   .tableName(tableName)
                   .build();
                   
   ScanResponse scanResponse = dynamoDB.scan(scanRequest);
   ```

------
#### [ Using the AWS SDK para Python (Boto3) ]

1. Crear una tabla. En el siguiente ejemplo se utiliza la API [CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html) para crear una tabla denominada `myMusicTable`.

   ```
   create_table_response = ddb_client.create_table(
       AttributeDefinitions=[
           {
               'AttributeName': 'id',
               'AttributeType': 'S'
           },
       ],
       TableName='myMusicTable',
       KeySchema=[
           {
               'AttributeName': 'id',
               'KeyType': 'HASH'
           },
       ],
           ProvisionedThroughput={
           'ReadCapacityUnits': 5,
           'WriteCapacityUnits': 5
       },
   )
   
   table_arn = create_table_response['TableDescription']['TableArn']
   ```

1. Agregue una etiqueta a esta tabla. La API [TagResource](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TagResource.html) del siguiente ejemplo agrega el par clave-valor de etiqueta `Title: ProductManager` a `myMusicTable`.

   ```
   tag_resouce_response = ddb_client.tag_resource(
       ResourceArn=table_arn,
       Tags=[
           {
               'Key': 'Title',
               'Value': 'ProductManager'
           },
       ]
   )
   ```

1. Cree una [política insertada](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies) y agréguela a un rol que tenga asociada la política administrada [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html) de AWS, como se muestra en el siguiente ejemplo.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
           "Effect": "Allow",
           "Action": "dynamodb:PutItem",
           "Resource": "arn:aws:dynamodb:*:*:table/*",
           "Condition": {
               "StringEquals": {
               "aws:ResourceTag/Title": "ProductManager"
               }
           }
           }
       ]
       }
   ```

------

   Esta política permite la `PutItem` en la tabla cuando la clave y el valor de etiqueta asociados a la tabla coinciden con las etiquetas especificadas en la política.

1. Asuma el rol con las políticas descritas en el paso 3.

1. Utilice la API [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html) para colocar un elemento en `myMusicTable`.

   ```
   put_item_response = client.put_item(
       TableName = 'myMusicTable'
       Item = {
           'id': '2023',
           'title': 'Happy Day',
           'info': {
               'rating': '9',
               'artists': ['Acme Band','No One You Know'],
               'release_date': '2023-07-21'
           }
       }
   )
   ```

1. Examine la tabla para comprobar si el elemento se ha agregado a ella.

   ```
   scan_response = client.scan(
       TableName='myMusicTable'
   )
   ```

------

**Sin ABAC**  
Si ABAC no está habilitado para la Cuenta de AWS, las condiciones de etiquetado de la política de IAM y la tabla de DynamoDB no coinciden. En consecuencia, la acción `PutItem` devuelve `AccessDeniedException` debido al efecto de la política `AmazonDynamoDBReadOnlyAccess`.

```
An error occurred (AccessDeniedException) when calling the PutItem operation: User: arn:aws:sts::123456789012:assumed-role/DynamoDBReadOnlyAccess/Alice is not authorized to perform: dynamodb:PutItem on resource: arn:aws:dynamodb:us-east-1:123456789012:table/myMusicTable because no identity-based policy allows the dynamodb:PutItem action.
```

**Con ABAC**  
Si ABAC está habilitado para la Cuenta de AWS, la acción `put-item` se completa correctamente y agrega un nuevo elemento a la tabla. Esto se debe a que la política insertada en la tabla permite la acción `PutItem` si coinciden las condiciones de etiqueta de la política de IAM y de la tabla.

## Ejemplo 2: Concesión de permiso a una acción mediante aws:RequestTag
<a name="abac-allow-example-request-tag"></a>

Con la clave de condición [aws:RequestTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag), puede comparar el par clave-valor de etiqueta que se pasa en la solicitud con el par de etiquetas especificado en la política de IAM. Por ejemplo, puede permitir una acción específica, como `CreateTable`, mediante `aws:RequestTag` si las condiciones de etiqueta no coinciden. Para ello, siga estos pasos:

------
#### [ Using the AWS CLI ]

1. Cree una [política insertada](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies) y agréguela a un rol que tenga asociada la política administrada [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/ReadOnlyAccess.html) de AWS, como se muestra en el siguiente ejemplo.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "dynamodb:CreateTable",
                   "dynamodb:TagResource"
               ],
               "Resource": "arn:aws:dynamodb:*:*:table/*",
               "Condition": {
                   "StringEquals": {
                       "aws:RequestTag/Owner": "John"
                   }
               }
           }
       ]
   }
   ```

------

1. Cree una tabla que contenga el par clave-valor de etiqueta de `"Owner": "John"`.

   ```
   aws dynamodb create-table \
   --attribute-definitions AttributeName=ID,AttributeType=S \
   --key-schema AttributeName=ID,KeyType=HASH  \
   --provisioned-throughput ReadCapacityUnits=1000,WriteCapacityUnits=500 \
   --region us-east-1 \
   --tags Key=Owner,Value=John \
   --table-name myMusicTable
   ```

------
#### [ Using the AWS SDK para Python (Boto3) ]

1. Cree una [política insertada](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies) y agréguela a un rol que tenga asociada la política administrada [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html) de AWS, como se muestra en el siguiente ejemplo.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "dynamodb:CreateTable",
                   "dynamodb:TagResource"
               ],
               "Resource": "arn:aws:dynamodb:*:*:table/*",
               "Condition": {
                   "StringEquals": {
                       "aws:RequestTag/Owner": "John"
                   }
               }
           }
       ]
   }
   ```

------

1. Cree una tabla que contenga el par clave-valor de etiqueta de `"Owner": "John"`.

   ```
   ddb_client = boto3.client('dynamodb')
   
   create_table_response = ddb_client.create_table(
       AttributeDefinitions=[
           {
               'AttributeName': 'id',
               'AttributeType': 'S'
           },
       ],
       TableName='myMusicTable',
       KeySchema=[
           {
               'AttributeName': 'id',
               'KeyType': 'HASH'
           },
       ],
           ProvisionedThroughput={
           'ReadCapacityUnits': 1000,
           'WriteCapacityUnits': 500
       },
       Tags=[
           {
               'Key': 'Owner',
               'Value': 'John'
           },
       ],
   )
   ```

------

**Sin ABAC**  
Si ABAC no está habilitado para la Cuenta de AWS, las condiciones de etiquetado de la política insertada y la tabla de DynamoDB no coinciden. En consecuencia, se produce un error en la solicitud `CreateTable` y no se crea la tabla.

```
An error occurred (AccessDeniedException) when calling the CreateTable operation: User: arn:aws:sts::123456789012:assumed-role/Admin/John is not authorized to perform: dynamodb:CreateTable on resource: arn:aws:dynamodb:us-east-1:123456789012:table/myMusicTable because no identity-based policy allows the dynamodb:CreateTable action.
```

**Con ABAC**  
Si ABAC está habilitado para la Cuenta de AWS, la solicitud de creación de tabla se completa correctamente. Como el par clave-valor de etiqueta de `"Owner": "John"` está presente en la solicitud `CreateTable`, la política insertada permite al usuario `John` realizar la acción `CreateTable`.

## Ejemplo 3: Denegación de una acción mediante aws:TagKeys
<a name="abac-deny-example-tag-key"></a>

Con la clave de condición [aws:TagKeys](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys) puede comparar las claves de etiqueta de una solicitud con las claves especificadas en la política de IAM. Por ejemplo, puede denegar una acción específica, como `CreateTable`, mediante `aws:TagKeys` si una clave de etiqueta específica *no* está presente en la solicitud. Para ello, siga estos pasos:

------
#### [ Using the AWS CLI ]

1. Agregue una [política administrada por el cliente](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies) a un rol que tenga asociada la política administrada [AmazonDynamoDBFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBFullAccess.html) de AWS, como se muestra en el siguiente ejemplo.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Deny",
               "Action": [
                   "dynamodb:CreateTable",
                   "dynamodb:TagResource"
               ],
               "Resource": "arn:aws:dynamodb:*:*:table/*",
               "Condition": {
                   "Null": {
                       "aws:TagKeys": "false"
                   },
                   "ForAllValues:StringNotEquals": {
                       "aws:TagKeys": "CostCenter"
                   }
               }
           }
       ]
   }
   ```

------

1. Asuma el rol al que se ha asociado la política y cree una tabla con la clave de etiqueta `Title`.

   ```
   aws dynamodb create-table \
   --attribute-definitions AttributeName=ID,AttributeType=S \
   --key-schema AttributeName=ID,KeyType=HASH  \
   --provisioned-throughput ReadCapacityUnits=1000,WriteCapacityUnits=500 \
   --region us-east-1 \
   --tags Key=Title,Value=ProductManager \
   --table-name myMusicTable
   ```

------
#### [ Using the AWS SDK para Python (Boto3) ]

1. Agregue una [política administrada por el cliente](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies) a un rol que tenga asociada la política administrada [AmazonDynamoDBFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBFullAccess.html) de AWS, como se muestra en el siguiente ejemplo.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Deny",
               "Action": [
                   "dynamodb:CreateTable",
                   "dynamodb:TagResource"
               ],
               "Resource": "arn:aws:dynamodb:*:*:table/*",
               "Condition": {
                   "Null": {
                       "aws:TagKeys": "false"
                   },
                   "ForAllValues:StringNotEquals": {
                       "aws:TagKeys": "CostCenter"
                   }
               }
           }
       ]
   }
   ```

------

1. Asuma el rol al que se ha asociado la política y cree una tabla con la clave de etiqueta `Title`.

   ```
   ddb_client = boto3.client('dynamodb')
   
   create_table_response = ddb_client.create_table(
       AttributeDefinitions=[
           {
               'AttributeName': 'id',
               'AttributeType': 'S'
           },
       ],
       TableName='myMusicTable',
       KeySchema=[
           {
               'AttributeName': 'id',
               'KeyType': 'HASH'
           },
       ],
           ProvisionedThroughput={
           'ReadCapacityUnits': 1000,
           'WriteCapacityUnits': 500
       },
       Tags=[
           {
               'Key': 'Title',
               'Value': 'ProductManager'
           },
       ],
   )
   ```

------

**Sin ABAC**  
Si ABAC no está habilitado para la Cuenta de AWS, DynamoDB no envía las claves de etiqueta del comando `create-table` a IAM. La condición `Null` garantiza que la condición se evalúe como `false` si no hay claves de etiqueta en la solicitud. Como la política `Deny` no coincide, el comando `create-table` se completa correctamente.

**Con ABAC**  
Si ABAC está habilitado para la Cuenta de AWS, las claves de etiqueta pasadas en el comando `create-table` se pasan a IAM. La clave de etiqueta `Title` se evalúa con respecto a la clave de etiqueta basada en condiciones, `CostCenter`, presente en la política `Deny`. La clave de etiqueta `Title` no coincide con la clave de etiqueta presente en la política `Deny` debido al operador `StringNotEquals`. Por lo tanto, se produce un error en la acción `CreateTable` y la tabla no se crea. Al ejecutar el comando `create-table`, se devuelve `AccessDeniedException`.

```
An error occurred (AccessDeniedException) when calling the CreateTable operation: User: arn:aws:sts::123456789012:assumed-role/DynamoFullAccessRole/ProductManager is not authorized to perform: dynamodb:CreateTable on resource: arn:aws:dynamodb:us-east-1:123456789012:table/myMusicTable with an explicit deny in an identity-based policy.
```

# Solución de errores de ABAC común en tablas e índices de DynamoDB
<a name="abac-troubleshooting"></a>

En este tema se proporcionan consejos para la solución de problemas y errores comunes que puede encontrar al implementar ABAC en tablas o índices de DynamoDB.

## Las claves de condición específicas del servicio en las políticas producen un error
<a name="abac-troubleshooting-service-specific-keys"></a>

Las claves de condición específicas del servicio no se consideran claves de condición válidas. Si ha utilizado este tipo de claves en las políticas, se producirá un error. Para solucionar este problema, debe reemplazar las claves de condición específicas del servicio por una [clave de condición adecuada para implementar ABAC](attribute-based-access-control.md#condition-keys-implement-abac) en DynamoDB.

Por ejemplo, supongamos que ha utilizado la clave de condición `dynamodb:ResourceTag` en una [política insertada](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies) que realiza la solicitud [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html). Imagine que se produce el error `AccessDeniedException` en la solicitud. En el siguiente ejemplo se muestra la política insertada errónea con la clave de condición `dynamodb:ResourceTag`.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:PutItem"
            ],
            "Resource": "arn:aws:dynamodb:*:*:table/*",
            "Condition": {
                "StringEquals": {
                    "dynamodb:ResourceTag/Owner": "John"
                }
            }
        }
    ]
}
```

------

Para solucionar este problema, reemplace la clave de condición `dynamodb:ResourceTag` por `aws:ResourceTag`, como se muestra en el siguiente ejemplo.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:PutItem"
            ],
            "Resource": "arn:aws:dynamodb:*:*:table/*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/Owner": "John"
                }
            }
        }
    ]
}
```

------

## No se puede desactivar ABAC
<a name="abac-troubleshooting-unable-opt-out"></a>

Si se ha habilitado ABAC para la cuenta a través de Soporte, no podrá desactivarlo mediante la consola de DynamoDB. Para desactivarlo, póngase en contacto con [Soporte](https://console.aws.amazon.com/support).

Puede desactivar ABAC *solo si* se cumplen las siguientes condiciones:
+ Ha utilizado la forma de autoservicio de [activarlo a través de la consola de DynamoDB](abac-enable-ddb.md#abac-enable-console).
+ Efectúa la desactivación en los siete días naturales posteriores a la activación.