Plantillas de política de
Las plantillas de políticas son un nuevo constructo de IAM diseñado para definir los permisos temporales que los socios solicitan en las cuentas de los clientes. Al igual que las política de IAM habituales, definen los permisos mediante instrucciones con los elementos Effect, Action, Resource y Condition. La diferencia clave es que las plantillas de políticas incluyen parámetros (como @{bucketName}) que se sustituyen por valores reales al crear una solicitud de delegación.
Cómo funcionan las plantillas de políticas
Como parte del proceso de incorporación, registra sus plantillas de políticas en AWS. AWS asigna a cada plantilla un ARN único al que hace referencia al crear las solicitudes de delegación.
Al crear una solicitud de delegación, especifica lo siguiente:
El ARN de la plantilla de política
Los valores de los parámetros que se van a sustituir en la plantilla
AWS combina la plantilla con los valores de los parámetros para generar una política de IAM estándar. Los clientes revisan esta política renderizada final al aprobar su solicitud de delegación y comprueban exactamente qué permisos se van a conceder.
nota
La política renderizada final tiene un límite de tamaño máximo de 2048 caracteres.
A continuación, se muestra un ejemplo sencillo en el que se explica cómo funciona la sustitución de las plantillas.
Plantilla de política:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::@{bucketName}/*" } ] }
Parámetros proporcionados en la solicitud de delegación:
{ "Name": "bucketName", "Values": ["customer-data-bucket"], "Type": "String" }
Política renderizada final (lo que ven los clientes):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::customer-data-bucket/*" } ] }
Sintaxis de las plantillas
Las plantillas de políticas utilizan dos características clave para ofrecer flexibilidad: la sustitución de parámetros y las instrucciones condicionales. La sustitución de parámetros le permite definir marcadores de posición en la plantilla que se sustituyen por valores reales al crear una solicitud de delegación. Las instrucciones condicionales permiten incluir o excluir instrucciones de política completas en función de los valores de los parámetros.
Sustitución y tipos de parámetros
Utilice la sintaxis @{parameterName} para definir los parámetros de la plantilla de política. Al crear una solicitud de delegación, debe especificar el tipo de cada parámetro.
Cadena
Un valor único que se sustituye directamente en la plantilla.
Plantilla:
"Resource": "arn:aws:s3:::@{bucketName}/*"
Parámetros:
{ "Name": "bucketName", "Values": ["my-bucket"], "Type": "String" }
Resultado renderizado:
"Resource": "arn:aws:s3:::my-bucket/*"
StringList
Múltiples valores que generan varias entradas de recursos. Cuando se usa un parámetro StringList en el ARN de un recurso, se expande para crear entradas de recursos independientes para cada valor.
Plantilla:
"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/*" ]
Comportamiento de productos cruzados
Cuando se utilizan varios parámetros en el ARN del mismo recurso, los parámetros StringList crean un producto cruzado de todas las combinaciones.
Plantilla:
"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/*" ]
Instrucciones condicionales
Use la directiva @Enabled para incluir o excluir condicionalmente instrucciones completas en función de los valores de los parámetros.
Sintaxis:
@Enabled: "parameterName": incluya la instrucción cuando el valor del parámetro sea “True”.
@Enabled: "!parameterName": incluya la instrucción cuando el valor del parámetro NO sea “True” (negación).
Plantilla:
{ "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 (cuando ENABLE_S3_WRITE es “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 (cuando ENABLE_S3_WRITE es “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": "*" } ] }
Cuando ENABLE_S3_WRITE se establece en “True”, se incluye la instrucción condicional. Si se establece en “False”, la instrucción se excluye de la política renderizada.
Ejemplos adicionales
En los siguientes ejemplos se muestran los patrones comunes de uso de plantillas de políticas en la delegación temporal. Se centran en crear roles de IAM con límites de permisos para el acceso a largo plazo y muestran diferentes estrategias para limitar los permisos a recursos específicos. En estos ejemplos se ilustra cómo equilibrar la flexibilidad con la seguridad mediante técnicas como los prefijos de ARN, el etiquetado de recursos y las actualizaciones de límites de permisos.
Ejemplo 1: Concesión de acceso a largo plazo a recursos específicos
El siguiente límite de permisos se presenta como “SQSAccessorBoundary” para “partner.com”:
{ "Effect": "Allow", "Action": [ "sqs:DeleteMessage", "sqs:ReceiveMessage", "sqs:SendMessage" ], "Resource": "arn:aws:sqs:*:*:*", "Condition": { "StringEquals": { "aws:ResourceAccount": "${aws:PrincipalAccount}" } } }
nota
Esto incluye una condición de misma cuenta para evitar conceder acceso a las colas de otras cuentas con políticas de recursos abiertas. No se puede incluir una referencia directa al ID de cuenta del cliente porque el límite lo comparten todos los clientes y no se puede establecer una plantilla.
Como se trata de la primera versión de esta política, su ARN es arn:aws:iam::partner:policy/permissions-boundary/partner.com/SQSAccessorBoundary_2025_01_15
Se envía la siguiente plantilla de política para los permisos de acceso temporal:
{ "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" } } } ] }
Ejemplo 2: Uso de prefijos de ARN
El límite de permisos puede especificar el prefijo de ARN de un recurso para limitar el acceso:
"Resource": "arn:aws:sqs:*:@{AccountId}:PartnerPrefix*"
Esto limita el acceso solo a los recursos con ese prefijo, lo que reduce el alcance de los recursos accesibles.
Ejemplo 3: Uso de etiquetas para el control de acceso de los recursos
Puede etiquetar los recursos durante el acceso delegado temporal y confiar en esas etiquetas para el control de acceso a largo plazo.
Límite de permisos que permite el acceso a los recursos etiquetados:
{ "Effect": "Allow", "Action": [ "sqs:DeleteMessage", "sqs:ReceiveMessage", "sqs:SendMessage" ], "Resource": "arn:aws:sqs:*:*:*", "Condition": { "Null": { "aws:ResourceTag/ManagedByPartnerDotCom": "false" }, "StringEquals": { "aws:ResourceAccount": "${aws:PrincipalAccount}" } } }
Plantilla de política para etiquetar las nuevas colas al crearlas:
{ "Effect": "Allow", "Action": [ "sqs:CreateQueue", "sqs:TagQueue" ], "Resource": "arn:aws:sqs:*:*:*", "Condition": { "Null": { "aws:RequestTag/ManagedByPartnerDotCom": "false" } } }
Plantilla de política para etiquetar las colas preexistentes y crear el rol:
{ "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" } } } ] }
Este enfoque permite a los clientes confirmar de forma explícita a qué recursos específicos se puede acceder a largo plazo.
Ejemplo 4: Actualización del límite de permisos
Para actualizar un límite de permisos, registre una nueva versión con un sufijo de fecha nuevo y solicite permiso para sustituirlo.
Límite de permisos actualizado con permiso adicional:
{ "Effect": "Allow", "Action": [ "sqs:DeleteMessage", "sqs:PurgeQueue", "sqs:ReceiveMessage", "sqs:SendMessage" ], "Resource": "arn:aws:sqs:*:*:*", "Condition": { "StringEquals": { "aws:ResourceAccount": "${aws:PrincipalAccount}" } } }
Como segunda versión, esta política tiene el ARN arn:aws:iam::partner:policy/permissions-boundary/partner.com/SQSAccessorBoundary_2025_01_20
Plantilla de política para actualizar el límite de permisos del rol 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" } } } ] }
Los clientes deben aprobar esta solicitud de delegación para actualizar el límite de permisos del rol existente.