태스크에 대한 IAM 역할 - Amazon Elastic Container Service

태스크에 대한 IAM 역할

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

중요

컨테이너 인스턴스에서 실행되는 컨테이너는 (Amazon EC2 인스턴스 메타데이터 서버를 통해) 컨테이너 인스턴스 프로파일에 제공된 자격 증명에 액세스할 수 있습니다. 컨테이너 인스턴스 역할의 권한을 Amazon ECS 컨테이너 인스턴스 IAM 역할에 표시된 최소 권한 목록으로 제한하는 것이 좋습니다.

awsvpc 네트워크 모드를 사용하는 작업 내 컨테이너가 컨테이너 인스턴스 프로파일에 제공된 자격 증명 정보에 액세스하지 못하게 방지하려면(단, 태스크 역할에 제공된 권한은 허용) 에이전트 구성 파일의 ECS_AWSVPC_BLOCK_IMDS 에이전트 구성 변수를 true로 설정하고 에이전트를 다시 시작합니다. 자세한 내용은 Amazon ECS 컨테이너 에이전트 구성 섹션을 참조하세요

bridge 네트워크 모드를 사용하는 작업 내 컨테이너가 컨테이너 인스턴스 프로파일에 제공된 자격 증명에 액세스하지 못하게 방지하려면(단, 태스크 역할에 제공된 권한은 허용) 컨테이너 인스턴스에서 다음 iptables 명령을 실행합니다. 이 명령은 host 또는 awsvpc 네트워크 모드를 사용하는 태스크 내 컨테이너에는 영향을 미치지 않습니다. 자세한 내용은 네트워크 모드 섹션을 참조하세요

sudo yum install -y iptables-services; sudo iptables --insert FORWARD 1 --in-interface docker+ --destination 169.254.169.254/32 --jump DROP

재부팅 시 이 iptables 규칙이 유지되게 하려면 규칙을 컨테이너 인스턴스에 저장해야 합니다. Amazon ECS 최적화 AMI의 경우 다음 명령을 사용합니다. 다른 운영 체제의 경우 해당 운영 체제 설명서를 참조하세요.

  • Amazon ECS 최적화 Amazon Linux 2 AMI:

    sudo iptables-save | sudo tee /etc/sysconfig/iptables && sudo systemctl enable --now iptables
  • Amazon ECS 최적화 Amazon Linux AMI:

    sudo service iptables save

태스크 정의에 사용할 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 명령으로 사용 가능)에 채웁니다.

참고

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

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

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" }
참고

생성된 IAM 역할 자격 증명의 기본 만료 시간은 6시간입니다.

컨테이너 인스턴스가 버전 1.11.0 이상의 컨테이너 에이전트와 지원되는 버전의 AWS CLI 또는 SDK를 사용하는 경우 SDK 클라이언트는 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI 변수가 사용 가능한지 확인하고 제공된 자격 증명을 사용하여 AWS API를 호출합니다. 자세한 내용은 컨테이너 인스턴스에서 태스크 IAM 역할 활성화지원되는 AWS SDK 사용 섹션을 참조하세요.

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

태스크에 대한 IAM 역할을 사용하는 이점

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

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

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

컨테이너 인스턴스에서 태스크 IAM 역할 활성화

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

컨테이너 인스턴스에 Amazon ECS 최적화 AMI을 사용하지 않는 경우, 에이전트를 시작하는 docker run 명령에 --net=host 옵션과 원하는 구성에 대한 적절한 에이전트 변수를 추가해야 합니다(자세한 내용은 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 정책을 생성해야 합니다. 새 IAM 권한 정책을 만드는 방법은 여러 가지가 있습니다. 찾고 있는 것 중 일부를 처리하도록 이미 마련되어 있는 전체 AWS 관리 정책을 복사한 다음, 이를 특정 요구 사항에 맞춰 사용자 지정할 수 있습니다. 자세한 내용은 IAM 사용 설명서새 정책 생성을 참조하세요.

또한 사용할 작업에 대한 역할을 먼저 생성해야 태스크 정의에서 해당 역할을 지정할 수 있습니다. IAM 콘솔에서 Amazon Elastic Container Service 태스크 역할 서비스 역할을 사용해 역할을 생성할 수 있습니다. 그런 다음 태스크의 컨테이너에 필요한 권한을 부여하는 특정 IAM 정책을 역할과 연결할 수 있습니다. 아래 절차에 이렇게 하는 방법이 나와 있습니다.

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

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

Amazon ECS 태스크 역할 신뢰 관계는 아래 나와 있습니다.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "ecs-tasks.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

태스크에 대한 IAM 정책을 생성하려면

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

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

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

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

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

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

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

  4. 정책 검토 페이지에서 이름AmazonECSTaskS3BucketPolicy 같은 고유한 이름을 입력합니다.

  5. 정책 생성을 선택하여 완료합니다.

Using the JSON editor
  1. 정책 문서 필드에 정책을 붙여넣어 작업에 적용합니다. 아래 예제는 my-task-secrets-bucket Amazon S3 버킷에 대한 권한을 허용합니다. 필요에 따라 정책 문서를 수정할 수 있습니다.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::my-task-secrets-bucket/*" ] } ] }
  2. 정책 생성을 선택합니다.

태스크에 대한 IAM 역할을 생성하려는 방법

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

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

  3. 신뢰할 수 있는 유형의 엔터티 선택 섹션에서 AWS 서비스를 선택합니다.

  4. 이 역할을 사용할 서비스 선)에서 Elastic Container Service를 선택합니다.

  5. 사용 사례 선택에서 Elastic Container Service 태스크를 선택하고 다음: 권한(Next: Permissions)을 선택합니다.

  6. 권한 정책 연결에서 태스크에 사용할 정책(이 예제에서는 AmazonECSTaskS3BucketPolicy)을 선택한 다음, 다음: 태그를 선택합니다.

  7. 태그 추가(선택 사항)에서 IAM 역할에 연결할 메타데이터 태그를 입력하고 다음: 검토를 선택합니다.

  8. 역할 이름에 역할의 이름을 입력합니다. 이 예제에서는 역할 이름으로 AmazonECSTaskS3BucketRole을 입력한 후 역할 생성을 선택하여 마칩니다.

지원되는 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 파라미터를 사용하여 태스크 역할 ARN을 지정합니다. 자세한 내용은 태스크 정의 생성하기 섹션을 참조하세요

    참고

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

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

참고

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