

# Amazon Elastic Container Service의 자격 증명 기반 정책 예
<a name="security_iam_id-based-policy-examples"></a>

기본적으로 사용자 및 역할은 Amazon ECS 리소스를 생성하거나 수정할 수 있는 권한이 없습니다. 사용자에게 사용자가 필요한 리소스에서 작업을 수행할 권한을 부여하려면 IAM 관리자가 IAM 정책을 생성하면 됩니다.

이러한 예제 JSON 정책 문서를 사용하여 IAM ID 기반 정책을 생성하는 방법을 알아보려면 *IAM 사용 설명서*의 [IAM 정책 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)을 참조하세요.

각 리소스 유형에 대한 ARN 형식을 비롯하여 Amazon ECS에서 정의되는 작업 및 리소스 유형에 대한 자세한 내용은 [서비스 승인 참조](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonelasticcontainerservice.html)의 *Amazon Elastic Container Service에 사용되는 작업, 리소스 및 조건 키*를 참조하세요.

**Topics**
+ [Amazon ECS 정책 모범 사례](#security_iam_service-with-iam-policy-best-practices)
+ [Amazon ECS 사용자가 자신의 권한을 볼 수 있도록 허용](#security_iam_id-based-policy-examples-view-own-permissions)
+ [Amazon ECS 클러스터 예제](#IAM_cluster_policies)
+ [Amazon ECS 컨테이너 인스턴스 예제](#IAM_container_instance_policies)
+ [Amazon ECS 태스크 정의 예제](#IAM_task_definition_policies)
+ [Amazon ECS 태스크 예제 실행](#IAM_run_policies)
+ [Amazon ECS 작업 예제 시작](#IAM_start_policies)
+ [Amazon ECS 작업 예제 나열 및 설명](#IAM_task_policies)
+ [Amazon ECS 서비스 예제 생성](#IAM_create_service_policies)
+ [태그를 기반으로 Amazon ECS Services 설명](#security_iam_id-based-policy-examples-view-cluster-tags)
+ [Amazon ECS 서비스 연결 네임스페이스 재정의 거부 예제](#IAM_disable_namespace_override_policies)

## Amazon ECS 정책 모범 사례
<a name="security_iam_service-with-iam-policy-best-practices"></a>

ID 기반 정책에 따라 계정에서 사용자가 Amazon ECS 리소스를 생성, 액세스 또는 삭제할 수 있는지 여부가 결정됩니다. 이 작업으로 인해 AWS 계정에 비용이 발생할 수 있습니다. ID 기반 정책을 생성하거나 편집할 때는 다음 지침과 권장 사항을 따르세요.
+ **AWS 관리형 정책으로 시작하고 최소 권한을 향해 나아가기** - 사용자 및 워크로드에 권한 부여를 시작하려면 많은 일반 사용 사례에 대한 권한을 부여하는 *AWS관리형 정책*을 사용합니다. AWS 계정에서 사용할 수 있습니다. 사용 사례에 고유한 AWS고객 관리형 정책을 정의하여 권한을 줄이는 것이 좋습니다. 자세한 내용은 *IAM 사용 설명서*의 [AWS 관리형 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies) 또는 [AWS직무에 대한 관리형 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html)을 참조하세요.
+ **최소 권한 적용** – IAM 정책을 사용하여 권한을 설정하는 경우, 작업을 수행하는 데 필요한 권한만 부여합니다. 이렇게 하려면 *최소 권한*으로 알려진 특정 조건에서 특정 리소스에 대해 수행할 수 있는 작업을 정의합니다. IAM을 사용하여 권한을 적용하는 방법에 대한 자세한 정보는 *IAM 사용 설명서*에 있는 [IAM의 정책 및 권한](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)을 참조하세요.
+ **IAM 정책의 조건을 사용하여 액세스 추가 제한** – 정책에 조건을 추가하여 작업 및 리소스에 대한 액세스를 제한할 수 있습니다. 예를 들어, SSL을 사용하여 모든 요청을 전송해야 한다고 지정하는 정책 조건을 작성할 수 있습니다. CloudFormation와 같이, 특정 AWS 서비스를 통해 사용되는 경우에만 서비스 작업에 대한 액세스 권한을 부여할 수도 있습니다. 자세한 내용은 *IAM 사용자 설명서*의 [IAM JSON 정책 요소: 조건](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)을 참조하세요.
+ **IAM Access Analyzer를 통해 IAM 정책을 확인하여 안전하고 기능적인 권한 보장** - IAM Access Analyzer에서는 IAM 정책 언어(JSON)와 모범 사례가 정책에서 준수되도록 새로운 및 기존 정책을 확인합니다. IAM Access Analyzer는 100개 이상의 정책 확인 항목과 실행 가능한 추천을 제공하여 안전하고 기능적인 정책을 작성하도록 돕습니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM Access Analyzer에서 정책 검증](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html)을 참조하세요.
+ **다중 인증(MFA) 필요** – AWS 계정에 IAM 사용자 또는 루트 사용자가 필요한 시나리오가 있는 경우, 추가 보안을 위해 MFA를 설정합니다. API 작업을 직접적으로 호출할 때 MFA가 필요하면 정책에 MFA 조건을 추가합니다. 자세한 내용은 *IAM 사용 설명서*의 [MFA를 통한 보안 API 액세스](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html)를 참조하세요.

IAM의 모범 사례에 대한 자세한 내용은 *IAM 사용 설명서*의 [IAM의 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 참조하세요.

## Amazon ECS 사용자가 자신의 권한을 볼 수 있도록 허용
<a name="security_iam_id-based-policy-examples-view-own-permissions"></a>

이 예제는 IAM 사용자가 자신의 사용자 ID에 연결된 인라인 및 관리형 정책을 볼 수 있도록 허용하는 정책을 생성하는 방법을 보여 줍니다. 이 정책에는 콘솔에서 또는 AWS CLI나 AWS API를 사용하여 프로그래밍 방식으로 이 작업을 완료할 수 있는 권한이 포함됩니다.

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ViewOwnUserInfo",
            "Effect": "Allow",
            "Action": [
                "iam:GetUserPolicy",
                "iam:ListGroupsForUser",
                "iam:ListAttachedUserPolicies",
                "iam:ListUserPolicies",
                "iam:GetUser"
            ],
            "Resource": ["arn:aws:iam::*:user/${aws:username}"]
        },
        {
            "Sid": "NavigateInConsole",
            "Effect": "Allow",
            "Action": [
                "iam:GetGroupPolicy",
                "iam:GetPolicyVersion",
                "iam:GetPolicy",
                "iam:ListAttachedGroupPolicies",
                "iam:ListGroupPolicies",
                "iam:ListPolicyVersions",
                "iam:ListPolicies",
                "iam:ListUsers"
            ],
            "Resource": "*"
        }
    ]
}
```

## Amazon ECS 클러스터 예제
<a name="IAM_cluster_policies"></a>

다음 IAM 정책은 클러스터를 생성하고 나열할 수 있는 권한을 허용합니다. `CreateCluster` 및 `ListClusters` 태스크는 어떤 리소스도 수락하지 않으므로 리소스 정의는 `*` 모든 리소스에 대해 설정됩니다.

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

****  

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:CreateCluster",
                "ecs:ListClusters"
            ],
            "Resource": "*"
        }
    ]
}
```

------

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

****  

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:DescribeClusters",
                "ecs:DeleteCluster"
            ],
            "Resource": ["arn:aws:ecs:us-east-1:123456789012:cluster/cluster-name"]
        }
    ]
}
```

------

다음 IAM 정책은 특정 클러스터를 설명하고 삭제할 수 있는 권한을 허용합니다. `DescribeClusters` 및 `DeleteCluster` 태스크는 클러스터 ARN을 리소스로 수락합니다.

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

****  

```
{
    "Statement": [
        {
            "Action": [
                "ecs:Describe*",
                "ecs:List*"
            ],
            "Effect": "Allow",
            "Resource": "*"
        },
        {
            "Action": [
                "ecs:DeleteCluster",
                "ecs:DeregisterContainerInstance",
                "ecs:ListContainerInstances",
                "ecs:RegisterContainerInstance",
                "ecs:SubmitContainerStateChange",
                "ecs:SubmitTaskStateChange"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:ecs:us-east-1:123456789012:cluster/default"
        },
        {
            "Action": [
                "ecs:DescribeContainerInstances",
                "ecs:DescribeTasks",
                "ecs:ListTasks",
                "ecs:UpdateContainerAgent",
                "ecs:StartTask",
                "ecs:StopTask",
                "ecs:RunTask"
            ],
            "Effect": "Allow",
            "Resource": "*",
            "Condition": {
                "ArnEquals": {"ecs:cluster": "arn:aws:ecs:us-east-1:123456789012:cluster/default"}
            }
        }
    ]
}
```

------

한 사용자 또는 그룹만 특정 클러스터에서 태스크를 수행하도록 허용하는 다음 IAM 정책을 해당 사용자 또는 그룹에 연결할 수 있습니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "ecs:Describe*",
                "ecs:List*"
            ],
            "Effect": "Allow",
            "Resource": "*"
        },
        {
            "Action": [
                "ecs:DeleteCluster",
                "ecs:DeregisterContainerInstance",
                "ecs:ListContainerInstances",
                "ecs:RegisterContainerInstance",
                "ecs:SubmitContainerStateChange",
                "ecs:SubmitTaskStateChange"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:ecs:us-east-1:111122223333:cluster/default"
        },
        {
            "Action": [
                "ecs:DescribeContainerInstances",
                "ecs:DescribeTasks",
                "ecs:ListTasks",
                "ecs:UpdateContainerAgent",
                "ecs:StartTask",
                "ecs:StopTask",
                "ecs:RunTask"
            ],
            "Effect": "Allow",
            "Resource": "*",
            "Condition": {
                "ArnEquals": {"ecs:cluster": "arn:aws:ecs:us-east-1:111122223333:cluster/default"}
            }
        }
    ]
}
```

------

## Amazon ECS 컨테이너 인스턴스 예제
<a name="IAM_container_instance_policies"></a>

컨테이너 인스턴스 등록은 Amazon ECS 에이전트에 의해 처리되지만 사용자가 수동으로 클러스터에서 인스턴스 등록을 취소할 수 있도록 하는 것이 좋은 경우가 있을 수 있습니다. 컨테이너 인스턴스가 잘못된 클러스터에 실수로 등록되었거나 태스크가 여전히 실행되고 있는 상태에서 인스턴스가 종료된 경우가 그렇습니다.

다음 IAM 정책은 사용자가 지정한 클러스터의 컨테이너 인스턴스 목록을 보고 등록을 해제할 수 있도록 합니다.

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

****  

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:DeregisterContainerInstance",
                "ecs:ListContainerInstances"
            ],
            "Resource": "arn:aws:ecs:us-east-1:123456789012:cluster/cluster_name"
        }
    ]
}
```

------

## Amazon ECS 태스크 정의 예제
<a name="IAM_task_definition_policies"></a>

태스크 정의 IAM 정책은 리소스 수준 권한을 지원하지 않지만 다음 IAM 정책은 사용자가 태스크 정의를 등록, 나열, 설명하도록 허용합니다.

콘솔을 사용하는 경우 `CloudFormation: CreateStack`을 `Action`으로 추가해야 합니다.

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

****  

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:RegisterTaskDefinition",
                "ecs:ListTaskDefinitions",
                "ecs:DescribeTaskDefinition"
            ],
            "Resource": "*"
        }
    ]
}
```

------

## Amazon ECS 태스크 예제 실행
<a name="IAM_run_policies"></a>

`RunTask`에 대한 리소스가 태스크 정의입니다. 사용자가 태스크 정의를 실행할 수 있는 클러스터를 제한하기 위해 `Condition` 블록에서 클러스터를 지정할 수 있습니다. 이 방법의 장점은 적절한 액세스를 허용하기 위해 리소스에서 태스크 정의와 클러스터를 모두 나열하지 않아도 된다는 점입니다. 전자나 후자 또는 둘 다 적용할 수 있습니다.

다음 IAM 정책은 특정 클러스터에서 특정 태스크 정의의 어떤 개정이든 실행할 수 있는 권한을 허용합니다.

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

****  

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": ["ecs:RunTask"],
            "Condition": {
                "ArnEquals": {"ecs:cluster": "arn:aws:ecs:us-east-1:123456789012:cluster/cluster_name"}
            },
            "Resource": ["arn:aws:ecs:us-east-1:123456789012:task-definition/task_family:*"]
        }
    ]
}
```

------

## Amazon ECS 작업 예제 시작
<a name="IAM_start_policies"></a>

`StartTask`에 대한 리소스가 태스크 정의입니다. 사용자가 태스크 정의를 시작할 수 있는 클러스터와 컨테이너 인스턴스를 제한하기 위해 `Condition` 블록에서 이를 지정할 수 있습니다. 이 방법의 장점은 적절한 액세스를 허용하기 위해 리소스에서 태스크 정의와 클러스터를 모두 나열하지 않아도 된다는 점입니다. 전자나 후자 또는 둘 다 적용할 수 있습니다.

다음 IAM 정책은 특정 클러스터와 특정 컨테이너 인스턴스에서 특정 태스크 정의의 어떤 개정이든 시작할 수 있는 권한을 허용합니다.

**참고**  
이 예에서 `StartTask` 또는 다른 AWS CLI SDK로 AWS API를 호출할 때 태스크 정의 개정을 지정해야 `Resource` 매핑이 일치합니다.

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

****  

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": ["ecs:StartTask"],
            "Condition": {
                "ArnEquals": {
                    "ecs:cluster": "arn:aws:ecs:us-east-1:123456789012:cluster/cluster_name",
                    "ecs:container-instances": ["arn:aws:ecs:us-east-1:123456789012:container-instance/cluster_name/container_instance_UUID"]
                }
            },
            "Resource": ["arn:aws:ecs:us-east-1:123456789012:task-definition/task_family:*"]
        }
    ]
}
```

------

## Amazon ECS 작업 예제 나열 및 설명
<a name="IAM_task_policies"></a>

다음 IAM 정책은 사용자가 지정된 클러스터에서 지정된 태스크를 설명하도록 허용합니다.

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

****  

```
{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": ["ecs:DescribeTasks"],
            "Condition": {
                "ArnEquals": {"ecs:cluster": "arn:aws:ecs:us-east-1:123456789012:cluster/cluster_name"}
            },
            "Resource": ["arn:aws:ecs:us-east-1:123456789012:task/cluster_name/task_UUID"]
        }
    ]
}
```

------

## Amazon ECS 서비스 예제 생성
<a name="IAM_create_service_policies"></a>

다음 IAM 정책은 사용자가 AWS Management Console에서 Amazon ECS 서비스를 생성하도록 허용합니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "application-autoscaling:Describe*",
                "application-autoscaling:PutScalingPolicy",
                "application-autoscaling:RegisterScalableTarget",
                "cloudwatch:DescribeAlarms",
                "cloudwatch:PutMetricAlarm",
                "ecs:List*",
                "ecs:Describe*",
                "ecs:CreateService",
                "elasticloadbalancing:Describe*",
                "iam:GetPolicy",
                "iam:GetPolicyVersion",
                "iam:GetRole",
                "iam:ListAttachedRolePolicies",
                "iam:ListRoles",
                "iam:ListGroups",
                "iam:ListUsers"
            ],
            "Resource": "*"
        }
    ]
}
```

------

## 태그를 기반으로 Amazon ECS Services 설명
<a name="security_iam_id-based-policy-examples-view-cluster-tags"></a>

자격 증명 기반 정책의 조건을 사용하여 태그를 기반으로 Amazon ECS 리소스에 대한 액세스를 제어할 수 있습니다. 이 예제에서는 서비스 설명을 허용하는 정책을 생성할 수 있는 방법을 보여 줍니다. 하지만 `Owner` 서비스 태그가 해당 사용자의 사용자 이름 값을 가지고 있는 경우에만 권한이 부여됩니다. 이 정책은 콘솔에서 이 태스크를 완료하는 데 필요한 권한도 부여합니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DescribeServices",
            "Effect": "Allow",
            "Action": "ecs:DescribeServices",
            "Resource": "*"
        },
        {
            "Sid": "ViewServiceIfOwner",
            "Effect": "Allow",
            "Action": "ecs:DescribeServices",
            "Resource": "arn:aws:ecs:*:*:service/*",
            "Condition": {
                "StringEquals": {"ecs:ResourceTag/Owner": "${aws:username}"}
            }
        }
    ]
}
```

------

이 정책을 계정의 IAM 사용자에게 연결할 수 있습니다. `richard-roe`라는 사용자가 Amazon ECS 서비스를 설명하려고 할 경우 서비스에 `Owner=richard-roe` 또는 `owner=richard-roe` 태그가 지정되어야 합니다. 그렇지 않으면 액세스가 거부됩니다. 조건 키 이름은 대소문자를 구분하지 않기 때문에 조건 태그 키 `Owner`는 `Owner` 및 `owner` 모두와 일치합니다. 자세한 정보는 *IAM 사용 설명서*의 [IAM JSON 정책 요소: 조건](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)을 참조하세요.

## Amazon ECS 서비스 연결 네임스페이스 재정의 거부 예제
<a name="IAM_disable_namespace_override_policies"></a>

다음 IAM 정책은 사용자가 서비스 구성의 기본 Service Connect 네임스페이스를 재정의하는 것을 거부합니다. 기본 네임스페이스는 클러스터에 설정됩니다. 그러나 서비스 구성에서 이를 재정의할 수 있습니다. 일관성을 위해 모든 새 서비스가 동일한 네임스페이스를 사용하도록 설정하는 것이 좋습니다. 서비스가 특정 네임스페이스를 사용하도록 하려면 다음 컨텍스트 키를 사용합니다. 다음 예제에서 `<region>`, `<aws_account_id>`, `<cluster_name>` 및 `<namespace_id>`를 바꿉니다.

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:CreateService",
                "ecs:UpdateService"
            ],
            "Condition": {
                "ArnEquals": {
                    "ecs:cluster": "arn:aws:ecs:us-east-1:123456789012:cluster/cluster_name",
                    "ecs:namespace": "arn:aws:servicediscovery:us-east-1:123456789012:namespace/namespace_id"
                }
            },
            "Resource": "*"
        }
    ]
}
```

------