Modelos de políticas - AWS Identity and Access Management

Modelos de políticas

Os modelos de políticas são um novo constructo do IAM projetado para definir permissões temporárias que os parceiros solicitam nas contas dos clientes. Como as políticas regulares do IAM, elas definem permissões usando instruções com os elementos Effect, Action, Resource e Condition. A principal diferença é que os modelos de política incluem parâmetros (como @{bucketName}) que são substituídos por valores reais quando você cria uma solicitação de delegação.

Como funcionam os modelos de políticas

Como parte do processo de integração, você registra seus modelos de política com a AWS. A AWS atribui a cada modelo um ARN exclusivo ao qual você faz referência ao criar solicitações de delegação.

Ao criar uma solicitação de delegação, você especifica:

  • O ARN do modelo da política

  • Os valores de parâmetros a serem substituídos no modelo

A AWS combina o modelo com seus valores de parâmetros para gerar uma política padrão do IAM. Os clientes revisam essa política final renderizada ao aprovar sua solicitação de delegação, vendo exatamente quais permissões serão concedidas.

nota

A política renderizada final tem um limite de tamanho máximo de 2.048 caracteres.

Confira um exemplo simples que mostra como a substituição do modelo funciona.

Modelo de política:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::@{bucketName}/*" } ] }

Parâmetros fornecidos na solicitação de delegação:

{ "Name": "bucketName", "Values": ["customer-data-bucket"], "Type": "String" }

Política final renderizada (o que os clientes veem):

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::customer-data-bucket/*" } ] }

Sintaxe do modelo

Os modelos de política usam dois recursos principais para fornecer flexibilidade: substituição de parâmetros e instruções condicionais. A substituição de parâmetros permite que você defina espaços reservados em seu modelo que são substituídos por valores reais ao criar uma solicitação de delegação. As instruções condicionais permitem que você inclua ou exclua instruções de políticas inteiras com base nos valores dos parâmetros.

Substituição e tipos de parâmetros

Use a sintaxe @{parameterName} para definir parâmetros em seu modelo de política. Ao criar uma solicitação de delegação, você deve especificar o tipo de cada parâmetro.

String

Um valor único que é substituído diretamente no modelo.

Modelo:

"Resource": "arn:aws:s3:::@{bucketName}/*"

Parâmetros:

{ "Name": "bucketName", "Values": ["my-bucket"], "Type": "String" }

Resultado renderizado:

"Resource": "arn:aws:s3:::my-bucket/*"

StringList

Vários valores que geram várias entradas de recursos. Quando um parâmetro StringList é usado em um ARN de recurso, ele se expande para criar entradas de recursos separadas para cada valor.

Modelo:

"Resource": "arn:aws:s3:::@{bucketNames}/*"

Parâmetros:

{ "Name": "bucketNames", "Values": ["bucket-1", "bucket-2"], "Type": "StringList" }

Resultado renderizado:

"Resource": [ "arn:aws:s3:::bucket-1/*", "arn:aws:s3:::bucket-2/*" ]

Comportamento entre produtos

Quando vários parâmetros são usados no mesmo ARN de recurso, os parâmetros StringList criam um produto cruzado de todas as combinações.

Modelo:

"Resource": "arn:aws:s3:::@{bucketNames}/@{prefix}/*"

Parâmetros:

[ { "Name": "bucketNames", "Values": ["bucket-1", "bucket-2"], "Type": "StringList" }, { "Name": "prefix", "Values": ["data"], "Type": "String" } ]

Resultado renderizado:

"Resource": [ "arn:aws:s3:::bucket-1/data/*", "arn:aws:s3:::bucket-2/data/*" ]

Instruções condicionais

Use a diretiva @Enabled para incluir ou excluir condicionalmente instruções inteiras com base nos valores dos parâmetros.

Sintaxe:

  • @Enabled: “parameterName”: inclua a instrução quando o valor do parâmetro for “True”

  • @Enabled: “!parameterName”: inclua a instrução quando o valor do parâmetro NÃO for “True” (negação)

Modelo:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": "*" }, { "@Enabled": "ENABLE_S3_WRITE", "Effect": "Allow", "Action": ["s3:PutObject"], "Resource": "arn:aws:s3:::@{bucketName}/*" } ] }

Parâmetros (quando ENABLE_S3_WRITE for “True”):

[ { "Name": "bucketName", "Values": ["my-bucket"], "Type": "String" }, { "Name": "ENABLE_S3_WRITE", "Values": ["True"], "Type": "String" } ]

Resultado renderizado:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": "*" }, { "Effect": "Allow", "Action": ["s3:PutObject"], "Resource": "arn:aws:s3:::my-bucket/*" } ] }

Parâmetros (quando ENABLE_S3_WRITE for “False”):

[ { "Name": "bucketName", "Values": ["my-bucket"], "Type": "String" }, { "Name": "ENABLE_S3_WRITE", "Values": ["False"], "Type": "String" } ]

Resultado renderizado:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": "*" } ] }

Quando ENABLE_S3_WRITE for definido como “True”, a instrução condicional será incluída. Quando for definido como “False”, a instrução será excluída da política renderizada.

Exemplos adicionais

Os exemplos a seguir demonstram padrões comuns para o uso de modelos de políticas na delegação temporária. Eles focam a criação de perfis do IAM com limites de permissões para acesso de longo prazo e mostram estratégias diferentes para definir o escopo de permissões para recursos específicos. Esses exemplos ilustram como equilibrar flexibilidade e segurança usando técnicas como prefixos ARN, marcação de recursos e atualizações de limites de permissões.

Exemplo 1: concessão de acesso de longo prazo a recursos específicos

O limite de permissões abaixo é enviado como “SQSAccessorBoundar” para “partner.com”:

{ "Effect": "Allow", "Action": [ "sqs:DeleteMessage", "sqs:ReceiveMessage", "sqs:SendMessage" ], "Resource": "arn:aws:sqs:*:*:*", "Condition": { "StringEquals": { "aws:ResourceAccount": "${aws:PrincipalAccount}" } } }
nota

Isso inclui uma condição de mesma conta para evitar a concessão de acesso a filas em outras contas com políticas de recursos abertos. Uma referência direta ao ID da conta do cliente não pode ser incluída porque o limite é compartilhado entre todos os clientes e não pode ser modelado.

Como esta é a primeira versão dessa política, seu ARN é arn:aws:iam::partner:policy/permissions-boundary/partner.com/SQSAccessorBoundary_2025_01_15

O modelo de política abaixo foi enviado para permissões de acesso temporárias:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sqs:ListQueues" ], "Resource": "arn:aws:sqs:*:*:*" }, { "Effect": "Allow", "Action": [ "iam:CreateRole", "iam:PutRolePermissionsBoundary", "iam:PutRolePolicy" ], "Resource": "arn:aws:iam::@{AccountId}:role/partner.com/SQSAccessor", "Condition": { "StringEquals": { "iam:PermissionsBoundary": "arn:aws:iam::partner:policy/permissions-boundary/partner.com/SQSAccessorBoundary_2025_01_15" } } } ] }

Exemplo 2: uso de prefixos ARN

O limite de permissões pode especificar um prefixo ARN do recurso para limitar o acesso:

"Resource": "arn:aws:sqs:*:@{AccountId}:PartnerPrefix*"

Isso limita o acesso somente aos recursos com esse prefixo, reduzindo o escopo dos recursos acessíveis.

Exemplo 3: uso de tags para controle de acesso a recursos

Você pode marcar recursos durante o acesso delegado temporário e contar com essas tags para controle de acesso de longo prazo.

Limite de permissões que permite acesso a recursos marcados:

{ "Effect": "Allow", "Action": [ "sqs:DeleteMessage", "sqs:ReceiveMessage", "sqs:SendMessage" ], "Resource": "arn:aws:sqs:*:*:*", "Condition": { "Null": { "aws:ResourceTag/ManagedByPartnerDotCom": "false" }, "StringEquals": { "aws:ResourceAccount": "${aws:PrincipalAccount}" } } }

Modelo de política para marcar novas filas na criação:

{ "Effect": "Allow", "Action": [ "sqs:CreateQueue", "sqs:TagQueue" ], "Resource": "arn:aws:sqs:*:*:*", "Condition": { "Null": { "aws:RequestTag/ManagedByPartnerDotCom": "false" } } }

Modelo de política para marcar filas preexistentes e criar o perfil:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sqs:TagQueue" ], "Resource": "arn:aws:sqs:*:@{AccountId}:@{QueueName}", "Condition": { "ForAllValues:StringEquals": { "aws:TagKeys": "ManagedByPartnerDotCom" } } }, { "Effect": "Allow", "Action": [ "iam:CreateRole", "iam:PutRolePermissionsBoundary", "iam:PutRolePolicy" ], "Resource": "arn:aws:iam::@{AccountId}:role/partner.com/SQSAccessor", "Condition": { "StringEquals": { "iam:PermissionsBoundary": "arn:aws:iam::partner:policy/permissions-boundary/partner.com/SQSAccessorBoundary_2025_01_15" } } } ] }

Essa abordagem permite que os clientes confirmem explicitamente quais recursos específicos podem ser acessados no longo prazo.

Exemplo 4: atualização do limite de permissões

Para atualizar um limite de permissões, registre uma nova versão com um novo sufixo de data e solicite permissão para substituí-la.

Limite de permissões atualizado com permissão adicional:

{ "Effect": "Allow", "Action": [ "sqs:DeleteMessage", "sqs:PurgeQueue", "sqs:ReceiveMessage", "sqs:SendMessage" ], "Resource": "arn:aws:sqs:*:*:*", "Condition": { "StringEquals": { "aws:ResourceAccount": "${aws:PrincipalAccount}" } } }

Como segunda versão, a política tem o ARN: arn:aws:iam::partner:policy/permissions-boundary/partner.com/SQSAccessorBoundary_2025_01_20

Modelo de política para atualizar o limite de permissões no perfil existente:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iam:PutRolePermissionsBoundary" ], "Resource": "arn:aws:iam::@{AccountId}:role/partner.com/SQSAccessor", "Condition": { "StringEquals": { "iam:PermissionsBoundary": "arn:aws:iam::partner:policy/permissions-boundary/partner.com/SQSAccessorBoundary_2025_01_20" } } } ] }

Os clientes devem aprovar essa solicitação de delegação para atualizar o limite de permissões no perfil existente.