Exemples d’utilisation de l’ABAC avec des tables et des 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 de l’ABAC avec des tables et des index DynamoDB

Les exemples suivants illustrent certains cas d’utilisation pour la mise en œuvre 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 condition aws:ResourceTag/tag-key, vous pouvez comparer la paire clé-valeur de balise spécifiée dans une politique IAM avec la paire clé-valeur attachée dans une table DynamoDB. Par exemple, vous pouvez autoriser une action spécifique, par exemple si les conditions des balises correspondent dans une politique IAM et dans une table. PutItem Effectuez les étapes suivantes pour ce faire :

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 une balise à cette table. 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.

    JSON
    JSON
    { "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’action PutItem 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. Analysez la table 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 l'CreateTableAPI pour 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 une balise à cette table. Dans l'exemple suivant, l'TagResourceAPI ajoute la paire clé-valeur de balise 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.

    JSON
    JSON
    { "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’action PutItem 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 l'PutItemAPI pour placer un élément 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. Analysez la table 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 pour Python (Boto3)
  1. Créer une table . L'exemple suivant utilise l'CreateTableAPI pour 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 une balise à cette table. Dans l'exemple suivant, l'TagResourceAPI ajoute la paire clé-valeur de balise 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.

    JSON
    JSON
    { "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’action PutItem 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 l'PutItemAPI pour placer un élément 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. Analysez la table pour vérifier si l’élément y a été ajouté.

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

Si ABAC n'est pas activé pour vous Compte AWS, les conditions de balise de la politique IAM et de la table DynamoDB ne correspondent pas. Par conséquent, l’action PutItem renvoie le code AccessDeniedException en raison de l’effet de la politique 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.
Avec l’ABAC

Si ABAC est activé 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’action PutItem si les conditions de balise de la politique IAM 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. Vous pouvez autoriser une action spécifique, telle que CreateTable, en utilisant aws:RequestTag si les conditions de la balise ne correspondent pas. Effectuez les étapes suivantes pour ce faire :

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.

    JSON
    JSON
    { "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 pour 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.

    JSON
    JSON
    { "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 l’ABAC

Si ABAC 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 demande CreateTable é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 l’ABAC

Si ABAC est activé 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 la balise "Owner": "John" est présente dans la demande CreateTable, la politique en ligne permet à l’utilisateur John d’effectuer 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 politique IAM. Vous pouvez refuser une action spécifique, par exemple CreateTable, avec aws:TagKeys si une clé de balise spécifique n’est pas présente dans la demande. Effectuez les étapes suivantes pour ce faire :

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

    JSON
    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" } } } ] }
  2. Assumez le rôle auquel la politique était attachée et créez une table avec la clé de balise 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 pour Python (Boto3)
  1. Ajoutez une politique gérée par le client à un rôle auquel est attachée la politique AWS gérée d'AmazonDynamoDBFullaccès, comme indiqué dans l'exemple suivant.

    JSON
    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" } } } ] }
  2. Assumez le rôle auquel la politique était attachée et créez une table avec la clé de balise 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' }, ], )
Sans l’ABAC

Si 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 condition Null garantit que la condition a la valeur false s’il n’y a pas de clés de balise dans la demande. Comme la politique Deny ne correspond pas, la commande create-table s’exécute correctement.

Avec l’ABAC

Si ABAC est activé 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 conditions, CostCenter, présente dans la politique Deny. La clé de balise Title ne correspond pas à la clé de balise présente dans la politique Deny à cause de l’opérateur StringNotEquals. Par conséquent, l’action CreateTable échoue et votre table n’est pas créée. L’exécution de la commande create-table renvoie le message d’erreur 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.