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

최종 업데이트 날짜: 2019년 7월 26일

보안 또는 민감한 데이터를 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 컨테이너 에이전트는 작업 실행 IAM 역할을 사용하여 AWS Systems Manager Parameter Store 또는 Secrets Manager에서 정보를 가져옵니다. 작업 실행 AWS Identity and Access Management(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 콘솔에서 다음을 수행합니다.

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

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

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

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

5.    [컨테이너 정의] 섹션에서 [컨테이너 추가]를 선택합니다.

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

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

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

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

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.    작업 정의를 등록하려면 다음 register-task-definition 명령을 실행합니다.

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

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

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

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

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

2.    [Clusters]를 선택하고 서비스에서 클러스터를 선택합니다.

3.    [Force New Deployment] 확인란을 선택하고 [Update Service]를 선택합니다.

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


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

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?