Amazon ECS 작업 IAM 역할
Amazon ECS 작업에는 IAM 역할이 연결될 수 있습니다. IAM 역할에서 부여된 권한은 작업에서 실행 중인 컨테이너에 위임됩니다. 이 역할을 통해 컨테이너의 애플리케이션 코드가 다른 AWS 서비스를 사용할 수 있습니다. 애플리케이션이 Amazon S3와 같은 다른 AWS 서비스에 액세스할 때 작업 역할이 필요합니다. Amazon ECS가 컨테이너 이미지를 가져오고 작업을 실행하는 데 필요한 IAM 권한에 대해서는 Amazon ECS 태스크 실행 IAM 역할을 참조하세요.
다음은 작업 역할 사용 시 이점입니다.
-
자격 증명 격리: 컨테이너만 해당 컨테이너가 속하는 태스크 정의에 정의된 IAM 역할에 대한 자격 증명을 검색할 수 있습니다. 다른 작업에 속하는 다른 컨테이너에 대해 정의된 자격 증명에는 액세스할 수 없습니다.
-
권한 부여: 권한이 없는 컨테이너는 다른 태스크에 대해 정의된 IAM 역할 자격 증명에 액세스할 수 없습니다.
-
감사: CloudTrail을 통한 액세스 및 이벤트 로깅을 사용하여 소급적 감사를 보장합니다. 태스크 자격 증명은 세션에 연결된
taskArn
의 컨텍스트가 있으므로 CloudTrail 로그에 어느 태스크가 어느 역할을 사용하는지 표시됩니다.
참고
작업에 대한 IAM 역할을 지정할 때 해당 작업에 대한 컨테이너의 AWS CLI 또는 다른 SDK는 작업 역할에 의해 단독으로 제공된 AWS 자격 증명을 사용하며 Amazon EC2 또는 실행 중인 외부 인스턴스에서 IAM 권한을 더 이상 상속하지 않습니다.
작업 IAM 역할 생성
작업에서 사용할 IAM 정책을 생성할 때 작업의 컨테이너에서 수임하려는 권한을 정책에 포함해야 합니다. 기존 AWS 관리형 정책을 사용하거나 특정 요구 사항에 맞는 사용자 지정 정책을 새로 생성할 수 있습니다. 자세한 내용은 IAM 사용자 설명서에서 IAM 정책 생성을 참조하세요.
중요
(모든 시작 유형에 대한) Amazon ECS 태스크의 경우 태스크에 대해 IAM 정책과 역할을 사용하는 것이 좋습니다. 이 자격 증명을 사용하면 태스크가 sts:AssumeRole
을 호출하지 않고 AWS API 요청을 보내고 태스크와 이미 연결된 것과 동일한 역할을 수입할 수 있습니다. 태스크가 자체적으로 역할을 수임하는 경우 해당 역할이 자체적으로 수임하도록 명시적으로 허용하는 신뢰 정책을 생성해야 합니다. 자세한 내용은 IAM 사용 설명서의 역할 트러스트 정책 업데이트를 참조하세요.
IAM 정책이 생성되면 Amazon ECS 작업 정의에 참조하는 정책을 포함하는 IAM 역할을 생성할 수 있습니다. IAM 콘솔에서 Elastic Container Service Task 사용 사례를 사용해 역할을 생성할 수 있습니다. 그런 다음, 작업의 컨테이너에 필요한 권한을 부여하는 특정 IAM 정책을 역할과 연결할 수 있습니다. 아래 절차에 이렇게 하는 방법이 나와 있습니다.
IAM 권한이 필요한 태스크 정의 또는 서비스가 여러 개인 경우 각 태스크 정의 또는 서비스에 대해 태스크에 필요한 권한을 최소한으로 포함하는 역할을 생성하여 각 태스크에 제공하는 액세스를 최소화할 것을 고려해야 합니다.
리전의 서비스 엔드포인트에 대한 자세한 내용은 Amazon Web Services 일반 참조 참조 가이드의 Service endpoints를 참조하세요.
IAM 작업 역할에는 ecs-tasks.amazonaws.com
서비스를 지정하는 신뢰 정책이 있어야 합니다. sts:AssumeRole
권한을 사용하면 작업이 Amazon EC2 인스턴스에서 사용하는 것과 다른 IAM 역할을 맡을 수 있습니다. 이렇게 하면 작업이 Amazon EC2 인스턴스와 연결된 역할을 상속하지 않습니다. 다음은 신뢰 정책 예시입니다. 리전 식별자를 바꾸고 작업을 시작할 때 사용하는 AWS 계정 번호를 지정합니다.
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Principal":{ "Service":[ "ecs-tasks.amazonaws.com" ] }, "Action":"sts:AssumeRole", "Condition":{ "ArnLike":{ "aws:SourceArn":"arn:aws:ecs:
us-west-2
:111122223333
:*" }, "StringEquals":{ "aws:SourceAccount":"111122223333
" } } } ] }
중요
작업 IAM 역할을 생성할 때는 혼동된 대리인 보안 문제를 방지하기 위해 추가로 권한 범위를 지정하도록 신뢰 관계 또는 역할에 연결된 IAM 정책에서 aws:SourceAccount
또는 aws:SourceArn
조건 키를 사용하는 것이 좋습니다. aws:SourceArn
조건 키를 사용하여 특정 클러스터를 지정하는 작업은 현재 지원되지 않으므로 와일드카드를 사용하여 모든 클러스터를 지정해야 합니다. 혼동되는 대리인 문제 및 AWS 계정 보호 방법에 대해 자세히 알아보려면, IAM 사용 설명서의 혼동되는 대리인 문제를 참조하세요.
다음 절차에서는 예제 정책을 사용하여 Amazon S3에서 객체를 검색하는 정책을 생성하는 방법을 설명합니다. 모든 사용자 입력
을 고유한 값으로 바꿉니다.
다음 절차에서는 사용자가 생성한 IAM 정책을 연결하여 작업 IAM 역할을 생성하는 방법을 설명합니다.
역할을 생성한 후 다음 기능에 대한 추가 권한을 역할에 추가합니다.
기능 | 추가 권한 |
---|---|
ECS Exec 사용 |
|
EC2 인스턴스 사용(Windows 및 Linux) | |
외부 인스턴스 사용 | |
Windows EC2 인스턴스 사용 |
ECS Exec 권한
ECS Exec 기능을 사용하려면 관리형 SSM 에이전트(execute-command
에이전트)와 SSM 서비스 간의 통신에 필요한 권한을 컨테이너에 부여하기 위한 작업 IAM 역할이 필요합니다. 작업 IAM 역할에 다음 권한을 추가하고 태스크 정의에 작업 IAM 역할을 포함해야 합니다. 자세한 내용은 IAM 사용 설명서의 IAM 정책 추가 및 제거를 참조하세요.
작업 IAM 역할에 대해 다음 정책을 사용하여 필수 SSM 권한을 추가합니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssmmessages:CreateControlChannel", "ssmmessages:CreateDataChannel", "ssmmessages:OpenControlChannel", "ssmmessages:OpenDataChannel" ], "Resource": "*" } ] }
Amazon EC2 인스턴스 추가 구성
컨테이너 인스턴스 역할의 권한을 AmazonEC2ContainerServiceforEC2Role
관리형 IAM 정책에서 사용되는 최소 권한 목록으로 제한하는 것이 좋습니다.
작업 역할을 사용하려면 Amazon EC2 인스턴스에 버전 1.11.0
이상의 컨테이너 에이전트가 필요합니다. 하지만 최신 컨테이너 에이전트 버전을 사용할 것을 권장합니다. 에이전트 버전을 확인하고 최신 버전으로 업데이트하는 방법에 대한 자세한 정보는 Amazon ECS 컨테이너 에이전트 업데이트 섹션을 참조하세요. Amazon ECS 최적화 AMI를 사용하는 경우 인스턴스에는 1.11.0-1
이상의 ecs-init
패키지가 필요합니다. 인스턴스가 Amazon ECS 최적화 AMI를 사용하는 경우 필요한 버전의 컨테이너 에이전트 및 ecs-init
이(가) 포함되어 있습니다. 자세한 내용은 Amazon ECS 최적화 Linux AMI 단원을 참조하십시오.
컨테이너 인스턴스에 Amazon ECS 최적화 AMI를 사용하지 않는 경우 에이전트를 시작하는 --net=host
명령에 docker run 옵션과 원하는 구성에 대한 다음 에이전트 변수를 추가합니다(자세한 내용은 Amazon ECS 컨테이너 에이전트 구성 참조).
ECS_ENABLE_TASK_IAM_ROLE=true
-
bridge
및default
네트워크 모드의 컨테이너 작업에 대한 IAM 역할을 활성화합니다. ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true
-
host
네트워크 모드의 컨테이너 작업에 대한 IAM 역할을 사용합니다. 이 변수는 에이전트 버전 1.12.0 이상에서만 지원됩니다.
예제 실행 명령은 Amazon ECS 컨테이너 에이전트를 수동으로 업데이트하는 방법(비 Amazon ECS 최적화 AMI) 섹션을 참조하세요. 또한 태스크의 컨테이너가 AWS 자격 증명을 검색할 수 있도록 컨테이너 인스턴스에서 다음 네트워킹 명령을 설정해야 합니다.
sudo sysctl -w net.ipv4.conf.all.route_localnet=1
sudo iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679
sudo iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679
재부팅 시 이러한 iptables 규칙이 유지되게 하려면 규칙을 컨테이너 인스턴스에 저장해야 합니다. iptables-save 명령과 iptables-restore 명령을 사용하여 iptables 규칙을 저장하고 부팅 시 복원할 수 있습니다. 자세한 정보는 해당 운영 체제 설명서를 참조하세요.
awsvpc
네트워크 모드를 사용하는 작업이 실행하는 컨테이너가 Amazon EC2 인스턴스 프로파일에 제공된 자격 증명 정보에 액세스하지 못하게 방지하려면(단, 작업 역할에 제공된 권한은 허용) 에이전트 구성 파일의 ECS_AWSVPC_BLOCK_IMDS
에이전트 구성 변수를 true
(으)로 설정하고 에이전트를 다시 시작합니다. 자세한 정보는 Amazon ECS 컨테이너 에이전트 구성을 참조하세요.
bridge
네트워크 모드를 사용하는 작업이 실행하는 컨테이너가 Amazon EC2 인스턴스 프로파일에 제공된 자격 증명에 액세스하지 못하게 방지하려면(단, 작업 역할에 제공된 권한은 허용) Amazon EC2 인스턴스에서 다음 iptables 명령을 실행합니다. 이 명령은 host
또는 awsvpc
네트워크 모드를 사용하는 작업 내 컨테이너에는 영향을 미치지 않습니다. 자세한 정보는 네트워크 모드을 참조하세요.
-
sudo yum install -y iptables-services; sudo iptables --insert DOCKER-USER 1 --in-interface docker+ --destination 169.254.169.254/32 --jump DROP
재부팅 시 이 iptables 규칙이 유지되게 하려면 규칙을 Amazon EC2 인스턴스에 저장해야 합니다. Amazon ECS 최적화 AMI를 사용하는 경우 다음 명령을 사용할 수 있습니다. 다른 운영 체제의 경우 해당 운영 체제 설명서를 참조하세요.
sudo iptables-save | sudo tee /etc/sysconfig/iptables && sudo systemctl enable --now iptables
외부 인스턴스 추가 구성
작업 IAM 역할을 사용하려면 외부 인스턴스에 버전 1.11.0
이상의 컨테이너 에이전트가 필요합니다. 하지만 최신 컨테이너 에이전트 버전을 사용할 것을 권장합니다. 에이전트 버전을 확인하고 최신 버전으로 업데이트하는 방법에 대한 자세한 정보는 Amazon ECS 컨테이너 에이전트 업데이트 섹션을 참조하세요. Amazon ECS 최적화 AMI를 사용하는 경우 해당 인스턴스에는 1.11.0-1
이상의 ecs-init
패키지가 필요합니다. 인스턴스가 Amazon ECS 최적화 AMI를 사용하는 경우 필요한 버전의 컨테이너 에이전트 및 ecs-init
이(가) 포함되어 있습니다. 자세한 내용은 Amazon ECS 최적화 Linux AMI 단원을 참조하십시오.
컨테이너 인스턴스에 Amazon ECS 최적화 AMI를 사용하지 않는 경우 에이전트를 시작하는 --net=host
명령에 docker run 옵션과 원하는 구성에 대한 다음 에이전트 변수를 추가합니다(자세한 내용은 Amazon ECS 컨테이너 에이전트 구성 참조).
ECS_ENABLE_TASK_IAM_ROLE=true
-
bridge
및default
네트워크 모드의 컨테이너 작업에 대한 IAM 역할을 활성화합니다. ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true
-
host
네트워크 모드의 컨테이너 작업에 대한 IAM 역할을 사용합니다. 이 변수는 에이전트 버전 1.12.0 이상에서만 지원됩니다.
예제 실행 명령은 Amazon ECS 컨테이너 에이전트를 수동으로 업데이트하는 방법(비 Amazon ECS 최적화 AMI) 섹션을 참조하세요. 또한 태스크의 컨테이너가 AWS 자격 증명을 검색할 수 있도록 컨테이너 인스턴스에서 다음 네트워킹 명령을 설정해야 합니다.
sudo sysctl -w net.ipv4.conf.all.route_localnet=1
sudo iptables -t nat -A PREROUTING -p tcp -d 169.254.170.2 --dport 80 -j DNAT --to-destination 127.0.0.1:51679
sudo iptables -t nat -A OUTPUT -d 169.254.170.2 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 51679
재부팅 시 이러한 iptables 규칙이 유지되게 하려면 규칙을 컨테이너 인스턴스에 저장해야 합니다. iptables-save 명령과 iptables-restore 명령을 사용하여 iptables 규칙을 저장하고 부팅 시 복원할 수 있습니다. 자세한 정보는 해당 운영 체제 설명서를 참조하세요.
Amazon EC2 Windows 인스턴스 추가 구성
중요
이는 작업 역할을 사용하는 EC2의 Windows 컨테이너에만 적용됩니다.
Windows 기능이 포함된 작업 역할을 사용하려면 EC2에서 추가 구성이 필요합니다.
-
컨테이너 인스턴스를 시작할 때 컨테이너 인스턴스 사용자 데이터 스크립트에
-EnableTaskIAMRole
옵션을 설정해야 합니다.EnableTaskIAMRole
은 태스크에 대한 태스크 IAM 역할 기능을 켭니다. 예:<powershell> Import-Module ECSTools Initialize-ECSAgent -Cluster '
windows
' -EnableTaskIAMRole </powershell> -
Amazon ECS 컨테이너 부트스트랩 스크립트에서 제공되는 네트워킹 명령을 사용하여 컨테이너를 부트스트랩해야 합니다.
-
태스크를 위한 IAM 역할과 정책을 생성해야 합니다. 자세한 내용은 작업 IAM 역할 생성 단원을 참조하십시오.
-
작업 자격 증명 공급자를 위한 IAM 역할은 컨테이너 인스턴스에서 포트 80을 사용합니다. 따라서 컨테이너 인스턴스에서 태스크에 대한 IAM 역할을 구성하면 컨테이너는 어떤 포트 매핑에서도 호스트 포트로 포트 80을 사용할 수 없습니다. 포트 80에서 컨테이너를 노출하려면 로드 밸런싱을 사용하는 컨테이너를 위한 서비스를 구성하는 것이 좋습니다. 로드 밸런서에서 포트 80을 사용할 수 있습니다. 이렇게 하면 트래픽을 컨테이너 인스턴스 상의 다른 호스트 포트로 라우팅할 수 있습니다. 자세한 정보는 로드 밸런싱을 사용하여 Amazon ECS 서비스 트래픽 분산 섹션을 참조하세요.
-
Windows 인스턴스가 다시 시작되면 프록시 인터페이스를 삭제하고 Amazon ECS 컨테이너 에이전트를 다시 초기화하여 자격 증명 프록시를 다시 불러와야 합니다.
Amazon ECS 컨테이너 부트스트랩 스크립트
컨테이너가 컨테이너 인스턴스에서 자격 증명 프록시에 액세스하여 자격 증명을 얻으려면 먼저 필요한 네트워킹 명령을 사용하여 컨테이너를 부트스트랩해야 합니다. 다음 코드 예제 스크립트는 시작할 때 컨테이너에서 실행되어야 합니다.
참고
Windows에서 awsvpc
네트워크 모드를 사용할 때 이 스크립트를 실행할 필요가 없습니다.
Powershell이 포함된 Windows 컨테이너를 실행하는 경우 다음 스크립트를 사용하세요.
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"). You may # not use this file except in compliance with the License. A copy of the # License is located at # # http://aws.amazon.com/apache2.0/ # # or in the "license" file accompanying this file. This file is distributed # on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either # express or implied. See the License for the specific language governing # permissions and limitations under the License. $gateway = (Get-NetRoute | Where { $_.DestinationPrefix -eq '0.0.0.0/0' } | Sort-Object RouteMetric | Select NextHop).NextHop $ifIndex = (Get-NetAdapter -InterfaceDescription "Hyper-V Virtual Ethernet*" | Sort-Object | Select ifIndex).ifIndex New-NetRoute -DestinationPrefix 169.254.170.2/32 -InterfaceIndex $ifIndex -NextHop $gateway -PolicyStore ActiveStore # credentials API New-NetRoute -DestinationPrefix 169.254.169.254/32 -InterfaceIndex $ifIndex -NextHop $gateway -PolicyStore ActiveStore # metadata API
Command 셸만 있는 Windows 컨테이너를 실행하는 경우 다음 스크립트를 사용합니다.
# Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"). You may # not use this file except in compliance with the License. A copy of the # License is located at # # http://aws.amazon.com/apache2.0/ # # or in the "license" file accompanying this file. This file is distributed # on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either # express or implied. See the License for the specific language governing # permissions and limitations under the License. for /f "tokens=1" %i in ('netsh interface ipv4 show interfaces ^| findstr /x /r ".*vEthernet.*"') do set interface=%i for /f "tokens=3" %i in ('netsh interface ipv4 show addresses %interface% ^| findstr /x /r ".*Default.Gateway.*"') do set gateway=%i netsh interface ipv4 add route prefix=169.254.170.2/32 interface="%interface%" nexthop="%gateway%" store=active # credentials API netsh interface ipv4 add route prefix=169.254.169.254/32 interface="%interface%" nexthop="%gateway%" store=active # metadata API