정책 템플릿
정책 템플릿은 파트너가 고객의 계정에서 요청하는 임시 권한을 정의하도록 설계된 새로운 IAM 구문입니다. 일반 IAM 정책과 마찬가지로 Effect, Action, Resource 및 Condition 요소가 있는 문을 사용하여 권한을 정의합니다. 주요 차이점은 위임 요청을 생성할 때 정책 템플릿에 실제 값으로 대체되는 파라미터(예: @{bucketName})가 포함되어 있다는 것입니다.
정책 템플릿의 작동 방식
온보딩 프로세스의 일환으로 정책 템플릿을 AWS에 등록합니다. AWS는 위임 요청을 생성할 때 참조하는 고유한 ARN을 각 템플릿에 할당합니다.
위임 요청을 생성할 때 다음을 지정합니다.
정책 템플릿 ARN
템플릿으로 대체할 파라미터 값
AWS는 템플릿을 파라미터 값과 결합하여 표준 IAM 정책을 생성합니다. 고객은 위임 요청을 승인할 때 이 최종 렌더링된 정책을 검토하여 부여될 권한을 정확히 확인합니다.
참고
최종 렌더링된 정책의 최대 크기 제한은 2,048자입니다.
다음은 템플릿 대체의 작동 방식을 보여주는 간단한 예입니다.
정책 템플릿:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::@{bucketName}/*" } ] }
위임 요청에 제공된 파라미터:
{ "Name": "bucketName", "Values": ["customer-data-bucket"], "Type": "String" }
최종 렌더링된 정책(고객이 보는 내용):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::customer-data-bucket/*" } ] }
템플릿 구문
정책 템플릿은 두 가지 주요 기능인 파라미터 대체와 조건문을 사용하여 유연성을 제공합니다. 파라미터 대체를 사용하면 위임 요청을 생성할 때 실제 값으로 대체되는 템플릿의 자리 표시자를 정의할 수 있습니다. 조건부 문을 사용하면 파라미터 값을 기반으로 전체 정책 문을 포함하거나 제외할 수 있습니다.
파라미터 대체 및 유형
@{parameterName} 구문을 사용하여 정책 템플릿에서 파라미터를 정의합니다. 위임 요청을 생성할 때 각 파라미터의 유형을 지정해야 합니다.
문자열
템플릿으로 직접 대체되는 단일 값입니다.
템플릿:
"Resource": "arn:aws:s3:::@{bucketName}/*"
파라미터:
{ "Name": "bucketName", "Values": ["my-bucket"], "Type": "String" }
렌더링된 결과:
"Resource": "arn:aws:s3:::my-bucket/*"
StringList
여러 리소스 항목을 생성하는 여러 값입니다. 리소스 ARN에서 StringList 파라미터를 사용하면 확장되어 각 값에 대해 별도의 리소스 항목을 생성합니다.
템플릿:
"Resource": "arn:aws:s3:::@{bucketNames}/*"
파라미터:
{ "Name": "bucketNames", "Values": ["bucket-1", "bucket-2"], "Type": "StringList" }
렌더링된 결과:
"Resource": [ "arn:aws:s3:::bucket-1/*", "arn:aws:s3:::bucket-2/*" ]
제품 간 동작
동일한 리소스 ARN에 여러 파라미터가 사용되는 경우 StringList 파라미터는 모든 조합의 교차 곱을 생성합니다.
템플릿:
"Resource": "arn:aws:s3:::@{bucketNames}/@{prefix}/*"
파라미터:
[ { "Name": "bucketNames", "Values": ["bucket-1", "bucket-2"], "Type": "StringList" }, { "Name": "prefix", "Values": ["data"], "Type": "String" } ]
렌더링된 결과:
"Resource": [ "arn:aws:s3:::bucket-1/data/*", "arn:aws:s3:::bucket-2/data/*" ]
조건문
@Enabled 지시문을 사용하여 파라미터 값을 기반으로 전체 문을 조건부로 포함하거나 제외합니다.
구문:
@Enabled: "parameterName" - 파라미터 값이 ‘True’일 때 문 포함
@Enabled: "!parameterName" - 파라미터 값이 ‘True’가 아닐 때(음수) 문 포함
템플릿:
{ "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}/*" } ] }
파라미터(ENABLE_S3_WRITE가 ‘True’인 경우):
[ { "Name": "bucketName", "Values": ["my-bucket"], "Type": "String" }, { "Name": "ENABLE_S3_WRITE", "Values": ["True"], "Type": "String" } ]
렌더링된 결과:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": "*" }, { "Effect": "Allow", "Action": ["s3:PutObject"], "Resource": "arn:aws:s3:::my-bucket/*" } ] }
파라미터(ENABLE_S3_WRITE가 ‘False’인 경우):
[ { "Name": "bucketName", "Values": ["my-bucket"], "Type": "String" }, { "Name": "ENABLE_S3_WRITE", "Values": ["False"], "Type": "String" } ]
렌더링된 결과:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": "*" } ] }
ENABLE_S3_WRITE가 ‘True’로 설정되면 조건문이 포함됩니다. ‘False’로 설정되면 문이 렌더링된 정책에서 제외됩니다.
추가 예제
다음 예시에서는 임시 위임에서 정책 템플릿을 사용하는 일반적인 패턴을 보여줍니다. 장기 액세스를 위한 권한 경계가 있는 IAM 역할을 생성하는 데 중점을 두고 특정 리소스에 대한 권한 범위를 조정하기 위한 다양한 전략을 보여줍니다. 이 예에서는 ARN 접두사, 리소스 태깅 및 권한 경계 업데이트와 같은 기술을 사용하여 유연성과 보안의 균형을 맞추는 방법을 보여줍니다.
예시 1: 특정 리소스에 대한 장기 액세스 권한 부여
다음 권한 경계는 ‘partner.com’에 대한 ‘SQSAccessorBoundary’로 제출됩니다.
{ "Effect": "Allow", "Action": [ "sqs:DeleteMessage", "sqs:ReceiveMessage", "sqs:SendMessage" ], "Resource": "arn:aws:sqs:*:*:*", "Condition": { "StringEquals": { "aws:ResourceAccount": "${aws:PrincipalAccount}" } } }
참고
여기에는 열린 리소스 정책이 있는 다른 계정의 대기열에 대한 액세스 권한을 부여하지 않도록 하는 동일한 계정 조건이 포함됩니다. 경계는 모든 고객에 걸쳐 공유되고 템플릿화할 수 없으므로 고객의 계정 ID에 대한 직접 참조를 포함할 수 없습니다.
이 정책의 첫 번째 버전이므로 ARN은 arn:aws:iam::partner:policy/permissions-boundary/partner.com/SQSAccessorBoundary_2025_01_15입니다.
임시 액세스 권한을 위해 다음 정책 템플릿이 제출됩니다.
{ "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" } } } ] }
예시 2: ARN 접두사 사용
권한 경계는 액세스를 제한하는 리소스 ARN 접두사를 지정할 수 있습니다.
"Resource": "arn:aws:sqs:*:@{AccountId}:PartnerPrefix*"
이렇게 하면 해당 접두사가 있는 리소스에만 액세스할 수 있으므로 액세스 가능한 리소스의 범위가 줄어듭니다.
예시 3: 리소스 액세스 제어에 태그 사용
임시로 위임된 액세스 중에 리소스에 태그를 지정하고 장기 액세스 제어를 위해 해당 태그에 의존할 수 있습니다.
태깅된 리소스에 대한 액세스를 허용하는 권한 경계:
{ "Effect": "Allow", "Action": [ "sqs:DeleteMessage", "sqs:ReceiveMessage", "sqs:SendMessage" ], "Resource": "arn:aws:sqs:*:*:*", "Condition": { "Null": { "aws:ResourceTag/ManagedByPartnerDotCom": "false" }, "StringEquals": { "aws:ResourceAccount": "${aws:PrincipalAccount}" } } }
생성 시 새 대기열에 태그를 지정하는 정책 템플릿:
{ "Effect": "Allow", "Action": [ "sqs:CreateQueue", "sqs:TagQueue" ], "Resource": "arn:aws:sqs:*:*:*", "Condition": { "Null": { "aws:RequestTag/ManagedByPartnerDotCom": "false" } } }
기존 대기열에 태깅하고 역할을 생성하는 정책 템플릿:
{ "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" } } } ] }
이 접근 방식을 통해 고객은 장기적으로 액세스할 수 있는 특정 리소스를 명시적으로 확인할 수 있습니다.
예시 4: 권한 경계 업데이트
권한 경계를 업데이트하려면 새 버전을 새 날짜 접미사로 등록하고 대체 권한을 요청합니다.
추가 권한으로 권한 경계를 업데이트:
{ "Effect": "Allow", "Action": [ "sqs:DeleteMessage", "sqs:PurgeQueue", "sqs:ReceiveMessage", "sqs:SendMessage" ], "Resource": "arn:aws:sqs:*:*:*", "Condition": { "StringEquals": { "aws:ResourceAccount": "${aws:PrincipalAccount}" } } }
두 번째 버전으로 이 정책에는 ARN: arn:aws:iam::partner:policy/permissions-boundary/partner.com/SQSAccessorBoundary_2025_01_20이 있습니다.
기존 역할의 권한 경계를 업데이트하는 정책 템플릿:
{ "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" } } } ] }
고객은 이 위임 요청을 승인하여 기존 역할에 대한 권한 경계를 업데이트해야 합니다.