질문 5: EC2 인스턴스로 구성된 ECS 클러스터에 애플리케이션을 배포하고 있습니다. 현재 클러스터는 DynamoDB에 대한 API 호출을 성공적으로 실행하는 애플리케이션 하나를 호스팅하고 있습니다. S3에 대한 API 호출을 실행하는 두 번째 애플리케이션을 추가하면 권한 부여 문제가 발생합니다. 문제를 해결하고 적절한 보안을 유지하려면 어떻게 해야 할까요?
EC2 인스턴스 역할을 편집하여 S3에 권한 추가 새 애플리케이션에 대한 IAM 작업 역할 생성 Fargate 모드 활성화 ECS 작업을 허용하도록 S3 버킷 정책 편집
제공해주신 정보와 대화 내용을 바탕으로, EC2 인스턴스로 구성된 ECS 클러스터에서 두 번째 애플리케이션의 권한 문제를 해결하고 적절한 보안을 유지하는 방법에 대해 설명해 드리겠습니다.
현재 상황은 첫 번째 애플리케이션이 DynamoDB에 성공적으로 API 호출을 하는 반면, S3에 API 호출을 실행하는 두 번째 애플리케이션에서 권한 부여 문제가 발생하고 있다는 것입니다. 이는 각 애플리케이션(ECS 태스크)에 필요한 권한이 명확히 분리되지 않았거나, 두 번째 애플리케이션에 S3 접근 권한이 부족하기 때문에 발생합니다.
이 문제를 해결하고 적절한 보안을 유지하기 위한 핵심은 ECS 태스크 역할(ECS Task Role)을 활용하는 것입니다.
다음은 문제 해결을 위한 단계와 제공해주신 옵션에 대한 평가입니다.
문제의 원인 및 권장 해결책
- 문제의 원인 파악:
◦ EC2 인스턴스 프로필의 역할: EC2 시작 유형(EC2 Launch Type)을 사용하는 ECS 클러스터에서, EC2 인스턴스 프로필은 ECS 에이전트가 ECS 서비스로 API 호출을 하거나, ECR(Amazon Elastic Container Registry)에서 Docker 이미지를 가져오거나, CloudWatch Logs로 컨테이너 로그를 전송하는 등의 작업을 수행하는 데 사용됩니다. 또한 Secrets Manager 또는 SSM Parameter Store의 민감한 데이터를 참조할 수도 있습니다.
◦ 첫 번째 애플리케이션이 DynamoDB에 접근할 수 있었던 것은 아마도 이 EC2 인스턴스 프로필에 DynamoDB 접근 권한이 있었거나, 해당 태스크에 이미 DynamoDB 접근 권한이 있는 태스크 역할이 할당되었기 때문일 수 있습니다.
◦ 하지만 두 번째 애플리케이션이 S3에 접근하지 못하는 것은 해당 애플리케이션이 실행되는 컨테이너가 S3 접근에 필요한 권한을 가지고 있지 않기 때문입니다. EC2 인스턴스 프로필의 권한은 ECS 에이전트의 동작에 초점을 맞추며, 개별 애플리케이션의 세분화된 서비스 접근 권한을 부여하는 데 적합하지 않습니다.
- 해결책: ECS 태스크 역할 사용 (권장)
◦ Amazon ECS는 각 태스크가 특정 역할을 가질 수 있도록 허용합니다. 이를 통해 실행하는 다른 ECS 서비스에 대해 다른 역할을 사용할 수 있게 해줍니다.
◦ 각 태스크 정의(Task Definition)당 하나의 IAM 역할을 가질 수 있으며, 이 태스크 역할은 태스크 정의 내에서 정의됩니다.
◦ 이를 통해 각 애플리케이션(태스크)에 **최소 권한의 원칙(Principle of Least Privilege)**을 적용하여 필요한 권한만 부여할 수 있습니다. 즉, DynamoDB에 접근하는 첫 번째 애플리케이션에는 DynamoDB 관련 권한만, S3에 접근하는 두 번째 애플리케이션에는 S3 관련 권한만 부여하는 것입니다.
구체적인 구현 방법
• 새 애플리케이션에 대한 IAM 태스크 역할 생성:
◦ AWS IAM 콘솔에서 새로운 IAM 역할을 생성합니다. 이 역할에는 두 번째 애플리케이션이 S3 버킷에 접근하는 데 필요한 최소한의 권한(s3:GetObject, s3:PutObject 등)을 부여합니다.
◦ 두 번째 애플리케이션의 태스크 정의 업데이트: 두 번째 애플리케이션의 ECS 태스크 정의에서 taskRoleArn 또는 executionRoleArn 필드를 사용하여 새로 생성한 S3 접근 IAM 역할의 ARN(Amazon Resource Name)을 지정합니다. 태스크 정의는 Docker 컨테이너를 실행하는 방법에 대한 메타데이터를 JSON 형태로 담고 있으며, 이미지 이름, 포트 바인딩, 메모리 및 CPU 요구 사항, 환경 변수, 네트워킹 정보, IAM 역할, 로깅 구성과 같은 중요한 정보가 포함됩니다.
◦ 첫 번째 애플리케이션의 태스크 역할 확인 (선택 사항): 첫 번째 애플리케이션도 현재 사용 중인 IAM 역할이 DynamoDB에 대한 최소 권한만 가지고 있는지 확인하고, 만약 EC2 인스턴스 프로필의 광범위한 권한을 사용하고 있다면 해당 애플리케이션만을 위한 DynamoDB 접근 IAM 역할을 생성하여 태스크 정의에 명시하는 것을 고려할 수 있습니다. 이렇게 하면 각 태스크가 필요한 권한만 가지게 되어 보안이 강화됩니다.
보안 유지
• 각 태스크에 고유한 역할 할당: 각 애플리케이션에 필요한 AWS 서비스에 대한 접근 권한만 포함하는 별도의 IAM 역할을 할당함으로써, 하나의 애플리케이션에 보안 취약점이 발생하더라도 다른 애플리케이션의 잠재적 피해를 최소화할 수 있습니다.
• 최소 권한 원칙 준수: 각 역할에 필요한 최소한의 권한만 부여하여 불필요한 접근을 방지합니다.
제공해주신 옵션에 대한 평가
- EC2 인스턴스 역할을 편집하여 S3에 권한 추가:
◦ 평가: 이 방법은 기술적으로 작동할 수 있지만, 적절한 보안을 유지하는 방법은 아닙니다. EC2 인스턴스 프로필은 ECS 에이전트의 기본적인 동작에 필요한 권한(예: ECS 서비스 API 호출, ECR에서 이미지 풀, CloudWatch Logs로 로그 전송)을 제공하는 데 사용됩니다. 만약 이 역할에 S3 접근 권한을 추가한다면, 해당 EC2 인스턴스에서 실행되는 모든 ECS 태스크가 S3에 접근할 수 있게 되어 최소 권한 원칙을 위반하고 보안 범위가 넓어집니다. 이는 특정 애플리케이션에만 S3 접근이 필요한 시나리오에서는 바람직하지 않습니다.
- 새 애플리케이션에 대한 IAM 작업 역할 생성:
◦ 평가: 이것이 가장 권장되는 해결책입니다. 소스에 따르면, “ECS 태스크 역할”은 “각 태스크가 특정 역할을 가질 수 있도록 허용”하며, “실행하는 다른 ECS 서비스에 대해 다른 역할을 사용할 수 있게 해줍니다”. 또한, “태스크 역할은 태스크 정의에 정의됩니다”.에서는 “Amazon ECS One IAM Role per Task Definition”이라는 제목으로, 서비스 A가 S3에 접근하고 서비스 B가 DynamoDB에 접근하는 경우 각 서비스(태스크 정의)에 고유한 태스크 역할을 부여하는 다이어그램을 통해 이 개념을 명확히 보여줍니다.
- Fargate 모드 활성화:
◦ 평가: Fargate는 Amazon ECS의 또 다른 실행 유형으로, 사용자가 EC2 인스턴스를 프로비저닝하고 유지할 필요 없이 서버리스 방식으로 Docker 컨테이너를 실행할 수 있게 해줍니다. Fargate를 사용하면 인프라 관리가 간소화될 수 있지만, 이는 권한 문제 자체를 직접적으로 해결하는 방법은 아닙니다. Fargate에서도 여전히 각 태스크에 필요한 권한을 부여하기 위해 IAM 태스크 역할을 사용합니다. 현재 EC2 인스턴스를 기반으로 하는 클러스터에서 발생하는 권한 문제를 해결하기 위해 클러스터의 실행 유형을 변경하는 것은 더 큰 아키텍처 변경이며, 당면한 권한 문제의 직접적인 해결책이라기보다는 인프라 관리 방식의 변화에 가깝습니다.
- ECS 작업을 허용하도록 S3 버킷 정책 편집:
◦ 평가: S3 버킷 정책은 특정 S3 버킷에 대한 접근을 제어하는 중요한 보안 계층입니다. 애플리케이션이 S3에 접근하려면 S3 버킷 정책에서 해당 접근을 허용해야 합니다. 하지만 S3 버킷 정책만으로는 ECS 태스크에 필요한 “신원”이나 “권한”을 부여할 수 없습니다. ECS 태스크가 S3에 접근하기 위한 주요 권한 부여 메커니즘은 IAM 역할이며, S3 버킷 정책은 그 역할을 허용하는 보완적인 역할을 합니다. 즉, 이 옵션만으로는 문제가 해결되지 않으며, 태스크에 적절한 IAM 역할이 할당된 후 해당 역할이 S3 버킷 정책에서 허용되어야 합니다.
결론적으로, S3에 접근해야 하는 두 번째 애플리케이션에 대해 S3 접근 권한을 가진 전용 IAM 태스크 역할을 생성하고 이를 해당 애플리케이션의 ECS 태스크 정의에 명시적으로 할당하는 것이 가장 적절하고 보안을 유지하는 해결책입니다.