

# 정책 템플릿
<a name="temporary-delegation-policy-templates"></a>

정책 템플릿은 파트너가 고객의 계정에서 요청하는 임시 권한을 정의하도록 설계된 새로운 IAM 구문입니다. 일반 IAM 정책과 마찬가지로 Effect, Action, Resource 및 Condition 요소가 있는 문을 사용하여 권한을 정의합니다. 주요 차이점은 위임 요청을 생성할 때 정책 템플릿에 실제 값으로 대체되는 파라미터(예: @\$1bucketName\$1)가 포함되어 있다는 것입니다.

## 정책 템플릿의 작동 방식
<a name="temporary-delegation-how-policy-templates-work"></a>

온보딩 프로세스의 일환으로 정책 템플릿을 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/*"
        }
    ]
}
```

## 템플릿 구문
<a name="temporary-delegation-template-syntax"></a>

정책 템플릿은 두 가지 주요 기능인 파라미터 대체와 조건문을 사용하여 유연성을 제공합니다. 파라미터 대체를 사용하면 위임 요청을 생성할 때 실제 값으로 대체되는 템플릿의 자리 표시자를 정의할 수 있습니다. 조건부 문을 사용하면 파라미터 값을 기반으로 전체 정책 문을 포함하거나 제외할 수 있습니다.

### 파라미터 대체 및 유형
<a name="temporary-delegation-parameter-substitution"></a>

@\$1parameterName\$1 구문을 사용하여 정책 템플릿에서 파라미터를 정의합니다. 위임 요청을 생성할 때 각 파라미터의 유형을 지정해야 합니다.

#### 문자열
<a name="temporary-delegation-string-type"></a>

템플릿으로 직접 대체되는 단일 값입니다.

템플릿:

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

파라미터:

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

렌더링된 결과:

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

#### StringList
<a name="temporary-delegation-stringlist-type"></a>

여러 리소스 항목을 생성하는 여러 값입니다. 리소스 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/*"
]
```

#### 제품 간 동작
<a name="temporary-delegation-cross-product-behavior"></a>

동일한 리소스 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/*"
]
```

### 조건문
<a name="temporary-delegation-conditional-statements"></a>

@Enabled 지시문을 사용하여 파라미터 값을 기반으로 전체 문을 조건부로 포함하거나 제외합니다.

구문:
+ @Enabled: "parameterName" - 파라미터 값이 ‘True’일 때 문 포함
+ @Enabled: "\$1parameterName" - 파라미터 값이 ‘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\$1S3\$1WRITE가 ‘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\$1S3\$1WRITE가 ‘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\$1S3\$1WRITE가 ‘True’로 설정되면 조건문이 포함됩니다. ‘False’로 설정되면 문이 렌더링된 정책에서 제외됩니다.

## 추가 예제
<a name="temporary-delegation-additional-examples"></a>

다음 예시에서는 임시 위임에서 정책 템플릿을 사용하는 일반적인 패턴을 보여줍니다. 장기 액세스를 위한 권한 경계가 있는 IAM 역할을 생성하는 데 중점을 두고 특정 리소스에 대한 권한 범위를 조정하기 위한 다양한 전략을 보여줍니다. 이 예에서는 ARN 접두사, 리소스 태깅 및 권한 경계 업데이트와 같은 기술을 사용하여 유연성과 보안의 균형을 맞추는 방법을 보여줍니다.

### 예시 1: 특정 리소스에 대한 장기 액세스 권한 부여
<a name="temporary-delegation-example-1"></a>

다음 권한 경계는 ‘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\$12025\$101\$115입니다.

임시 액세스 권한을 위해 다음 정책 템플릿이 제출됩니다.

```
{
    "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 접두사 사용
<a name="temporary-delegation-example-2"></a>

권한 경계는 액세스를 제한하는 리소스 ARN 접두사를 지정할 수 있습니다.

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

이렇게 하면 해당 접두사가 있는 리소스에만 액세스할 수 있으므로 액세스 가능한 리소스의 범위가 줄어듭니다.

### 예시 3: 리소스 액세스 제어에 태그 사용
<a name="temporary-delegation-example-3"></a>

임시로 위임된 액세스 중에 리소스에 태그를 지정하고 장기 액세스 제어를 위해 해당 태그에 의존할 수 있습니다.

태깅된 리소스에 대한 액세스를 허용하는 권한 경계:

```
{
    "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: 권한 경계 업데이트
<a name="temporary-delegation-example-4"></a>

권한 경계를 업데이트하려면 새 버전을 새 날짜 접미사로 등록하고 대체 권한을 요청합니다.

추가 권한으로 권한 경계를 업데이트:

```
{
    "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\$12025\$101\$120이 있습니다.

기존 역할의 권한 경계를 업데이트하는 정책 템플릿:

```
{
    "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"
                }
            }
        }
    ]
}
```

고객은 이 위임 요청을 승인하여 기존 역할에 대한 권한 경계를 업데이트해야 합니다.