Os exemplos a seguir descrevem alguns casos de uso para implementar condições baseadas em atributos usando tags.
Tópicos
Exemplo 1: permitir uma ação usando aws:ResourceTag
Usando a chave de condição aws:ResourceTag/tag-key
, é possível comparar o par de chave-valor da tag especificado em uma política do IAM com o par de chave-valor anexado a uma tabela do DynamoDB. Por exemplo, é possível permitir uma ação específica, como PutItem, caso haja correspondência das condições da tag em uma política do IAM e em uma tabela. Para fazer isso, execute as seguintes etapas:
-
Crie uma tabela. O exemplo a seguir usa o comando create-table da AWS CLI para criar uma tabela chamada
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
-
Adicione uma tag a essa tabela. O exemplo de comando tag-resource da AWS CLI a seguir adiciona o par de chave-valor de tag
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 -
Crie uma política em linha e adicione-a a um perfil que tenha a política gerenciada AmazonDynamoDBReadOnlyAccess pela AWS anexada a ela, conforme mostrado no exemplo a seguir.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "dynamodb:PutItem", "Resource": "arn:aws:dynamodb:*:*:table/*", "Condition": { "StringEquals": { "aws:ResourceTag/Title": "ProductManager" } } } ] }
Essa política permite a ação
PutItem
na tabela quando a chave e o valor da tag anexados à tabela correspondem às tags especificadas na política. -
Assuma o perfil com as políticas descritas na Etapa 3.
-
Use o comando put-item da AWS CLI para inserir um item na
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"} }} }'
-
Verifique a tabela para saber se o item foi adicionado a ela.
aws dynamodb scan --table-name myMusicTable --region
us-east-1
Sem ABAC
Se o ABAC não estiver habilitado para a Conta da AWS, as condições de tag na política do IAM e na tabela do DynamoDB não serão correspondentes. Consequentemente, a ação PutItem
exibirá uma AccessDeniedException
devido ao efeito da 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.
Com ABAC
Se o ABAC estiver habilitado para a Conta da AWS, a ação put-item
será concluída com êxito e adicionará um novo item à tabela. Isso ocorre porque a política em linha na tabela permite a ação PutItem
caso as condições de tag na política do IAM e na tabela coincidam.
Exemplo 2: permitir uma ação usando aws:RequestTag
Usando a chave de condição aws:RequestTag/tag-key, você pode comparar o par de chave-valor de tag que é transmitido em sua solicitação com o par de tags especificado na política do IAM. Por exemplo, você pode permitir uma ação específica, como CreateTable
, usando o aws:RequestTag
caso as condições de tag não coincidam. Para fazer isso, execute as seguintes etapas:
-
Crie uma política em linha e adicione-a a um perfil que tenha a política gerenciada AmazonDynamoDBReadOnlyAccess pela AWS anexada a ela, conforme mostrado no exemplo a seguir.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:CreateTable", "dynamodb:TagResource" ], "Resource": "arn:aws:dynamodb:*:*:table/*", "Condition": { "StringEquals": { "aws:RequestTag/Owner": "John" } } } ] }
-
Crie uma tabela que contenha o par de chave-valor de tag
"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
Sem ABAC
Se o ABAC não estiver habilitado para a Conta da AWS, as condições de tag na política em linha e na tabela do DynamoDB não vão coincidir. Consequentemente, a solicitação CreateTable
falhará e a tabela não será criada.
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.
Com ABAC
Se o ABAC estiver habilitado para a Conta da AWS, sua solicitação de criação de tabela será concluída com êxito. Como o par de chave-valor de tag "Owner": "John"
está presente na solicitação CreateTable
, a política em linha permite que o usuário John
realize a ação CreateTable
.
Exemplo 3: negar uma ação usando aws:TagKeys
Usando a chave de condição aws:TagKeys, você pode comparar as chaves de tag em uma solicitação com as chaves especificadas na política do IAM. Por exemplo, será possível negar uma ação específica, como CreateTable
, usando aws:TagKeys
se uma chave de tag específica não estiver presente na solicitação. Para fazer isso, execute as seguintes etapas:
-
Adicione uma política gerenciada pelo cliente a um perfil que tenha a política gerenciada AmazonDynamoDBFullAccess pela AWS anexada a ela, conforme mostrado no exemplo a seguir.
{ "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" } } } ] }
-
Assuma o perfil ao qual a política foi anexada e crie uma tabela com a chave de tag
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
Sem ABAC
Se o ABAC não estiver habilitado para a Conta da AWS, o DynamoDB não enviará as chaves de tag no comando create-table
ao IAM. A condição Null
garante que a condição seja avaliada como false
caso não haja tags na solicitação. Como a política Deny
não coincide, o comando create-table
é concluído com êxito.
Com ABAC
Se o ABAC estiver habilitado para a Conta da AWS, as chaves de tag transmitidas no comando create-table
serão enviadas ao IAM. A chave de tag Title
é avaliada em relação à chave de tag baseada em condições, CostCenter
, presente na política Deny
. A chave de tag Title
não corresponde à chave de tag presente na política Deny
por causa do operador StringNotEquals
. Portanto, a ação CreateTable
falha e sua tabela não é criada. A execução do comando create-table
exibe uma 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.