AWS Config를 사용하여 지원되지 않는 리소스 유형에 대한 구성 규칙을 생성하려면 어떻게 해야 합니까?

5분 분량
0

AWS Config에서 지원하지 않는 리소스 유형에 대한 구성 규칙을 만들고 싶습니다. 어떻게 해야 하나요?

간략한 설명

AWS Config를 사용하면 구성 규칙을 생성하여 AWS 리소스가 지정된 구성을 준수하는지 확인할 수 있습니다. 기본적으로 AWS Config는 제한된 수의 AWS 리소스 유형을 지원합니다. 그러나 AWS Config에서 지원하지 않는 리소스 유형에 대한 사용자 지정 구성 규칙을 생성할 수도 있습니다.

사용자 지정 구성 규칙이 배포되면 리소스를 평가하기 위해 AWS Lambda 함수가 생성됩니다. 지원되지 않는 리소스 유형을 평가하고 규정 준수 결과를 사용자 정의 구성 규칙에 반환하는 Lambda 함수를 생성할 수 있습니다.

해결 방법

참고: 다음 단계와 코드 예제는 지원되지 않는 리소스인 Amazon Cognito를 평가하는 사용자 지정 구성 역할을 생성합니다.

사전 조건

Lambda가 필요한 API 호출을 수행할 수 있도록 Lambda 함수에 대한 AWS Identity and Access Management(IAM) 역할을 생성합니다.

1.    IAM 콘솔을 열고 탐색 창에서 [역할(Roles)]을 선택합니다.

2.    역할 생성을 선택합니다.

3.    사용 사례 선택의 경우 일반 사용 사례에서 Lambda를 선택합니다.

4.    [Next: Permissions]를 선택합니다.

5.    정책 생성을 선택합니다.

참고: 정책 생성 페이지가 새 탭에서 열립니다. 이 프로세스의 뒷부분에서 원래 탭으로 돌아갑니다.

6.    JSON 탭을 선택하고 다음 정책을 입력합니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "config:PutEvaluations",
        "cognito-idp:ListUserPools"
      ],
      "Resource": "*"
    }
  ]
}

7.    다음: 태그를 선택한 후 다음: 검토를 선택합니다.

8.    이름에 정책 이름을 입력합니다.

9.    정책 생성을 선택합니다.

10.    5단계의 역할 만들기 탭으로 돌아간 다음 정책 목록의 오른쪽에 있는 새로 고침 아이콘을 선택합니다.

11.    새 정책 이름을 찾아 선택한 후 다음: 태그를 선택합니다.

12.    다음: 검토를 선택합니다.

13.    역할 이름lambda-role을 입력합니다.

14.    역할 생성을 선택합니다.

사용자 지정 구성 규칙에 대한 Lambda 함수 생성

1.    Lambda 콘솔을 엽니다.

2.    함수 생성을 선택합니다.

3.    새로 작성을 선택합니다.
함수 이름에 이름을 입력합니다.
런타임에서 Python 3.8을 선택합니다.

4.    권한에서 기본 실행 역할 변경을 선택합니다.
실행 역할에서 기존 역할 사용을 선택합니다.
기존 역할의 경우 이 문서의 사전 조건 섹션에서 Lambda가 필요한 API 호출을 수행할 수 있도록 생성한 역할을 선택합니다.

5.    함수 생성을 선택합니다.

6.    코드 소스의 경우 Lambda 콘솔에서 lambda_function.py 파일을 열고 기본 코드를 다음과 같이 바꾼 다음 배포를 선택합니다.

참고: 다음 코드 예제는 MFA: OFF가 설정된 모든 Amazon Cognito UserPools를 찾아 결과를 NON_COMPLIANT로 표시합니다. 지원되지 않는 다른 서비스 및 객체에 대해 이 지침을 사용자 지정할 때 필요한 정보와 리소스는 PutEvaluations API 및 AWS::::Account 리소스 유형 값 섹션을 참조하세요.

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT-0

import json
import boto3

def lambda_handler(event,context):
  cognito = boto3.client('cognito-idp')
  userpools = cognito.list_user_pools(
    MaxResults=5
    )
  userpool_list = userpools['UserPools']
  userpool_ids = []
  
  for i in userpool_list:
    userpool_ids.append(i['Id'])
  
  evaluations = []
  orderingtime = json.loads(event['invokingEvent'])['notificationCreationTime']
  
  for j in userpool_ids:
     userpool_describe = cognito.describe_user_pool(
        UserPoolId = j
      )
     userpool_MFA = userpool_describe['UserPool']['MfaConfiguration']
     if userpool_MFA == 'OFF':
       evaluations.append(
          {
          'ComplianceResourceType': 'AWS::::Account',
          'ComplianceResourceId': j,
          'ComplianceType': 'NON_COMPLIANT',
          'Annotation': 'Test',
          'OrderingTimestamp': orderingtime
          }
        )
     else:
       evaluations.append(
          {
          'ComplianceResourceType': 'AWS::::Account',
          'ComplianceResourceId': j,
          'ComplianceType': 'COMPLIANT',
          'Annotation': 'Test',
          'OrderingTimestamp': orderingtime
          }
        )
  
  result_token = event['resultToken']
  config = boto3.client('config')
  response = config.put_evaluations(
              Evaluations = evaluations,
              ResultToken = result_token,
              TestMode = False
            )

위의 코드는 세 가지 주요 단계를 수행합니다.

  • 인벤토리를 생성하기 위한 모든 리소스를 나열합니다.
  • 지정된 구성과 비교하여 인벤토리의 각 리소스를 평가합니다.
  • AWS Config에 대한 PutEvaluations API 호출을 사용한 평가에 따라 규정 준수 상태를 반환합니다.

사용자 지정 주기적 구성 규칙 생성

이제 AWS Config에서 사용자 지정 주기적 구성 규칙을 생성해야 합니다. 그런 다음 사용자 지정 규칙을 이전 섹션에서 생성한 Lambda 함수와 연결합니다. 지침은 사용자 지정 규칙 생성을 참조하세요.

중요: 이후 단계를 위해 새 사용자 지정 구성 규칙의 ARN을 기록해 둡니다.

AWS Config 서비스에 Lambda 함수 호출 권한 부여

1.    Lambda 콘솔을 연 다음 탐색 창에서 함수를 선택합니다.

2.    Lambda 함수의 하이퍼링크된 함수 이름을 선택하여 함수 세부 정보를 엽니다.

3.    구성 탭에서 권한을 선택합니다.

4.    리소스 기반 정책에서 권한 추가를 선택합니다.
정책 문에서 AWS 서비스를 선택합니다.
서비스에서 기타를 선택합니다.
주체config.amazonaws.com을 입력합니다.
소스 ARN에 이전 섹션에서 만든 사용자 지정 구성 규칙의 ARN을 입력합니다. 참고: 사용자 지정 구성 규칙 ARN을 찾으려면 AWS Config 콘솔을 연 다음 탐색 창에서 규칙을 선택합니다. 하이퍼링크된 규칙 이름을 선택한 다음 구성 규칙 ARN을 복사합니다.
작업에 대해 lambda:InvokeFunction를 선택합니다.
명령문 ID에 고유 ID를 입력합니다.

5.    저장을 선택합니다.

PutEvaluations API 및 AWS::::Account 리소스 유형 값

이 문서의 단계와 예에서는 MFA: OFF가 설정된 모든 Amazon Cognito UserPools를 찾아 결과를 NON_COMPLIANT로 표시합니다. 그러나 지원되지 않는 리소스 유형을 사용하는 특정 요구 사항에 맞게 프로세스를 수정할 수 있습니다. aws-config-rules GitHub 페이지에서 AWS::::Account 리소스 유형을 사용하는 코드 예를 더 찾을 수 있습니다.

PutEvaluations API 호출에 다음 파라미터가 포함됩니다.

{
   "Evaluations": [ 
    { 
     "Annotation": "string",
     "ComplianceResourceId": "string",
     "ComplianceResourceType": "string",
     "ComplianceType": "string",
     "OrderingTimestamp": number
    }
   ],
   "ResultToken": "string",
   "TestMode": boolean
}

지원되지 않는 리소스 유형의 경우 ComplianceResourceType의 값으로 AWS::::Account를 입력해야 합니다. AWS::::Account 리소스 유형은 특정 리소스 대신 전체 계정에 대해 보고합니다.

예:

{
  'ComplianceResourceType': 'AWS::::Account',
  'ComplianceResourceId': 'Resource Id',
  'ComplianceType': 'COMPLIANT'|'NON_COMPLIANT',
  'Annotation': 'string',
  'OrderingTimestamp': number
}

지원되지 않는 리소스가 AWS::::Account 대신 ComplianceResourceType 값으로 입력되면 다음과 같은 오류가 발생합니다.

  • 콘솔: “사용할 수 있는 결과 없음”
  • Lambda CloudWatch logs: "오류: ClientError: PutEvaluations 작업을 호출할 때 오류 발생(InternalFailure)(최대 재시도 횟수 도달: 4)"
  • Cloudtrail(PutEvaluations API): "오류: ClientError: PutEvaluations 작업을 호출할 때 오류 발생(InternalFailure)(최대 재시도 횟수 도달: 4)”

AWS::::Account 리소스 유형 값을 사용할 때에는 다음 사항에 유의하세요.

1.    이 리소스 유형에 대한 구성 항목이 기록되지 않습니다.

2.    이 리소스 유형에 대해 AWS::Config::ResourceCompliance 하위의 규정 준수 구성 항목이 기록되지 않습니다.

3.    이 리소스 유형에 대해 리소스 타임라인을 사용할 수 없습니다.

4.    AWS 관리 콘솔에서는 이 리소스 유형에 대해 리소스 관리 버튼을 사용할 수 없습니다.


관련 정보

사용자 지정 구성 규칙을 위한 AWS Lambda 함수 생성

AWS 공식
AWS 공식업데이트됨 2년 전