AWS CloudFormation Guard 정책을 사용하여 AWS Config 사용자 지정 규칙 생성 - AWS 권장 가이드

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

AWS CloudFormation Guard 정책을 사용하여 AWS Config 사용자 지정 규칙 생성

작성자: 앤드류 록 (AWS), 카일라쉬 하빌다르 (AWS), 니콜 브라운 (AWS), 타냐 하웰 (AWS)

코드 aws-config-custom-rule리포지토리: -클라우드포메이션-가드

환경: PoC 또는 파일럿

기술: 보안, 자격 증명, 규정 준수, 관리 및 거버넌스

AWS 서비스: AWS CloudFormation, AWS Config

요약

AWS Config규칙은 AWS 리소스와 대상 구성 상태를 평가하는 데 도움이 됩니다. 규칙에는 관리형 AWS Config 규칙과 사용자 지정이라는 두 가지 유형이 있습니다. AWS Lambda 함수를 사용하거나 AWS CloudFormation Guard(GitHub) policy-as-code 언어를 사용하여 사용자 지정 규칙을 만들 수 있습니다.

Guard로 생성한 규칙은 관리형 규칙보다 더 세밀한 제어를 제공하며, 일반적으로 완전 사용자 지정 Lambda 규칙보다 구성하기가 더 쉽습니다. 이 접근 방식을 통해 엔지니어와 아키텍트는 Lambda를 통해 사용자 지정 규칙을 배포하는 데 필요한 Python, NodeJS 또는 Java를 몰라도 규칙을 구축할 수 있습니다.

이 패턴은 Guard를 통해 사용자 지정 규칙을 채택하는 데 도움이 되는 실행 가능한 템플릿, 코드 샘플 및 배포 접근 방식을 제공합니다. 관리자는 이 패턴을 사용하여 구성 항목 속성이 있는 사용자 지정 규정 준수 규칙을 작성할 수 있습니다. AWS Config 예를 들어 개발자는 AWS Config 구성 항목에 대한 가드 정책을 사용하여 배포된 AWS 리소스와AWS 비리소스의 상태를 지속적으로 모니터링하고, 규칙 위반을 탐지하고, 자동으로 문제 해결을 시작할 수 있습니다.

목표:

이 패턴을 읽고 나면 다음을 할 수 있을 것입니다.

사전 조건 및 제한 사항

사전 조건 

  • 액티브 AWS 계정

  • AWS Config, 귀하의 계정에 설정 AWS 계정

제한 사항

  • Guard 사용자 지정 규칙은 대상 구성 항목 JSON 레코드의 키-값 쌍만 쿼리할 수 있습니다.

아키텍처

Guard 구문을 AWS Config 규칙에 사용자 지정 정책으로 적용합니다. AWS Config 지정된 각 리소스의 계층적 JSON을 캡처합니다. AWS Config 구성 항목의 JSON에는 키-값 쌍이 포함되어 있습니다. 이러한 속성은 Guard 구문에서 해당 값에 할당되는 변수로 사용됩니다. 

다음은 Guard 구문에 대한 설명입니다. 구성 항목 JSON의 변수가 사용되며 앞에 문자가 추가됩니다. %

# declare variable let <variable name> = <'value'> # create rule and assign condition and policy rule <rule name> when <CI json key> == <"CI json value"> { <top level CI json key>.<next level CI json key> == %<variable name> }

시나리오 1: 아마존 EBS 볼륨

시나리오 1은 Guard 구문을 사용하여 암호화된 볼륨의 규정 준수를 검증하는 AWS Config 사용자 지정 규칙을 배포합니다. 이 규칙은 드라이브가 사용 중인지 확인하고 드라이브 유형이 gp3인지 확인합니다.

다음은 시나리오 1의 AWS Config 구성 항목 예제입니다. 이 구성 항목에는 가드 정책에서 변수로 사용되는 세 개의 키-값 쌍이 있습니다:volumestatus,volumeencryptionstatus,. volumetype 또한 resourceType 키는 Guard 정책에서 필터로 사용됩니다.

{ "version": "1.3", "accountId": "111111111111", "configurationItemCaptureTime": "2023-01-15T19:04:45.402Z", "configurationItemStatus": "ResourceDiscovered", "configurationStateId": "4444444444444", "configurationItemMD5Hash": "", "arn": "arn:aws:ec2:us-west-2:111111111111:volume/vol-222222222222", "resourceType": "AWS::EC2::Volume", "resourceId": "vol-222222222222", "awsRegion": "us-west-2", "availabilityZone": "us-west-2b", "resourceCreationTime": "2023-01-15T19:03:22.247Z", "tags": {}, "relatedEvents": [], "relationships": [ { "resourceType": "AWS::EC2::Instance", "resourceId": "i-33333333333333333", "relationshipName": "Is attached to Instance" } ], "configuration": { "attachments": [ { "attachTime": "2023-01-15T19:03:22.000Z", "device": "/dev/xvda", "instanceId": "i-33333333333333333", "state": "attached", "volumeId": "vol-222222222222", "deleteOnTermination": true, "associatedResource": null, "instanceOwningService": null } ], "availabilityZone": "us-west-2b", "createTime": "2023-01-15T19:03:22.247Z", "encrypted": false, "kmsKeyId": null, "outpostArn": null, "size": 8, "snapshotId": "snap-55555555555555555", "state": "in-use", "volumeId": "vol-222222222222", "iops": 100, "tags": [], "volumeType": "gp2", "fastRestored": null, "multiAttachEnabled": false, "throughput": null, "sseType": null }, "supplementaryConfiguration": {} }

다음은 Guard 구문을 사용하여 시나리오 1의 변수와 규칙을 정의하는 예제입니다. 이 예에서 다음과 같이 합니다.

  • 처음 세 줄은 let 명령을 사용하여 변수를 정의합니다.   구성 항목의 속성에서 파생된 이름과 값이 할당됩니다.

  • compliancecheck규칙 블록은 일치하는 resourceType 키-값 쌍을 찾는 when 조건부 종속성을 추가합니다. AWS::EC2::Volume 일치하는 항목이 발견되면 규칙은 나머지 JSON 속성을 살펴보고 다음 세 가지 조건, 및 에서 일치하는 항목을 찾습니다. state encrypted volumeType

let volumestatus = 'available' let volumetype = 'gp3' let volumeencryptionstatus = true rule compliancecheck when resourceType == "AWS::EC2::Volume" { configuration.state == %volumestatus configuration.encrypted == %volumeencryptionstatus configuration.volumeType == %volumetype }

이 사용자 지정 규칙을 구현하는 전체 Guard 사용자 지정 정책은 코드 awsconfig-guard-cft저장소의.yaml 또는 awsconfig-guard-tf-ec2vol.json을 참조하십시오. GitHub 이 사용자 지정 정책을 Guard에 배포하는 HashiCorp Terraform 코드의 경우 코드 저장소의.json을 참조하십시오. awsconfig-guard-tf-example

시나리오 2: 규정 준수 GuardDuty

시나리오 2는 Guard 구문을 사용하여 Amazon GuardDuty 규정 준수를 검증하는 AWS Config 사용자 지정 규칙을 배포합니다. 이 규칙은 GuardDuty 레코더에 Amazon S3 보호 및 Amazon EKS 보호가 활성화되어 있는지 확인합니다. 또한 GuardDuty 조사 결과가 15분마다 게시되는지 확인합니다. 이 시나리오는 조직 전체 AWS 계정 및 조직 (내부 AWS Organizations) AWS 리전 에 배포할 수 있습니다.

다음은 시나리오 2의 AWS Config 구성 항목 예제입니다. 이 구성 항목에는 가드 정책에서 변수로 사용되는 세 개의 키-값 쌍이 있습니다:FindingPublishingFrequency,S3Logs,. Kubernetes 또한 resourceType 키는 정책에서 필터로 사용됩니다.

{ "version": "1.3", "accountId": "111111111111", "configurationItemCaptureTime": "2023-11-27T13:34:28.888Z", "configurationItemStatus": "OK", "configurationStateId": "7777777777777", "configurationItemMD5Hash": "", "arn": "arn:aws:guardduty:us-west-2:111111111111:detector/66666666666666666666666666666666", "resourceType": "AWS::GuardDuty::Detector", "resourceId": "66666666666666666666666666666666", "resourceName": "66666666666666666666666666666666", "awsRegion": "us-west-2", "availabilityZone": "Regional", "resourceCreationTime": "2020-02-17T02:48:04.511Z", "tags": {}, "relatedEvents": [], "relationships": [], "configuration": { "Enable": true, "FindingPublishingFrequency": "FIFTEEN_MINUTES", "DataSources": { "S3Logs": { "Enable": true }, "Kubernetes": { "AuditLogs": { "Enable": true } } }, "Id": "66666666666666666666666666666666", "Tags": [] }, "supplementaryConfiguration": { "CreatedAt": "2020-02-17T02:48:04.511Z" } }

다음은 시나리오 2에서 Guard 구문을 사용하여 변수와 규칙을 정의하는 예제입니다. 이 예에서 다음과 같이 합니다.

  • 처음 세 줄은 let 명령을 사용하여 변수를 정의합니다.   구성 항목의 속성에서 파생된 이름과 값이 할당됩니다.

  • compliancecheck규칙 블록은 일치하는 resourceType 키-값 쌍을 찾는 when 조건부 종속성을 추가합니다. AWS::GuardDuty::Detector 일치하는 항목이 발견되면 규칙은 나머지 JSON 속성을 살펴보고 다음 세 가지 조건, 및 에서 일치하는 항목을 찾습니다. S3Logs.Enable Kubernetes.AuditLogs.Enable FindingPublishingFrequency

let s3protection = true let kubernetesprotection = true let publishfrequency = 'FIFTEEN_MINUTES' rule compliancecheck when resourceType == "AWS::GuardDuty::Detector" { configuration.DataSources.S3Logs.Enable == %s3protection configuration.DataSources.Kubernetes.AuditLogs.Enable == %kubernetesprotection configuration.FindingPublishingFrequency == %publishfrequency }

이 사용자 지정 규칙을 구현하는 전체 Guard 사용자 지정 정책은 코드 awsconfig-guard-cft-gd저장소의.yaml을 참조하십시오. GitHub 이 사용자 지정 정책을 Guard에 배포하는 HashiCorp Terraform 코드의 경우 코드 저장소의.json을 참조하십시오awsconfig-guard-tf-gd.

도구

AWS 서비스

  • AWS CloudFormation AWS 리소스를 설정하고, 빠르고 일관되게 프로비저닝하고, 전체 및 지역의 라이프사이클 전반에 걸쳐 리소스를 관리할 수 있도록 도와줍니다. AWS 계정

  • AWS Config내 리소스와 해당 리소스가 어떻게 구성되어 있는지를 자세히 보여줍니다. AWS 계정 리소스가 서로 관련되는 방식과 리소스의 구성이 시간이 지남에 따라 변경된 방식을 식별하는 데 도움이 됩니다.

기타 도구

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

코드 리포지토리

이 패턴의 코드는 with 저장소에서 사용할 수 있습니다. GitHub AWS ConfigAWS CloudFormation Guard 이 코드 리포지토리에는 이 패턴에 설명된 두 시나리오의 샘플이 모두 들어 있습니다.

에픽

작업설명필요한 기술

(선택 사항) 규칙의 키-값 쌍을 선택합니다.

사용자 지정 가드 정책을 정의하는 경우 이 단계를 완료하세요. 시나리오 1 또는 2의 샘플 정책 중 하나를 사용하는 경우 이 단계를 건너뛰십시오.

  1. 에 AWS Management Console 로그인하고 AWS Config 콘솔을 엽니다.

  2. 왼쪽 탐색창에서 리소스를 선택합니다.

  3. 리소스 인벤토리에서 AWS Config 사용자 지정 규칙을 만들려는 리소스 유형을 선택합니다.

  4. 세부 정보 보기를 선택합니다.

  5. 구성 항목 보기 (JSON) 를 선택합니다. 이 섹션은 구성 항목을 JSON 형식으로 표시하도록 확장됩니다.

  6. 사용자 지정 규칙을 만들 때 사용할 키-값 쌍을 식별하십시오. AWS Config

AWS 관리자, 보안 엔지니어

사용자 지정 규칙 생성.

이전에 식별한 키-값 쌍을 사용하거나 제공된 샘플 가드 정책 중 하나를 사용하여 사용자 지정 정책 규칙 생성의 지침에 따라 AWS Config 사용자 지정 규칙을 생성합니다.

AWS 관리자, 보안 엔지니어

사용자 지정 규칙을 확인합니다.

다음 중 하나를 수행하여 사용자 지정 Guard 규칙을 검증하십시오.

AWS 관리자, 보안 엔지니어

문제 해결

문제Solution

외부에서 Guard 정책을 테스트해 보십시오. AWS Config

단위 테스트는 로컬 장치 또는 IDE와 같은 통합 개발 환경 (IDE) 에서 수행할 수 있습니다. AWS Cloud9 유닛 테스트를 수행하려면 다음과 같이 하세요.

  1. AWS CloudFormation Guard CLI와 해당 종속성을 설치합니다.

  2. JSON 형식의 CI 샘플을 워크스테이션에.json 파일로 저장합니다.

  3. GuardDuty 정책을 워크스테이션에.guard 파일로 저장합니다.

  4. Guard CLI에서 다음 명령을 입력하여 Guard 정책을 사용하여 샘플 JSON 파일을 검증합니다.

    cfn-guard validate \ -r guard-s3.guard \ -d s3bucket-prod-pass.json

사용자 지정 규칙 디버깅 AWS Config

Guard 정책에서 EnableDebugLogDelivery 값을 로 true 변경합니다. 기본 값은 false입니다. 로그 메시지는 Amazon에 저장됩니다 CloudWatch.

관련 리소스

AWS 설명서

AWS 블로그 게시물 및 워크샵

기타 리소스