보안 또는 민감한 데이터를 Amazon ECS 태스크의 컨테이너에 안전하게 전달하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 9월 29일

보안 또는 민감한 데이터를 Amazon Elastic Container Service(Amazon ECS) 태스크 컨테이너에 안전하게 전달하고 싶습니다.

간략한 설명

민감한 데이터를 평문으로 전달하면 보안 문제가 발생할 수 있습니다. 이 정보는 AWS Management Console 또는 AWS API(예: DescribeTaskDefinition 또는 DescribeTasks)를 통해 검색할 수 있습니다.

보안 모범 사례로서, 민감한 정보를 환경 변수로 컨테이너에 전달합니다. ECS 태스크 정의의 컨테이너 정의에서 AWS Systems Manager Parameter Store 또는 AWS Secrets Manager에 저장된 값을 참조하여 데이터를 컨테이너에 안전하게 삽입할 수 있습니다. 그런 다음, 컨테이너의 로그 구성에서 또는 환경 변수로서 민감한 정보를 공개할 수 있습니다.

AWS는 다음 경우에만 데이터 삽입을 지원합니다.

​해결 방법

사전 조건 이행

1.    AWS Systems Manager Parameter Store 또는 Secrets Manager에 민감한 정보를 저장합니다.

AWS Systems Manager Parameter Store의 경우 다음 명령을 실행합니다.

aws ssm put-parameter --type SecureString --name awsExampleParameter --value awsExampleValue

Secrets Manager의 경우 다음 명령을 실행합니다.

aws secretsmanager create-secret --name awsExampleParameter --secret-string awsExampleValue

참고: Amazon ECS 컨테이너 에이전트는 태스크 실행 AWS Identity and Access Management(IAM) 역할을 사용하여 AWS Systems Manager Parameter Store 또는 Secrets Manager에서 정보를 가져옵니다. 태스크 실행 IAM 역할은 ssm:GetParameters, secretsmanager:GetSecretValuekms:Decrypt 작업에 권한을 부여해야 합니다.

2.    IAM 콘솔을 열고 ecs-tasks.amazonaws.com에 대한 신뢰 관계를 보유한 역할을 생성합니다. 예:

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

3.    IAM 콘솔에서 역할에 대한 인라인 정책을 생성하려면 [역할]을 선택하고 2단계에서 생성한 역할을 선택하고 [권한] 탭에서 [인라인 정책 추가]를 선택합니다. [JSON] 탭을 선택하고 다음 코드로 정책을 생성합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ssm:GetParameters",
        "secretsmanager:GetSecretValue"
      ],
      "Resource": [
        "arn:aws:ssm:us-east-1:awsExampleAccountID:parameter/awsExampleParameter",
        "arn:aws:secretsmanager:us-east-1:awsExampleAccountID:secret:awsExampleParameter*"
      ]
    }
  ]
}

참고: us-east-1awsExampleAccountID를 파라미터가 저장된 AWS 리전 및 계정으로 바꿉니다. awsExampleParameter를 1단계에서 생성한 파라미터 이름으로 바꿉니다.

참고: AWS Systems Manager Parameter Store 또는 Secrets Manager에서 데이터를 암호화하는 데 고객 관리형 KMS 키를 사용하는 경우 kms:Decrypt에 대한 권한도 가져와야 합니다.

4.    (선택 사항) 관리형 정책 AmazonECSTaskExecutionRolePolicy를 2단계에서 생성한 역할에 연결합니다.

중요: Amazon Elastic Container Registry(Amazon ECR)에 저장된 이미지를 사용하거나 Amazon CloudWatch로 로그를 전송하는 태스크에는 관리형 정책이 필요합니다.

ECS 태스크 정의에서 민감한 정보 참조

AWS Management Console에서 다음을 수행합니다.

1.    Amazon ECS 콘솔을 여십시오.

2.    탐색 창에서 [작업 정의]를 선택하고 [새 작업 정의 생성]을 선택합니다.

3.    시작 유형을 선택하고 [다음 단계]를 선택합니다.

4.    [작업 실행 역할]에서 이전에 생성한 작업 실행 IAM 역할을 선택합니다.

5.    [컨테이너 정의(Container Definitions)] 섹션에서 [컨테이너 추가(Add container)]를 선택합니다.

6.    [환경] 아래 [환경 변수] 섹션에 있는 [Key]에 환경 변수의 키를 입력합니다.

7.    [Value] 드롭다운 메뉴에서 [ValueFrom]을 선택합니다.

8.    키에 대한 텍스트 상자에서 Parameter Store 또는 Secrets Manager 리소스의 Amazon 리소스 이름(ARN)을 입력합니다.

참고: 로그 드라이버 구성에서 보안 암호를 지정할 수도 있습니다.

AWS 명령줄 인터페이스(AWS CLI)에서 다음을 수행합니다.

참고: AWS CLI 명령을 실행할 때 오류가 발생하는 경우 최신 버전의 AWS CLI를 사용하고 있는지 확인하세요.

1.    태스크 정의에서 AWS Systems Manager Parameter Store 또는 Secrets Manager 리소스를 환경 변수(secrets 섹션 사용) 또는 로그 구성 옵션(secretOptions 섹션 사용)으로 참조합니다. 예:

{
  "requiresCompatibilities": [
    "EC2"
  ],
  "networkMode": "awsvpc",
  "containerDefinitions": [
    {
      "name": "web",
      "image": "httpd",
      "memory": 128,
      "essential": true,
      "portMappings": [
        {
          "containerPort": 80,
          "protocol": "tcp"
        }
      ],
      "logConfiguration": {
        "logDriver": "splunk",
        "options": {
          "splunk-url": "https://sample.splunk.com:8080"
        },
        "secretOptions": [
          {
            "name": "splunk-token",
            "valueFrom": "arn:aws:secretsmanager:us-east-1:awsExampleAccountID:secret:awsExampleParameter"
          }
        ]
      },
      "secrets": [
        {
          "name": "DATABASE_PASSWORD",
          "valueFrom": "arn:aws:ssm:us-east-1:awsExampleAccountID:parameter/awsExampleParameter"
        }
      ]
    }
  ],
  "executionRoleArn": "arn:aws:iam::awsExampleAccountID:role/awsExampleRoleName"
}

중요: us-east-1awsExampleAccountID를 사용자의 AWS 리전 및 계정 ID로 바꿉니다. awsExampleParameter를 이전에 생성한 파라미터로 바꿉니다. awsExampleRoleName을 이전에 생성한 역할로 바꿉니다.

2.    태스크 정의를 등록하려면 다음 명령을 실행합니다.

aws ecs register-task-definition --family-name yourTaskDefinitionFamily --cli-input-json file://pathToYourJsonFile

사용자가 생성한 태스크 정의를 사용하여 태스크가 시작되면 Amazon ECS 컨테이너 에이전트는 보안을 자동으로 해석하고 이 값을 컨테이너에 환경 변수로 삽입합니다.

중요: 민감한 데이터는 컨테이너가 처음 시작될 때 컨테이너에 삽입됩니다. 보안 또는 Parameter Store 파라미터가 업데이트되거나 순환되면 컨테이너는 업데이트된 값을 자동으로 수신하지 못합니다. 새 태스크를 시작해야 합니다. 태스크가 서비스의 일부인 경우 서비스를 업데이트하고 [새 배포 실행(Force new deployment)] 옵션을 사용하여 서비스에서 강제로 새 태스크를 시작합니다.

새 배포를 강제로 시작하려면 다음을 수행합니다.

1.    Amazon ECS 콘솔을 여십시오.

2.    [클러스터(Clusters)]를 선택한 다음 서비스에서 클러스터를 선택합니다.

3.    [새 배포 실행(Force New Deployment)] 확인란을 선택하고 [서비스 업데이트(Update Service)]를 선택합니다.

참고: AWS CLI에서 새 배포를 강제로 시작하려면 --force-new-deployment 플래그와 함께 update-service 명령을 실행합니다.


이 문서가 도움이 되었습니까?


결제 또는 기술 지원이 필요합니까?