내용으로 건너뛰기

Amazon ECS 작업의 컨테이너에 보안 암호나 민감한 정보를 안전하게 전달하려면 어떻게 해야 합니까?

5분 분량
0

Amazon Elastic Container Service(Amazon ECS) 작업에서 보안 암호나 민감한 정보를 컨테이너에 안전하게 전달하려고 합니다.

간략한 설명

민감한 데이터를 일반 텍스트로 전달하면 보안 문제가 발생할 수 있습니다. AWS Management Console에서 또는 DescribeTaskDefinition AWS API를 통해 해당 데이터를 검색할 수 있습니다.

보안 모범 사례로서 민감한 정보를 환경 변수로 컨테이너에 전달합니다. 데이터를 컨테이너에 안전하게 삽입하려면 AWS Systems Manager의 기능인 Parameter Store에 저장된 값을 참조하십시오. Amazon ECS 작업 정의에서 AWS Secrets Manager를 사용할 수도 있습니다. 그런 다음, 민감한 정보를 환경 변수로 또는 컨테이너의 로그 구성에 노출할 수 있습니다.

해결 방법

참고: AWS Command Line Interface(AWS CLI) 명령 실행 시 오류가 발생하는 경우, AWS CLI 오류 문제 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.

전제 조건:

  • 작업에는 AWS Fargate 시작 유형과 함께 AWS Fargate 플랫폼 버전 1.3.0 이상을 사용해야 합니다.
  • 컨테이너 인스턴스는 Amazon Elastic Compute Cloud(Amazon EC2) 시작 유형과 함께 amazon-ecs-agent 버전 1.22.0 이상을 사용해야 합니다. 자세한 내용은 GitHub 웹 사이트의 Changelog를 참조하십시오.
  • JSON 키를 삽입하려면 Fargate 플랫폼에 Linux의 경우 1.4.0 이상, Windows의 경우 1.0.0 버전이 있어야 합니다.
  • 특정 JSON 키 또는 보안 암호 버전을 사용하려면 컨테이너 인스턴스의 ECS 컨테이너 에이전트가 보안 암호 삽입을 위해 버전 1.37.0 이상을 실행해야 합니다.
  • 보안 암호의 전체 내용을 로그 구성 또는 환경 변수에 삽입하려면 컨테이너 인스턴스의 ECS 컨테이너 에이전트가 버전 1.22.0 이상을 실행해야 합니다.

IAM 역할 및 정책 만들기

다음 단계를 완료하십시오.

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

    Parameter Store의 경우 다음 put-parameter AWS CLI 명령을 실행합니다.

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

    참고: awsExampleParameter를 사용자 고유의 파라미터로 바꾸십시오. awsExampleValue를 보안 암호 값으로 바꾸십시오.

    Secrets Manager의 경우 다음 create-secret AWS CLI 명령을 실행합니다.

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

    참고: awsExampleParameter를 사용자 고유의 파라미터로 바꾸십시오. awsExampleValue를 보안 암호 값으로 바꾸십시오. ECS 컨테이너 에이전트는 작업 실행 역할을 사용하여 Parameter Store 또는 Secrets Manager에서 정보를 가져옵니다. 작업 실행 역할은 ssm:GetParameters, secretsmanager:GetSecretValuekms:Decrypt 작업에 대한 권한을 부여해야 합니다.

  2. AWS Identity and Access Management(IAM) 콘솔을 엽니다.

  3. ecs-tasks.amazonaws.com에 대한 신뢰 관계가 있는 역할을 만듭니다.
    역할의 신뢰 정책 예시:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
            "Service": "ecs-tasks.amazonaws.com"
          },
          "Action": "sts:AssumeRole"
        }
      ]
    }
  4. 역할을 선택한 다음, 만든 역할을 선택합니다.

  5. 권한 탭에서 권한 추가 드롭다운 목록을 선택합니다.

  6. 인라인 정책 생성을 선택한 다음, JSON 탭을 선택합니다.

  7. 다음 정책을 연결합니다.

    {
      "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를 만든 파라미터의 이름으로 바꾸십시오. AWS Key Management Service(AWS KMS) 고객 관리형 키를 사용하여 Parameter Store 또는 Secrets Manager의 데이터를 암호화할 수 있습니다. 고객 관리형 키를 사용하려면 kms:Decrypt에 대한 권한을 얻으십시오.

  8. (선택 사항) 만든 역할에 관리형 정책 AmazonECSTaskExecutionRolePolicy를 연결합니다.

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

ECS 작업 정의에서 민감한 정보 참조

Amazon ECS 콘솔 또는 AWS CLI를 사용하여 ECS 작업 정의에서 민감한 정보를 참조할 수 있습니다.

Amazon ECS 콘솔 사용

다음 단계를 완료합니다.

  1. Amazon ECS 콘솔을 엽니다.
  2. 탐색 창에서 Task Definitions(작업 정의)를 선택한 다음, Create new task definition(새 작업 정의 생성)을 선택합니다.
    작업 정의 패밀리에 이름을 입력합니다.
    시작 유형에서 시작 유형으로 AWS Fargate 또는 Amazon EC2 인스턴스를 선택합니다.
  3. Task execution role(작업 실행 역할)에서 만든 작업 실행 IAM 역할을 선택합니다.
  4. 컨테이너 정의 섹션의 환경 변수 섹션에서 환경 변수 추가를 선택합니다.
  5. 에 환경 변수의 키를 입력합니다.
  6. ValueType 드롭다운 목록에서 ValueFrom을 선택합니다.
  7. 키 텍스트 상자에 Parameter Store 또는 Secrets Manager 리소스의 Amazon 리소스 이름(ARN)을 입력합니다.
    참고: 로그 드라이버 구성에서 보안 암호를 지정할 수도 있습니다.

AWS CLI 사용

secrets 섹션을 사용하여 작업 정의에서 Parameter Store 또는 Secrets Manager 리소스를 환경 변수로 참조할 수 있습니다. 또는 secretOptions 섹션을 사용하여 Parameter Store 또는 Secrets Manager를 로그 구성 옵션으로 참조할 수 있습니다.

작업 정의 예시:

{
  "requiresCompatibilities": [
    "EC2"
  ],
  "family": "Web",
  "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를 리전 및 계정 ID로 바꾸십시오. awsExampleParameter를 만든 파라미터로 바꾸십시오. awsExampleRoleName을 만든 역할로 바꾸십시오.

그 후 다음 register-task-definition AWS CLI 명령을 실행하여 작업 정의를 등록합니다.

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

참고: yourTaskDefinitionFamily를 작업 정의 패밀리 이름으로 바꾸십시오.

이 정의로 작업을 시작하면 ECS 컨테이너 에이전트가 자동으로 보안 암호를 확인합니다. 그런 다음, 컨테이너 에이전트는 값을 환경 변수로 컨테이너에 삽입합니다.

보안 암호 업데이트 및 변경 사항 배포

ECS 컨테이너를 시작하면 컨테이너가 민감한 데이터를 컨테이너에 삽입합니다. 보안 암호 또는 Parameter Store 파라미터를 업데이트하거나 교체하면 컨테이너가 업데이트된 값을 자동으로 수신하지 않습니다. 사용자는 새 작업을 시작해야 합니다. 작업이 서비스의 일부인 경우 서비스를 업데이트하십시오. 서비스에서 새 작업을 시작하도록 적용하려면 새 배포 강제 적용 옵션을 사용합니다.

새 배포를 적용하려면 다음 단계를 완료하십시오.

  1. Amazon ECS 콘솔을 엽니다.
  2. 클러스터를 선택한 다음, 서비스가 있는 클러스터를 선택합니다.
  3. 업데이트 드롭다운 목록에서 새 배포 강제 적용을 선택합니다.
    참고: AWS CLI에서 새 배포를 적용하려면 --force-new-deployment 플래그를 사용하여 update-service 명령을 실행하십시오.

관련 정보

Amazon ECS 컨테이너 에이전트 업데이트