View a markdown version of this page

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 d'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 un tableau. 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 de balise 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 en ligne et ajoutez-la à un rôle auquel est associée la stratégie AmazonDynamoDBReadOnlyAccess AWS gérée, comme illustré 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. L'TagResourceAPI de l'exemple suivant 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 en ligne et ajoutez-la à un rôle auquel est associée la stratégie AmazonDynamoDBReadOnlyAccess AWS gérée, comme illustré 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. L'TagResourceAPI de l'exemple suivant 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 en ligne et ajoutez-la à un rôle auquel est associée la stratégie AmazonDynamoDBReadOnlyAccess AWS gérée, comme illustré 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 d'AWS : RequestTag

À l'aide de la clé de RequestTag/tag-key condition aws :, 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 en ligne et ajoutez-la à un rôle auquel est associée la stratégie AmazonDynamoDBReadOnlyAccess AWS gérée, comme illustré 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 en ligne et ajoutez-la à un rôle auquel est associée la stratégie AmazonDynamoDBReadOnlyAccess AWS gérée, comme illustré 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 en ligne 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 se termine correctement. É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 d'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 la stratégie AmazonDynamoDBFullAccess AWS gérée est associée, comme illustré 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 la stratégie AmazonDynamoDBFullAccess AWS gérée est associée, comme illustré 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 create-table commande à 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.