CloudFormation으로 Config Rule 구축해보기

2022.01.13

소개

안녕하세요! 클래스메소드 금상원 입니다. 이번 블로그에서는 CloudFormation으로 Config Rule을 구축하는 방법에 대한 설명을 하려고 합니다.

목표

Config Rule를 사용하여 AWF의 로깅체크와 문제해결을 CloudFormation을 사용하여 구축해보자!

Config Rule 템플릿파일 작성(YAML)

ConfigRule: 
    Type: AWS::Config::ConfigRule
    Properties: 
      ConfigRuleName: Wafv2LoggingEnabled
      MaximumExecutionFrequency: One_Hour
      Scope: 
        ComplianceResourceTypes: 
          - "AWS::WAFv2::WebACL"
      Source: 
        Owner: AWS
        SourceIdentifier: "WAFV2_LOGGING_ENABLED"
  • ConfigRule 이라는 새로운 리소스를 작성합니다.
  • Type에는 AWS::Config::ConfigRule 을 입력합니다.
  • Properties
    • ConfigRuleName을 작성하여 ConfigRule이름을 정해줍니다.
    • MaximumExecutionFrequency을 작성하여 규칙에 대한 평가를 실행하는 최대 빈도를 설정합니다.
      허용값) One_Hour | Six_Hours | Three_Hours | Twelve_Hours | TwentyFour_Hours
    • Scope을 작성하여 규칙에 대한 평가를 트리거할 수 있는 리소스를 정의합니다.
    • Source을 작성하여 소유자와 어떤 규칙을 사용할 지 설정합니다.

Config Rule 문제해결 템플릿파일 작성(YAML)

ConfigRuleRemediation:
    Type: AWS::Config::RemediationConfiguration
    Properties: 
      Automatic: True
      ConfigRuleName: Wafv2LoggingEnabled
      Parameters:
        AutomationAssumeRole:
            StaticValue:
                Values: 
                  - !GetAtt [ ConfigSSMAutomationRole, Arn ]
        LogDestinationConfigs:
            StaticValue:
                Values: 
                  - !Ref S3BuketName
        WebAclArn:
            ResourceValue:
                Value: "RESOURCE_ID"
      MaximumAutomaticAttempts: 5
      ResourceType: "AWS::WAFv2::WebACL"
      RetryAttemptSeconds: 60
      TargetId: "EnableWAFV2Logging"
      TargetType: "SSM_DOCUMENT"
      TargetVersion: "1"
  • ConfigRuleRemediation 이라는 새로운 리소스를 작성합니다.
  • Type에는 AWS::Config::RemediationConfiguration 을 입력합니다.
  • Properties
    • Automatic을 사용하여 수정을 자동으로 트리거 되도록 설정 가능합니다.
    • ConfigRuleName을 작성하여 어떤 ConfigRule에 대한 것인지 작성합니다.
    • Parameters를 작성하여 필요한 값을 입력하거나 !GetAtt, !Ref와 같은 함수를 사용하여 불러옵니다.
    • MaximumAutomaticAttempts를 작성하여 자동 수정 시도의 최대 실패 횟수를 설정합니다. (기본으로 5로 설정 되어있습니다.)
    • ResourceType을 작성하여 리소스 유형을 작성합니다.
    • RetryAttemptSeconds을 작성하여 AWS Config가 자동 수정을 실행하는 최대 시간(초)를 설정합니다. (기본으로 60초로 설정되어있습니다.)
    • TargetId를 작성하여 어떤 SSM Automation 문서를 참조하는지를 설정합니다. (SSM Automation 문서의 이름)
    • TargetType대상의 유형입니다. 허용값) SSM_DOCUMENT
    • TargetVersion어떤 SSM Automation문서의 버전을 사용할지 설정합니다.

전체 코드

AWSTemplateFormatVersion: "2010-09-09"
Resources:
  ConfigSSMAutomationRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: "WafV2LoggingFullAccess"
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: ssm.amazonaws.com
            Action: 
              - "sts:AssumeRole"  
      Path: "/"
      ManagedPolicyArns:
        - "arn:aws:iam::aws:policy/AmazonS3FullAccess"
        - "arn:aws:iam::aws:policy/AmazonSSMFullAccess"
        - "arn:aws:iam::aws:policy/AWSWAFFullAccess"

  ConfigRule: 
    Type: AWS::Config::ConfigRule
    Properties: 
      ConfigRuleName: Wafv2LoggingEnabled
      MaximumExecutionFrequency: One_Hour
      Scope: 
        ComplianceResourceTypes: 
          - "AWS::WAFv2::WebACL"
      Source: 
        Owner: AWS
        SourceIdentifier: "WAFV2_LOGGING_ENABLED"

  ConfigRuleRemediation:
    Type: AWS::Config::RemediationConfiguration
    Properties: 
      Automatic: True
      ConfigRuleName: Wafv2LoggingEnabled
      Parameters:
        AutomationAssumeRole:
            StaticValue:
                Values: 
                  - !GetAtt [ ConfigSSMAutomationRole, Arn ]
        LogDestinationConfigs:
            StaticValue:
                Values: 
                  - !Ref S3BuketName
        WebAclArn:
            ResourceValue:
                Value: "RESOURCE_ID"
      MaximumAutomaticAttempts: 5
      ResourceType: "AWS::WAFv2::WebACL"
      RetryAttemptSeconds: 60
      TargetId: "EnableWAFV2Logging"
      TargetType: "SSM_DOCUMENT"
      TargetVersion: "1"

마무리

이번 블로그에서는 CloudFormation으로 Config Rule을 구축하고, WAF의 로깅 활성화를 체크하고 자동으로 로깅을 활성화 시키는 작업을 해보았습니다. 평소에 Config Rule을 CloudFormation으로 작성하고 싶으신분들에게 도움이 되었으면 합니다.

참고 자료

AWS::Config::ConfigRule

AWS::Config::RemediationConfiguration