작업에 대한 IAM 역할 - Amazon Elastic Container Service

작업에 대한 IAM 역할

Amazon ECS 작업에는 IAM 역할이 연결될 수 있습니다. IAM 역할에서 부여된 권한은 작업에서 실행 중인 컨테이너에 위임됩니다.

컨테이션 애플리케이션이 AWS API를 호출해야 하는 경우 AWS 자격 증명으로 AWS API 요청에 서명해야 하며, 작업 IAM 역할은 Amazon EC2 인스턴스 프로파일이 Amazon EC2 인스턴스에 자격 증명을 제공하는 방식과 유사하게 애플리케이션이 사용할 자격 증명을 관리하는 전략을 제공합니다. AWS 자격 증명을 생성하여 컨테이너에 배포하거나 Amazon EC2 인스턴스의 역할을 사용하는 대신, IAM 역할을 Amazon ECS 작업 정의 또는 RunTask API 작업과 연결할 수 있습니다. 그러면 컨테이너가 AWS SDK 또는 AWS CLI을(를) 사용하여 인증된 AWS 서비스로 API 요청을 할 수 있습니다.

다음은 작업에 IAM 역할을 사용할 때의 이점을 설명합니다.

  • 자격 증명 격리: 컨테이너만 해당 컨테이너가 속하는 태스크 정의에 정의된 IAM 역할에 대한 자격 증명을 검색할 수 있습니다. 다른 작업에 속하는 다른 컨테이너에 대해 정의된 자격 증명에는 액세스할 수 없습니다.

  • 권한 부여: 권한이 없는 컨테이너는 다른 태스크에 대해 정의된 IAM 역할 자격 증명에 액세스할 수 없습니다.

  • 감사: CloudTrail을 통한 액세스 및 이벤트 로깅을 사용하여 소급적 감사를 실행합니다. 태스크 자격 증명은 세션에 연결된 taskArn의 컨텍스트가 있으므로 CloudTrail 로그에 어느 태스크가 어느 역할을 사용하는지 표시됩니다.

참고

작업에 대한 IAM 역할을 지정할 때 해당 작업에 대한 컨테이너의 AWS CLI 또는 다른 SDK는 작업 역할에 의해 단독으로 제공된 AWS 자격 증명을 사용하며 Amazon EC2 또는 실행 중인 외부 인스턴스에서 IAM 권한을 더 이상 상속하지 않습니다.

작업 정의에 사용할 작업 IAM 역할을 정의하거나 RunTask API 작업을 사용하여 수동으로 작업을 실행할 경우 taskRoleArn 오버라이드를 사용할 수 있습니다. Amazon ECS 에이전트는 역할 자격 증명이 지정된 추가 필드를 사용하여 태스크를 시작하기 위한 페이로드 메시지를 수신합니다. Amazon ECS 에이전트는 태스크의 인증 토큰이 페이로드에서 수신된 역할 자격 증명을 가리키도록 고유한 태스크 자격 증명 ID를 인증 토큰으로 설정하고 내부 자격 증명 캐시를 업데이트합니다. Amazon ECS 에이전트는 다음 URI: /credential_provider_version/credentials?id=task_credential_id를 사용하여 이 태스크에 속하는 모든 컨테이너에 대해 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 환경 변수를 Env 객체(docker inspect container_id 명령으로 사용 가능)에 채웁니다.

컨테이너 내부에서 다음 명령을 사용하여 자격 증명 엔드포인트를 쿼리할 수 있습니다.

curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI

출력:

{ "AccessKeyId": "ACCESS_KEY_ID", "Expiration": "EXPIRATION_DATE", "RoleArn": "TASK_ROLE_ARN", "SecretAccessKey": "SECRET_ACCESS_KEY", "Token": "SECURITY_TOKEN_STRING" }

Amazon EC2 인스턴스가 버전 1.11.0 이상의 컨테이너 에이전트와 지원되는 버전의 AWS CLI 또는 SDK를 사용하는 경우 SDK 클라이언트는 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 변수가 사용 가능한지 확인하고 제공된 자격 증명을 사용하여 AWS API를 호출합니다. 자세한 정보는 Amazon EC2 또는 외부 인스턴스에서 작업 IAM 역할 활성화지원되는 AWS SDK 사용 단원을 참조하십시오.

자격 증명 공급자가 사용될 때마다 요청이 /var/log/ecs/audit.log.YYYY-MM-DD-HH의 호스트 컨테이너 인스턴스에 로컬로 기록됩니다. 자세한 정보는 작업 자격 증명 감사 로그를 위한 IAM 역할을 참조하십시오.

중요

작업 IAM 역할을 생성할 때는 조건 키를 사용하여 혼동된 대리인 보안 문제를 방지합니다. 혼동되는 대리인 보안 문제를 방지하기 위해 역할과 연결된 신뢰 관계 또는 IAM 정책에서 aws:SourceAccount 또는 aws:SourceArn 조건 키를 사용하는 것이 좋습니다. 이러한 조건 키는 신뢰 관계 또는 역할과 연결된 IAM 정책에서 지정할 수 있습니다. 혼동되는 대리인 문제 및 AWS 계정 보호 방법에 대해 자세히 알아보려면, IAM 사용 설명서혼동되는 대리인 문제를 참조하세요.

Amazon EC2 인스턴스에서 호스팅되는 태스크에 대한 고려 사항

Amazon EC2 인스턴스에서 실행 중인 태스크에 IAM 역할을 사용할 때 컨테이너는 Amazon EC2 인스턴스 메타데이터 서버를 통해 Amazon EC2 인스턴스 프로파일에 제공되는 자격 증명에 액세스할 수 있습니다. 컨테이너 인스턴스 역할의 권한을 AmazonEC2ContainerServiceforEC2Role 관리형 IAM 정책에서 사용되는 최소 권한 목록으로 제한하는 것이 좋습니다. 자세한 정보는 Amazon ECS 컨테이너 인스턴스 IAM 역할을 참조하십시오.

Amazon EC2 인스턴스에서 호스팅되는 태스크에 태스크 IAM 역할을 사용할 때 다음 사항도 고려해야 합니다.

  • 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

Amazon EC2 또는 외부 인스턴스에서 작업 IAM 역할 활성화

작업 IAM 역할을 활성화하려면 Amazon EC2 또는 외부 인스턴스에 버전 1.11.0 이상의 컨테이너 에이전트가 필요합니다. 하지만 최신 컨테이너 에이전트 버전을 사용할 것을 권장합니다. 에이전트 버전을 확인하고 최신 버전으로 업데이트하는 방법에 대한 자세한 내용은 Amazon ECS 컨테이너 에이전트 업데이트 섹션을 참조하세요. Amazon ECS 최적화 AMI를 사용하는 경우 해당 인스턴스에는 1.11.0-1 이상의 ecs-init 패키지가 필요합니다. 인스턴스가 Amazon ECS 최적화 AMI를 사용하는 경우 필요한 버전의 컨테이너 에이전트 및 ecs-init이(가) 포함되어 있습니다. 자세한 정보는 Amazon ECS 최적화 AMI을 참조하십시오.

컨테이너 인스턴스에 Amazon ECS 최적화 AMI을 사용하지 않는 경우 에이전트를 시작하는 --net=host 명령에 docker run 옵션과 원하는 구성에 대한 다음 에이전트 변수를 추가해야 합니다(자세한 내용은 Amazon ECS 컨테이너 에이전트 구성 참조).

ECS_ENABLE_TASK_IAM_ROLE=true

bridgedefault 네트워크 모드의 컨테이너 태스크에 대한 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 규칙을 저장하고 부팅 시 복원할 수 있습니다. 자세한 내용은 해당 운영 체제 설명서를 참조하세요.

작업에 대한 IAM 역할 및 정책 생성

사용할 작업에 대한 IAM 정책을 생성할 때는 작업의 컨테이너에게 위임할 권한을 정책에 포함해야 합니다. 예시의 기존 AWS 관리형 정책을 사용하거나 특정 요구 사항에 맞는 사용자 지정 정책을 처음부터 만들 수 있습니다. 자세한 내용은 IAM 사용 설명서에서 IAM 정책 생성을 참조하세요.

중요

작업 IAM 역할을 생성할 때는 조건 키를 사용하여 혼동된 대리인 보안 문제를 방지합니다. 혼동되는 대리인 보안 문제를 방지하기 위해 역할과 연결된 신뢰 관계 또는 IAM 정책에서 aws:SourceAccount 또는 aws:SourceArn 조건 키를 사용하는 것이 좋습니다. 이러한 조건 키는 신뢰 관계 또는 역할과 연결된 IAM 정책에서 지정할 수 있습니다. 혼동되는 대리인 문제 및 AWS 계정 보호 방법에 대해 자세히 알아보려면, IAM 사용 설명서혼동되는 대리인 문제를 참조하세요.

IAM 정책이 생성되면 Amazon ECS 작업 정의에 참조하는 정책을 포함하는 IAM 역할을 생성할 수 있습니다. IAM 콘솔에서 Elastic Container Service Task 사용 사례를 사용해 역할을 생성할 수 있습니다. 그런 다음 태스크의 컨테이너에 필요한 권한을 부여하는 특정 IAM 정책을 역할과 연결할 수 있습니다. 아래 절차에 이렇게 하는 방법이 나와 있습니다.

IAM 권한이 필요한 태스크 정의 또는 서비스가 여러 개인 경우 각 태스크 정의 또는 서비스에 대해 태스크에 필요한 권한을 최소한으로 포함하는 역할을 생성하여 각 태스크에 제공하는 액세스를 최소화할 것을 고려해야 합니다.

해당 리전의 서비스 엔드포인트에 대한 자세한 내용은 Amazon Web Services 일반 참조 가이드서비스 엔드포인트를 참조하세요.

IAM 작업 역할에는 ecs-tasks.amazonaws.com 서비스를 지정하는 신뢰 정책이 있어야 합니다. sts:AssumeRole 권한을 사용하면 작업이 Amazon EC2 인스턴스에서 사용하는 것과 다른 IAM 역할을 맡을 수 있습니다. 이렇게 하면 작업이 Amazon EC2 인스턴스와 연결된 역할을 상속하지 않습니다. 혼동되는 대리인 보안 문제를 방지하기 위해 aws:SourceAccount 또는 aws:SourceArn 조건 키를 사용하여 권한 범위를 추가로 지정하는 것이 좋습니다. 이러한 조건 키는 신뢰 관계 또는 역할과 연결된 IAM 정책에서 지정할 수 있습니다. 혼동되는 대리인 문제 및 AWS 계정 보호 방법에 대해 자세히 알아보려면, IAM 사용 설명서혼동되는 대리인 문제를 참조하세요.

다음은 신뢰 정책 예시입니다. 리전 식별자를 교체하고 작업을 시작할 때 사용하는 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 정책 생성 방법(AWS Management Console)

이 예제에서는 Amazon S3 버킷에 대한 읽기 전용 액세스를 허용하는 정책을 생성합니다. 이 버킷에 데이터베이스 자격 증명 또는 기타 암호를 저장할 수 있으며, 태스크의 컨테이너가 버킷에서 자격 증명을 읽고 애플리케이션에 로드할 수 있습니다.

  1. https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

  2. 탐색 창에서 정책을 선택한 후 정책 생성을 선택합니다.

  3. 다음 탭 중 하나에 있는 단계를 따릅니다. 시각 또는 JSON 에디터 사용법을 볼 수 있습니다.

Using the visual editor
  1. 서비스(Service)에서 S3을 선택합니다.

  2. 작업의 경우 읽기 옵션을 확장하고 GetObject를 선택합니다.

  3. 리소스에서 ARN 추가(Add ARN)를 선택하고 Amazon S3 버킷의 전체 Amazon 리소스 이름(ARN)을 입력합니다.

  4. (선택 사항) 조건 요청(Request conditions)에서 조건 추가(Add condition)를 선택합니다. 이는 혼동되는 대리인 보안 문제를 방지하기 위해 권장됩니다. 혼동되는 대리인 문제 및 AWS 계정 보호 방법에 대해 자세히 알아보려면, IAM 사용 설명서혼동되는 대리인 문제를 참조하세요.

    1. 조건 키(Condition key)에서 aws:SourceAccount 또는 aws:SourceArn 중 하나를 선택합니다. 글로벌 조건 키에 대한 자세한 내용은 IAM 사용 설명서AWS 글로벌 조건 컨텍스트 키를 참조하세요.

    2. 운영자(Operator)에서 aws:SourceAccount 조건 키를 지정한 경우 StringEquals, 또는 aws:SourceArn 조건 키를 지정한 경우 ArnLike를 선택하세요.

    3. 값(Value)에서 aws:SourceAccount 조건 키를 지정한 경우 AWS 계정 ID, 또는 aws:SourceArn 조건 키를 지정한 경우 Amazon ECS 작업의 Amazon 리소스 이름(ARN)를 선택합니다. 와일드카드를 사용해야 하며, 예를 들어 계정의 모든 작업에 사용할 수 있는 aws:ecs:*:accountId:*이(가) 있습니다.

    4. 추가(Add)를 선택하여 조건 키를 저장합니다. 정책에 추가할 각 조건 키에 대해 이러한 단계를 반복합니다.

  5. 다음: 태그(Next: Tags)를 선택하고 정책을 구성하도록 돕는 리소스 태그를 정책에 추가한 다음 다음: 검토(Next: Review)를 선택합니다.

  6. 정책 검토 페이지에서 이름(Name)AmazonECSTaskS3BucketPolicy 같은 고유한 이름을 입력합니다. 정책에 대한 선택적인 설명을 지정할 수도 있습니다.

  7. 정책이 완료되면 정책 생성(Create policy)을 선택하여 완료합니다.

Using the JSON editor
  1. 정책 문서 필드에 정책을 붙여 넣어 작업에 적용합니다. 아래 예제는 my-task-secrets-bucket Amazon S3 버킷에 대한 권한을 허용합니다. 여기에는 Amazon 리소스 이름(ARN) 또는 특정 계정 ID를 사용하여 특정 작업을 지정하는 데 사용할 수 있는 조건문이 포함됩니다. 이를 통해 추가 보안을 위한 권한의 범위를 넓힐 수 있습니다. 이는 혼동되는 대리인 보안 문제를 방지하기 위해 권장됩니다. 혼동되는 대리인 문제 및 AWS 계정 보호 방법에 대해 자세히 알아보려면, IAM 사용 설명서혼동되는 대리인 문제를 참조하세요.

    다음은 권한 정책의 예입니다. 필요에 따라 정책을 수정할 수 있습니다. 리전 식별자를 교체하고 작업을 시작할 때 사용하는 AWS 계정 번호를 지정해야 합니다.

    { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:GetObject" ], "Resource":[ "arn:aws:s3:::my-task-secrets-bucket/*" ], "Condition":{ "ArnLike":{ "aws:SourceArn":"arn:aws:ecs:us-west-2:111122223333:*" }, "StringEquals":{ "aws:SourceAccount":"111122223333" } } } ] }
  2. 다음: 태그(Next: Tags)를 선택하고 정책을 구성하도록 돕는 리소스 태그를 정책에 추가한 다음 다음: 검토(Next: Review)를 선택합니다.

  3. 정책 검토 페이지에서 이름(Name)AmazonECSTaskS3BucketPolicy 같은 고유한 이름을 입력합니다. 정책에 대한 선택적인 설명을 지정할 수도 있습니다.

  4. 정책이 완료되면 정책 생성(Create policy)을 선택하여 완료합니다.

작업에 대한 IAM 역할 생성 방법(AWS Management Console)

  1. https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

  2. 탐색 창에서 Roles(역할), Create role(역할 생성)을 선택합니다.

  3. 신뢰할 수 있는 엔터티 선택(Select trusted entity) 섹션에서 AWS 서비스를 선택합니다.

  4. 사용 사례(Use case)에서 드롭다운 메뉴를 사용하여Elastic Container Service, Elastic Container Service Task 사용 사례, 다음(Next)을 선택합니다.

  5. 권한 추가(Add permissions)에서 작업에 사용할 정책(이 예제에서는 AmazonECSTaskS3BucketPolicy)을 선택한 다음, 다음(Next)을 선택합니다.

  6. 단계 3: 이름, 검토 및 생성(Step 3: Name, review, and create)에서 다음을 수행합니다.

    1. 역할 이름(Role name)에 역할의 이름을 입력합니다. 이 예에서는 역할 이름에 AmazonECSTaskS3BucketRole을(를) 입력합니다.

    2. (선택 사항) 설명(Description)에서 이 IAM 역할에 대한 설명을 지정합니다.

    3. 역할에 대한 신뢰할 수 있는 엔터티 및 권한 정책을 검토합니다.

    4. 태그 추가(Add tags)(선택 사항)에서 IAM 역할에 연결할 메타데이터 태그를 입력하고 역할 선택(Create role)을 선택합니다.

지원되는 AWS SDK 사용

2016년 7월 13일부터 AWS SDK에서 태스크에 대한 IAM 역할이 지원됩니다. 태스크의 컨테이너가 이 날짜 이후에 생성된 AWS SDK 버전을 사용해야 합니다. AWS Linux 배포 패키지 관리자에 포함된 SDK가 이 기능을 지원하지 않는 이전 버전일 수 있습니다.

지원되는 SDK를 사용하는지 확인하려면 최신 버전을 위해 컨테이너를 빌드할 때 Amazon Web Services용 도구에서 선호하는 SDK에 대한 설치 지침을 따르세요.

작업에 대한 IAM 역할 지정

역할을 생성하고 정책을 역할에 연결한 후 해당 역할을 수임하는 태스크를 실행할 수 있습니다. 이렇게 하기 위한 옵션은 여러 가지가 있습니다.

  • 태스크 정의에서 태스크에 대한 IAM 역할을 정의합니다. 새 태스크 정의를 생성하거나 기존 태스크 정의를 개정하고 앞서 생성한 역할을 지정합니다. 클래식 콘솔을 사용하여 작업 정의를 생성하는 경우 작업 역할 필드에서 IAM 역할을 선택합니다. AWS CLI 또는 SDK를 사용하는 경우 taskRoleArn 파라미터를 사용하여 작업 역할의 Amazon 리소스 이름(ARN)을 지정합니다. 자세한 정보는 새 콘솔을 사용하여 태스크 정의 생성을 참조하십시오.

    참고

    Amazon ECS 서비스에서 IAM 태스크 역할을 사용하려는 경우 이 옵션이 필요합니다.

  • 태스크를 실행할 때 IAM 태스크 역할 재정의를 지정합니다. 태스크를 실행할 때 IAM 태스크 역할 오버라이드를 지정할 수 있습니다. 클래식 콘솔을 사용하여 작업을 실행하는 경우 고급 옵션(Advanced Options)을 선택하고 작업 역할(Task Role) 필드에서 IAM 역할을 선택합니다. AWS CLI 또는 SDK를 사용하는 경우 taskRoleArn JSON 개체에서 overrides 파라미터를 사용하여 태스크 역할 ARN을 지정합니다. 자세한 내용은 독립 실행형 작업 실행 섹션을 참조하세요.

참고

태스크와 서비스를 실행하는 데 필요한 표준 Amazon ECS 권한 이외에, IAM 사용자는 태스크에 대한 IAM 역할을 사용하기 위한 iam:PassRole 권한도 필요합니다.