Terraform을 사용하여 AWS Control Tower 제어 배포 및 관리 - 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Terraform을 사용하여 AWS Control Tower 제어 배포 및 관리

작성자: Iker Reina Fuente(AWS) 및 Ivan Girardi(AWS)

요약

이 패턴은 AWS Control Tower 제어, HashiCorp Terraform 및 코드형 인프라(IaC)를 사용하여 예방, 탐지 및 사전 예방 보안 제어를 구현하고 관리하는 방법을 설명합니다. 제어(가드레일이라고도 함)는 전체 AWS Control Tower 환경에 지속적인 거버넌스를 제공하는 상위 수준 규칙입니다. 예를 들어 제어를 사용하여에 대한 로깅을 요구 AWS 계정 한 다음 특정 보안 관련 이벤트가 발생할 경우 자동 알림을 구성할 수 있습니다.

AWS Control Tower 는 AWS 리소스를 제어하고 여러에서 규정 준수를 모니터링하는 예방, 탐지 및 사전 예방 제어를 구현하는 데 도움이 됩니다 AWS 계정. 각 컨트롤은 단일 규칙을 적용합니다. 이 패턴에서는 제공된 IaC 템플릿을 사용하여 환경에 배포할 컨트롤을 지정합니다.

AWS Control Tower 제어는 전체 조직 단위(OU)에 적용되며 제어는 OU AWS 계정 내의 모든에 영향을 미칩니다. 따라서 사용자가 랜딩 존의 어떤 계정에서든 작업을 수행하는 경우 해당 작업에는 OU를 제어하는 컨트롤이 적용됩니다.

AWS Control Tower 제어를 구현하면 AWS 랜딩 존에 대한 강력한 보안 기반을 구축하는 데 도움이 됩니다. 이 패턴을 사용하여 Terraform을 통해 IaC로 컨트롤을 배포하면 랜딩 존의 컨트롤을 표준화하고 더 효율적으로 배포 및 관리할 수 있습니다.

AWS Control Tower 제어를 IaC로 배포하려면 Terraform AWS Cloud Development Kit (AWS CDK) 대신를 사용할 수도 있습니다. 자세한 내용은 AWS CDK 및를 사용하여 AWS Control Tower 제어 배포 및 관리를 AWS CloudFormation 참조하세요.

수강 대상

이 패턴은 AWS Control Tower Terraform 및에 대한 경험이 있는 사용자에게 권장됩니다 AWS Organizations.

사전 조건 및 제한 사항

사전 조건 

  • AWS Organizations 및 AWS Control Tower 랜딩 영역의 조직으로 활성 AWS 계정 관리됩니다. 지침은 AWS Control Tower 설명서의 시작하기를 참조하세요.

  • AWS Command Line Interface (AWS CLI), 설치구성됨.

  • 이 패턴을 배포할 권한이 있는 관리 계정의 AWS Identity and Access Management (IAM) 역할입니다. 필수 권한 및 샘플 정책에 대한 자세한 내용은이 패턴의 추가 정보 섹션에서 IAM 역할에 대한 최소 권한 권한을 참조하세요.

  • 관리 계정에서 IAM 역할을 수임할 수 있는 권한입니다.

  • 식별자 CT를 사용하여 서비스 제어 정책(SCP) 기반 제어를 적용합니다. CLOUDFORMATIONPR.1. 사전 예방적 제어를 배포하려면 활성화해야 SCP 합니다. 지침은 AWS CloudFormation 레지스트리 내에서 리소스 유형, 모듈 및 후크 관리 허용 안 함을 참조하세요.

  • Terraform CLI, 설치됨(Terraform 설명서).

  • Terraform AWS Provider, 구성됨(Terraform 설명서).

  • Terraform 백엔드, 구성됨(Terraform 설명서).

제한 사항

  • AWS Control Tower 제어의 경우이 패턴에는 다음 형식의 글로벌 식별자를 사용해야 합니다.

    arn:<PARTITION>:controlcatalog:::control/<CONTROL_CATALOG_OPAQUE_ID>

    이 패턴의 이전 버전에서는 더 이상 지원되지 않는 리전 식별자를 사용했습니다. 리전 식별자에서 글로벌 식별자로 마이그레이션하는 것이 좋습니다. 글로벌 식별자는 제어를 관리하고 사용할 수 있는 제어 수를 확장하는 데 도움이 됩니다.

    참고

    대부분의 경우의 값은 <PARTITION>입니다aws.

제품 버전

  • AWS Control Tower 버전 3.2 이상

  • Terraform 버전 1.5 이상

  • Terraform AWS Provider 버전 4.67 이상

아키텍처

이 섹션에서는 이 솔루션과 샘플 코드를 통해 설정된 아키텍처에 대한 종합적 개요를 제공합니다. 다음 다이어그램은 OU의 다양한 계정 전반적으로 배포된 제어를 보여줍니다.

조직 단위의 모든 AWS 계정에 배포된 제어의 아키텍처 다이어그램입니다.

AWS Control Tower 제어는 동작지침에 따라 분류됩니다.

제어 동작에는 세 가지 기본 유형이 있습니다.

  1. 예방 제어는 조치가 발생하지 않도록 설계되었습니다. 이는의 서비스 제어 정책(SCPs) 또는 리소스 제어 정책(RCPs)으로 구현됩니다 AWS Organizations. 예방적 제어의 상태는 적용 또는 활성화되지 않음입니다. 예방 제어는 모두 지원됩니다 AWS 리전.

  2. 감지 제어는 특정 이벤트가 발생할 때 감지하고 작업을 로그인하도록 설계되었습니다 AWS CloudTrail. 이는 AWS Config 규칙으로 구현됩니다. 탐지적 제어의 상태는 정상, 위반 또는 활성화되지 않음입니다. Detective 제어는에서 AWS 리전 지원하는 에만 적용됩니다 AWS Control Tower.

  3. 사전 예방적 제어는에서 프로비저닝할 리소스를 스캔 AWS CloudFormation 하고 회사 정책 및 목표를 준수하는지 확인합니다. 규정을 준수하지 않는 리소스는 프로비저닝되지 않습니다. 이는 AWS CloudFormation 후크로 구현됩니다. 사전 예방적 제어의 상태는 PASS, FAIL또는 입니다SKIP.

제어 지침은 각 제어를에 적용하는 방법에 대한 권장 방법입니다OUs.는 필수, 강력 권장선택의 세 가지 범주의 지침을 AWS Control Tower 제공합니다. 컨트롤의 지침은 동작과 무관합니다. 자세한 내용은 제어 동작 및 지침을 참조하십시오.

도구

AWS 서비스

  • AWS CloudFormation는 AWS 리소스를 설정하고, 빠르고 일관되게 프로비저닝하고, AWS 계정 및 리전의 수명 주기 동안 리소스를 관리할 수 있도록 지원합니다.

  • AWS Config는의 리소스 AWS 계정 와 리소스 구성 방법에 대한 세부 보기를 제공합니다. 리소스가 서로 관련되는 방식과 리소스의 구성이 시간이 지남에 따라 변경된 방식을 식별하는 데 도움이 됩니다.

  • AWS Control Tower는 규범적 모범 사례를 따라 AWS 다중 계정 환경을 설정하고 관리하는 데 도움이 됩니다.

  • AWS Organizations는 여러를 생성하여 중앙에서 관리하는 조직 AWS 계정 으로 통합하는 데 도움이 되는 계정 관리 서비스입니다.

기타 도구

  • HashiCorp Terraform은 코드를 사용하여 클라우드 인프라 및 리소스를 프로비저닝하고 관리하는 데 도움이 되는 오픈 소스 코드형 인프라(IaC) 도구입니다.

코드 리포지토리

이 패턴의 코드는 GitHub Terraform 리포지토리를 사용하여 AWS Control Tower 제어 배포 및 관리에서 사용할 수 있습니다.

모범 사례

에픽

작업설명필요한 기술

리포지토리를 복제합니다.

bash 쉘에서 다음 명령을 입력합니다. 이렇게 하면에서 Terraform 리포지토리를 사용하여 배포 및 관리 AWS Control Tower 제어가 복제됩니다 GitHub.

git clone https://github.com/aws-samples/aws-control-tower-controls-terraform.git
DevOps 엔지니어

Terraform 백엔드 구성 파일을 편집합니다.

  1. 복제된 리포지토리에서 백엔드.tf 파일을 엽니다.

  2. 파일을 편집하여 Terraform 백엔드 구성을 설정합니다. 이 파일에서 정의하는 구성은 환경에 따라 다릅니다. 자세한 내용은 백엔드 구성(Terraform 설명서)을 참조하십시오. 

  3. 백엔드.tf 파일을 저장하고 닫습니다.

DevOps 엔지니어, Terraform

Terraform 공급자 구성 파일을 편집합니다.

  1. 복제된 리포지토리에서 provider.tf 파일을 엽니다.

  2. 파일을 편집하여 Terraform 공급자 구성을 설정합니다. 자세한 내용은 구성 공급자(Terraform 설명서)를 참조하십시오. 를를 사용할 수 있는 AWS Control Tower API 리전 AWS 리전 으로 설정합니다.

  3. provider.tf 파일을 저장하고 닫습니다.

DevOps 엔지니어, Terraform

구성 파일을 편집합니다.

  1. 복제된 리포지토리에서 variables.tfvars 파일을 엽니다.

  2. AWS Control Tower 설명서에서 모든 글로벌 식별자를 엽니다.

  3. JSON형식이 지정된 목록에서 구현하려는 컨트롤을 찾은 다음 전역 식별자({CONTROL_CATALOG_OPAQUEID} 값이라고도 함)를 복사합니다. 예를 들어 AWS-GR_AUDIT__BUCKETENCRYPTION_ENABLED 컨트롤의 전역 식별자는 입니다k4izcjxhukijhajp6ks5mjxk.

  4. controls 섹션의 control_names 파라미터에 복사한 글로벌 식별자를 입력합니다.

  5. controls 섹션의 organizational_unit_ids 파라미터에서 제어(예: ou-1111-11111111)를 활성화하려는 조직 단위의 ID를 입력합니다. 큰따옴표로 ID를 입력하고 여러 개를 쉼표IDs로 구분합니다. OU를 검색하는 방법에 대한 자세한 내용은 OU 세부 정보 보기를 IDs참조하세요. https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_org_details.html#orgs_view_ou

  6. variables.tfvars 파일을 저장하고 닫습니다. 업데이트된 variables.tfvars 파일의 예는 이 패턴의 추가 정보 섹션을 참조하십시오.

DevOps 엔지니어, 일반 AWS, Terraform

관리 계정에서 IAM 역할을 수임합니다.

관리 계정에서 Terraform 구성 파일을 배포할 권한이 있는 IAM 역할을 수임합니다. 필요한 권한 및 샘플 정책에 대한 자세한 내용은 추가 정보 섹션의 IAM 역할에 대한 최소 권한 권한을 참조하세요. 에서 IAM 역할을 수임하는 방법에 대한 자세한 내용은에서 역할 사용을 AWS CLI참조하세요. IAM AWS CLI

DevOps 엔지니어, 일반 AWS

구성 파일을 배포합니다.

  1. 다음 명령을 입력하여 Terraform을 초기화합니다.

    $ terraform init -upgrade
  2. 다음 명령을 입력하여 현재 상태와 비교하여 변경 내용을 미리 확인합니다.

    $ terraform plan -var-file="variables.tfvars"
  3. Terraform 계획의 구성 변경 사항을 검토하고 조직에서 이러한 변경 사항을 구현할지 확인합니다.

  4. 다음 명령을 입력하여 리소스를 배포합니다.

    $ terraform apply -var-file="variables.tfvars"
DevOps 엔지니어, 일반 AWS, Terraform
작업설명필요한 기술

destroy 명령을 실행합니다.

다음 명령을 입력하여 이 패턴으로 배포된 리소스를 제거합니다.

$ terraform destroy -var-file="variables.tfvars"
DevOps 엔지니어, 일반 AWS, Terraform

문제 해결

문제Solution

Error: creating ControlTower Control ValidationException: Guardrail <control ID> is already enabled on organizational unit <OU ID> 오류

활성화하려는 제어는 대상 OU에서 이미 활성화되어 있습니다. 이 오류는 사용자가를 통해 AWS Management Console,를 통해 AWS Control Tower 또는를 통해 제어를 수동으로 활성화한 경우 발생할 수 있습니다 AWS Organizations. Terraform 구성 파일을 배포하려면 다음 옵션 중 하나를 사용할 수 있습니다.

옵션 1: Terraform 현재 상태 파일 업데이트

리소스를 Terraform 현재 상태 파일로 가져올 수 있습니다. apply명령을 다시 실행하면 Terraform은 이 리소스를 건너뛰게 됩니다. 리소스를 현재 Terraform 상태로 가져오려면 다음을 수행하십시오.

  1. AWS Control Tower 관리 계정에서 다음 명령을 입력하여의 Amazon 리소스 이름(ARNs) 목록을 검색합니다. OUs여기서 <root-ID>는 조직 루트입니다. 이 ID를 검색하는 방법에 대한 자세한 내용은 루트 세부 정보 보기를 참조하십시오.

    aws organizations list-organizational-units-for-parent --parent-id <root-ID>
  2. 이전 단계에서 반환된 각 OU에 대해 다음 명령을 입력합니다. 여기서 <OU-ARN>는 OUARN의 입니다.

    aws controltower list-enabled-controls --target-identifier <OU-ARN>
  3. 를 복사ARNs하고 필요한 모듈에서 Terraform 가져오기를 수행하여 Terraform 상태에 포함되도록 합니다. 자세한 지침은 가져오기(Terraform 설명서)를 참조하십시오.

  4. 에픽 섹션에서 구성 배포 단계를 반복하십시오.

옵션 2: 컨트롤 비활성화

비프로덕션 환경에서 작업하는 경우 콘솔에서 컨트롤을 비활성화할 수 있습니다. 에 섹션의 구성 배포의 단계를 반복하여 다시 활성화합니다. 일정 기간 동안 컨트롤이 비활성화되므로 프로덕션 환경에서는 이 방법을 사용하지 않는 것이 좋습니다. 프로덕션 환경에서이 옵션을 사용하려면 SCP에를 일시적으로 적용하는 등의 임시 제어를 구현할 수 있습니다 AWS Organizations.

관련 리소스

AWS 설명서

기타 리소스

추가 정보

variables.tfvars 파일

다음은 업데이트된 variables.tfvars 파일의 예입니다. 이 샘플은 AWS-GR_ENCRYPTED_VOLUMES 제어(글로벌 ID: 503uicglhjkokaajywfpt6ros) 및 AWS-GR_SUBNET_AUTO_ASSIGNPUBLIC_IP_DISABLED 제어(글로벌 ID: )를 활성화합니다50z1ot237wl8u1lv5ufau6qqo. 전역의 목록은 AWS Control Tower 설명서의 모든 전역 식별자를 IDs참조하세요.

controls = [ { control_names = [ "503uicglhjkokaajywfpt6ros", ... ], organizational_unit_ids = ["ou-1111-11111111", "ou-2222-22222222"...], }, { control_names = [ "50z1ot237wl8u1lv5ufau6qqo", ... ], organizational_unit_ids = ["ou-1111-11111111"...], }, ]

IAM 역할에 대한 최소 권한 권한

이 패턴을 사용하려면 관리 계정에서 IAM 역할을 수임해야 합니다. 가장 좋은 방법은 임시 권한이 있는 역할을 수임하고 최소 권한의 원칙에 따라 권한을 제한하는 것입니다. 다음 샘플 정책은 AWS Control Tower 제어를 활성화하거나 비활성화하는 데 필요한 최소 작업을 허용합니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "controltower:EnableControl", "controltower:DisableControl", "controltower:GetControlOperation", "controltower:ListEnabledControls", "organizations:AttachPolicy", "organizations:CreatePolicy", "organizations:DeletePolicy", "organizations:DescribeOrganization", "organizations:DetachPolicy", "organizations:ListAccounts", "organizations:ListAWSServiceAccessForOrganization", "organizations:ListChildren", "organizations:ListOrganizationalUnitsForParent", "organizations:ListParents", "organizations:ListPoliciesForTarget", "organizations:ListRoots", "organizations:UpdatePolicy" ], "Resource": "*" } ] }