Exemples d'utilisation ABAC avec les tables et les index DynamoDB - Amazon DynamoDB

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Exemples d'utilisation ABAC avec les tables et les index DynamoDB

Les exemples suivants illustrent certains cas d'utilisation pour implémenter des conditions basées sur les attributs à l'aide de balises.

Exemple 1 : Autoriser une action à l'aide de aws : ResourceTag

À l'aide de la clé de aws:ResourceTag/tag-key condition, vous pouvez comparer la paire clé-valeur de balise spécifiée dans une IAM politique avec la paire clé-valeur attachée à une table DynamoDB. Par exemple, vous pouvez autoriser une action spécifique, par exemple si les conditions des balises correspondent dans une IAM politique et dans un tableau. PutItem Pour ce faire, effectuez les opérations suivantes :

Using the AWS CLI
  1. Créer une table . L'exemple suivant utilise la AWS CLI commande create-table pour créer une table nommée. 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
  2. Ajoutez un tag à ce tableau. L'exemple de AWS CLI commande tag-resource suivant ajoute la paire clé-valeur tag au. Title: ProductManager 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
  3. Créez une politique intégrée et ajoutez-la à un rôle auquel la politique AmazonDynamoDBReadOnlyAccess AWS gérée est attachée, comme indiqué dans l'exemple suivant.

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

    Cette politique autorise l'PutItemaction sur la table lorsque la clé de balise et la valeur associées à la table correspondent aux balises spécifiées dans la politique.

  4. Assumez le rôle avec les politiques décrites à l'étape 3.

  5. Utilisez la AWS CLI commande put-item pour placer un élément dans le. 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"} }} }'
  6. Scannez le tableau pour vérifier si l'élément y a été ajouté.

    aws dynamodb scan --table-name myMusicTable --region us-east-1
Using the AWS SDK for Java 2.x
  1. Créer une table . L'exemple suivant utilise le CreateTableAPIpour créer une table nomméemyMusicTable.

    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();
  2. Ajoutez un tag à ce tableau. TagResourceAPIDans l'exemple suivant, la paire clé-valeur de la balise est ajoutée Title: ProductManager au. myMusicTable

    TagResourceRequest tagResourceRequest = TagResourceRequest.builder() .resourceArn(tableArn) .tags( Arrays.asList( Tag.builder() .key("Title") .value("ProductManager") .build() ) ) .build(); dynamoDB.tagResource(tagResourceRequest);
  3. Créez une politique intégrée et ajoutez-la à un rôle auquel la politique AmazonDynamoDBReadOnlyAccess AWS gérée est attachée, comme indiqué dans l'exemple suivant.

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

    Cette politique autorise l'PutItemaction sur la table lorsque la clé de balise et la valeur associées à la table correspondent aux balises spécifiées dans la politique.

  4. Assumez le rôle avec les politiques décrites à l'étape 3.

  5. Utilisez le PutItemAPIpour placer un objet dans lemyMusicTable.

    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);
  6. Scannez le tableau pour vérifier si l'élément y a été ajouté.

    ScanRequest scanRequest = ScanRequest.builder() .tableName(tableName) .build(); ScanResponse scanResponse = dynamoDB.scan(scanRequest);
Using the AWS SDK for Python (Boto3)
  1. Créer une table . L'exemple suivant utilise le CreateTableAPIpour créer une table nomméemyMusicTable.

    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']
  2. Ajoutez un tag à ce tableau. TagResourceAPIDans l'exemple suivant, la paire clé-valeur de la balise est ajoutée Title: ProductManager au. myMusicTable

    tag_resouce_response = ddb_client.tag_resource( ResourceArn=table_arn, Tags=[ { 'Key': 'Title', 'Value': 'ProductManager' }, ] )
  3. Créez une politique intégrée et ajoutez-la à un rôle auquel la politique AmazonDynamoDBReadOnlyAccess AWS gérée est attachée, comme indiqué dans l'exemple suivant.

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

    Cette politique autorise l'PutItemaction sur la table lorsque la clé de balise et la valeur associées à la table correspondent aux balises spécifiées dans la politique.

  4. Assumez le rôle avec les politiques décrites à l'étape 3.

  5. Utilisez le PutItemAPIpour placer un objet dans lemyMusicTable.

    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' } } )
  6. Scannez le tableau pour vérifier si l'élément y a été ajouté.

    scan_response = client.scan( TableName='myMusicTable' )
Sans ABAC

Si ABAC ce n'est pas activé pour vous Compte AWS, les conditions de balise de la IAM politique et de la table DynamoDB ne correspondent pas. Par conséquent, l'PutItemaction renvoie un AccessDeniedException en raison de l'effet de la AmazonDynamoDBReadOnlyAccess politique.

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.
Avec ABAC

Si cette option ABAC est activée pour vous Compte AWS, l'put-itemaction se termine correctement et ajoute un nouvel élément à votre tableau. Cela est dû au fait que la politique intégrée de la table autorise l'PutItemaction si les conditions de balise de la IAM politique et de la table correspondent.

Exemple 2 : Autoriser une action à l'aide de aws : RequestTag

À l'aide de la RequestTagclé de condition aws : /tag-key, vous pouvez comparer la paire clé-valeur de balise transmise dans votre demande avec la paire de balises spécifiée dans la politique. IAM Par exemple, vous pouvez autoriser une action spécifique, par exemple en utilisant le aws:RequestTag si les conditions du tag ne correspondent pas. CreateTable Pour ce faire, effectuez les opérations suivantes :

Using the AWS CLI
  1. Créez une politique intégrée et ajoutez-la à un rôle auquel la politique AmazonDynamoDBReadOnlyAccess AWS gérée est attachée, comme indiqué dans l'exemple suivant.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:CreateTable", "dynamodb:TagResource" ], "Resource": "arn:aws:dynamodb:*:*:table/*", "Condition": { "StringEquals": { "aws:RequestTag/Owner": "John" } } } ] }
  2. Créez une table contenant la paire clé-valeur de balise 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 for Python (Boto3)
  1. Créez une politique intégrée et ajoutez-la à un rôle auquel la politique AmazonDynamoDBReadOnlyAccess AWS gérée est attachée, comme indiqué dans l'exemple suivant.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:CreateTable", "dynamodb:TagResource" ], "Resource": "arn:aws:dynamodb:*:*:table/*", "Condition": { "StringEquals": { "aws:RequestTag/Owner": "John" } } } ] }
  2. Créez une table contenant la paire clé-valeur de balise 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' }, ], )
Sans ABAC

Si ABAC ce n'est pas activé pour vous Compte AWS, les conditions de balise de la politique intégrée et de la table DynamoDB ne correspondent pas. Par conséquent, la CreateTable demande échoue et votre table n'est pas créée.

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.
Avec ABAC

Si cette option ABAC est activée pour vous Compte AWS, votre demande de création de table est terminée avec succès. Étant donné que la paire clé-valeur de balise "Owner": "John" est présente dans la CreateTable demande, la politique intégrée permet à l'utilisateur d'Johneffectuer l'action. CreateTable

Exemple 3 : Refuser une action à l'aide de aws : TagKeys

À l'aide de la clé de TagKeys condition aws :, vous pouvez comparer les clés de balise d'une demande avec les clés spécifiées dans la IAM politique. Par exemple, vous pouvez refuser une action spécifique, par exemple utiliser aws:TagKeys si une clé de balise spécifique n'est pas présente dans la demande. CreateTable Pour ce faire, effectuez les opérations suivantes :

Using the AWS CLI
  1. Ajoutez une politique gérée par le client à un rôle auquel la politique AmazonDynamoDBFullAccess AWS gérée est attachée, comme illustré dans l'exemple suivant.

    { "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" } } } ] }
  2. Assumez le rôle auquel la politique était attachée et créez une table avec la clé de baliseTitle.

    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 for Python (Boto3)
  1. Ajoutez une politique gérée par le client à un rôle auquel la politique AmazonDynamoDBFullAccess AWS gérée est attachée, comme illustré dans l'exemple suivant.

    { "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" } } } ] }
  2. Assumez le rôle auquel la politique était attachée et créez une table avec la clé de baliseTitle.

    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' }, ], )
Sans ABAC

S'il ABAC n'est pas activé pour vous Compte AWS, DynamoDB n'envoie pas les clés de balise de la commande àcreate-table. IAM La Null condition garantit que la condition est évaluée comme false s'il n'y a aucune clé de balise dans la demande. Comme la Deny politique ne correspond pas, la create-table commande s'exécute correctement.

Avec ABAC

Si cette option ABAC est activée pour vous Compte AWS, les clés de balise transmises dans la create-table commande sont transmises àIAM. La clé de balise Title est évaluée par rapport à la clé de balise basée sur les conditionsCostCenter, présente dans la Deny politique. La clé de balise Title ne correspond pas à la clé de balise présente dans la Deny politique à cause de l'StringNotEqualsopérateur. Par conséquent, l'CreateTableaction échoue et votre table n'est pas créée. L'exécution de la create-table commande renvoie unAccessDeniedException.

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.