

# CloudFormation에 대한 IAM ID 기반 정책 예제
<a name="security_iam_id-based-policy-examples"></a>

기본적으로 사용자 및 역할에는 CloudFormation 리소스를 생성하거나 수정할 수 있는 권한이 없습니다. 또한 AWS Management Console, AWS Command Line Interface(AWS CLI) 또는 AWS API를 사용해 태스크를 수행할 수 없습니다. 사용자에게 사용자가 필요한 리소스에서 작업을 수행할 권한을 부여하려면 IAM 관리자가 IAM 정책을 생성하면 됩니다. 그런 다음 관리자가 IAM 정책을 역할에 추가하고, 사용자가 역할을 맡을 수 있습니다. 자세한 내용은 [CloudFormation에 대한 IAM ID 기반 정책 정의](control-access-with-iam.md#iam-id-based-policies) 섹션을 참조하세요.

다음 예제에서는 하나 이상의 CloudFormation 작업을 사용하는 권한을 허용하거나 거부하는 데 사용할 수 있는 정책 설명을 보여줍니다.

**Topics**
+ [특정 템플릿 URL 요구](#w2aac43c23c17b9)
+ [모든 CloudFormation 가져오기 작업 거부](#w2aac43c23c17c11)
+ [특정 리소스 유형에 대한 가져오기 작업 허용](#w2aac43c23c17c13)
+ [스택 템플릿에서 IAM 리소스 거부](#w2aac43c23c17c15)
+ [특정 리소스 유형으로 스택 생성 허용](#w2aac43c23c17c17)
+ [리소스 변경 API 작업을 기반으로 액세스 제어](#w2aac43c23c17c19)
+ [리전 및 리소스 유형을 기반으로 스택 세트 작업 제한](#resource-level-permissions-service-managed-stack-set)
+ [모든 IaC 생성기 작업 허용](#iam-policy-example-for-iac-generator)

## 특정 템플릿 URL 요구
<a name="w2aac43c23c17b9"></a>

다음 정책에서는 `{{https://s3.amazonaws.com/amzn-s3-demo-bucket/test.template}}` 템플릿 URL을 통해서만 스택을 생성하거나 업데이트하는 권한을 부여합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateStack",
                "cloudformation:UpdateStack"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "cloudformation:TemplateUrl": [
                        "{{https://s3.amazonaws.com/amzn-s3-demo-bucket/test.template}}"
                    ]
                }
            }
        }
    ]
}
```

------

## 모든 CloudFormation 가져오기 작업 거부
<a name="w2aac43c23c17c11"></a>

다음 정책에서는 가져오기 작업을 제외한 모든 CloudFormation 작업을 완료하는 권한을 부여합니다.

------
#### [ JSON ]

****  

```
{ 
  "Version":"2012-10-17",		 	 	  
  "Statement": [ 
    { 
      "Sid": "AllowAllStackOperations",
      "Effect": "Allow", 
      "Action": "cloudformation:*", 
      "Resource": "*" 
    }, 
    { 
      "Sid": "DenyImport", 
      "Effect": "Deny", 
      "Action": "cloudformation:*", 
      "Resource": "*",
      "Condition": { 
        "ForAnyValue:StringLike": {
          "cloudformation:ImportResourceTypes": [ 
            "*" 
          ] 
        } 
      } 
    } 
  ] 
}
```

------

## 특정 리소스 유형에 대한 가져오기 작업 허용
<a name="w2aac43c23c17c13"></a>

다음 정책에서는 오직 지정된 리소스에서의 가져오기 작업(이 예제에서 `AWS::S3::Bucket`)을 비롯해 모든 스택 작업에 대한 권한을 부여합니다.

------
#### [ JSON ]

****  

```
{ 
  "Version":"2012-10-17",		 	 	  
  "Statement": [ 
    { 
      "Sid": "AllowImport",
      "Effect": "Allow", 
      "Action": "cloudformation:*", 
      "Resource": "*",
      "Condition": { 
        "ForAllValues:StringEqualsIgnoreCase": {
          "cloudformation:ImportResourceTypes": [ 
            "AWS::S3::Bucket" 
          ] 
        } 
      } 
    } 
  ] 
}
```

------

## 스택 템플릿에서 IAM 리소스 거부
<a name="w2aac43c23c17c15"></a>

다음 정책에서는 스택 생성 권한을 부여하지만, 스택의 템플릿에 IAM 서비스의 리소스가 포함된 경우 요청을 거부합니다. 또한 정책을 통해 사용자에게 `ResourceTypes` 파라미터를 지정하도록 요구합니다. 이 파라미터는 AWS CLI 및 API 요청에만 사용할 수 있습니다. 이 정책은 명시적 거부문을 사용하므로 다른 정책에서 추가 권한을 부여하더라도 이 정책은 항상 적용됩니다(명시적 거부문이 명시적 허용문보다 항상 우선).

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement":[
    {
      "Effect" : "Allow",
      "Action" : [ "cloudformation:CreateStack" ],
      "Resource" : "*"
    },
    {
      "Effect" : "Deny",
      "Action" : [ "cloudformation:CreateStack" ],
      "Resource" : "*",
      "Condition" : {
        "ForAnyValue:StringLikeIfExists" : {
          "cloudformation:ResourceTypes" : [ "AWS::IAM::*" ]
        }
      }
    },
    {
      "Effect": "Deny",
      "Action" : [ "cloudformation:CreateStack" ],
      "Resource": "*",
      "Condition": {
        "Null": {
          "cloudformation:ResourceTypes": "true"
        }
      }
    }
  ]
}
```

------

## 특정 리소스 유형으로 스택 생성 허용
<a name="w2aac43c23c17c17"></a>

다음 정책은 이전 예제와 비슷합니다. 이 정책에서는 스택의 템플릿에 IAM 서비스의 리소스가 포함되지 않은 경우 스택을 생성하는 권한을 부여합니다. 또한 사용자에게 `ResourceTypes` 파라미터를 지정하도록 요구합니다. 이 파라미터는 AWS CLI 및 API 요청에 대해서만 사용할 수 있습니다. 이 정책은 더 간단하지만 명시적 거부문을 사용하지 않습니다. 추가적인 권한을 부여하는 다른 정책에서 이 정책을 재정의할 수 있습니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement":[
    {
      "Effect" : "Allow",
      "Action" : [ "cloudformation:CreateStack" ],
      "Resource" : "*",
      "Condition" : {
        "ForAllValues:StringNotLikeIfExists" : {
          "cloudformation:ResourceTypes" : [ "AWS::IAM::*" ]
        },
        "Null":{
          "cloudformation:ResourceTypes": "false"
        }
      }
    }
  ]
}
```

------

## 리소스 변경 API 작업을 기반으로 액세스 제어
<a name="w2aac43c23c17c19"></a>

다음 정책에서는 리소스 변경 API 작업의 이름을 기준으로 액세스를 필터링하는 권한을 부여합니다. 이 정책은 IAM 사용자가 스택 또는 스택 세트에서 태그를 추가하거나 제거하는 데 사용할 수 있는 API를 제어하는 데 사용됩니다. 태그를 추가하거나 제거하는 데 사용되는 작업은 조건 키의 값으로 추가해야 합니다. 다음 정책은 변경 작업 `CreateStack`에 `TagResource` 및 `UntagResource` 권한을 부여합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
        "Sid": "CreateActionConditionPolicyForTagUntagResources",
        "Effect": "Allow",
        "Action": [
            "cloudformation:TagResource",
            "cloudformation:UntagResource"
        ],
        "Resource": "*",
        "Condition": {
            "StringEquals": {
                "cloudformation:CreateAction": [
                    "CreateStack"
                ]
            }
        }
    }]
}
```

------

## 리전 및 리소스 유형을 기반으로 스택 세트 작업 제한
<a name="resource-level-permissions-service-managed-stack-set"></a>

다음 정책에서는 서비스 관리형 스택 세트 권한을 부여합니다. 이 정책을 적용 받는 사용자는 Amazon S3 리소스 유형(`AWS::S3::*`) 또는 `AWS::SES::ConfigurationSet` 리소스 유형을 포함하는 템플릿으로만 스택 세트 작업을 수행할 수 있습니다. ID `123456789012`로 조직 관리 계정에 로그인한 경우 사용자는 ID가 `{{ou-1fsfsrsdsfrewr}}`인 OU를 대상으로 하는 스택 세트에 대해서만 작업을 수행할 수 있고, ID가 `{{987654321012}}`인 AWS 계정을 대상으로 하는 ID `stack-set-id`의 스택 세트에 대해서만 작업을 수행할 수 있습니다.

스택 세트 템플릿에 정책에 지정된 리소스 유형이 아닌 다른 리소스 유형이 포함되어 있거나, 배포 대상이 해당 관리 계정 및 스택 세트 정책에 지정되지 않은 OU 또는 계정 ID인 경우 스택 세트 작업이 실패합니다.

이러한 정책 제한은 스택 세트 작업이 `us-east-1`, `us-west-2` 또는 `eu-west-2` AWS 리전를 대상으로 하는 경우에만 적용됩니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudformation:*"
            ],
            "Resource": [
                "arn:aws:cloudformation:*:*:stackset/*",
                "arn:aws:cloudformation:*:*:type/resource/{{AWS-S3}}-*",
                "arn:aws:cloudformation:us-west-2:{{111122223333}}:type/resource/{{AWS-SES-ConfigurationSet}}",
                "arn:aws:cloudformation:*:{{111122223333}}:stackset-target/*/{{ou-1fsfsrsdsfrewr}}",
                "arn:aws:cloudformation:*:{{111122223333}}:stackset-target/{{stack-set-id}}/{{444455556666}}"
            ],
            "Condition": {
                "ForAllValues:StringEqualsIgnoreCase": {
                    "cloudformation:TargetRegion": [
                        "{{us-east-1}}",
                        "{{us-west-2}}",
                        "{{eu-west-1}}"
                    ]
                }
            }
        }
    ]
}
```

------

## 모든 IaC 생성기 작업 허용
<a name="iam-policy-example-for-iac-generator"></a>

다음 정책에서는 IaC 생성기 리소스 스캔 및 템플릿 관리와 관련된 CloudFormation 작업에 대한 액세스를 허용합니다. 첫 번째 명령문은 리소스 스캔을 설명, 나열 및 시작하는 권한을 부여합니다. 또한 IaC 생성기가 리소스 및 사용 가능한 리소스 유형에 대한 정보를 검색할 수 있는 추가 필수 권한(`cloudformation:GetResource`, `cloudformation:ListResources`, `cloudformation:ListTypes`)에 대한 액세스를 허용합니다. 두 번째 명령문은 생성된 템플릿을 생성, 삭제, 설명, 나열 및 업데이트할 수 있는 모든 권한을 부여합니다.

또한 IaC 생성기로 리소스를 스캔할 모든 사용자에게 대상 AWS 서비스에 대한 읽기 권한을 부여해야 합니다. 자세한 내용은 [리소스 스캔에 필요한 IAM 권한](generate-IaC.md#iac-generator-permissions) 섹션을 참조하세요.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement":[
        {
            "Sid":"ResourceScanningOperations",
            "Effect":"Allow",
            "Action":[
                "cloudformation:DescribeResourceScan",
                "cloudformation:GetResource",
                "cloudformation:ListResources",
                "cloudformation:ListResourceScanRelatedResources",
                "cloudformation:ListResourceScanResources",
                "cloudformation:ListResourceScans",
                "cloudformation:ListTypes",
                "cloudformation:StartResourceScan"
            ],
            "Resource":"*"
        },
        {
            "Sid":"TemplateGeneration",
            "Effect":"Allow",
            "Action":[
                "cloudformation:CreateGeneratedTemplate",
                "cloudformation:DeleteGeneratedTemplate",
                "cloudformation:DescribeGeneratedTemplate",
                "cloudformation:GetResource",
                "cloudformation:GetGeneratedTemplate",
                "cloudformation:ListGeneratedTemplates",
                "cloudformation:UpdateGeneratedTemplate"
            ],
            "Resource":"*"
        }
    ]
}
```

------