【運用自動化】AWS Config 適合パック (Conformance Packs) を使って AWS 組織内の VPC Flow Logs 無効化設定を検知・自動修復してみた

【運用自動化】AWS Config 適合パック (Conformance Packs) を使って AWS 組織内の VPC Flow Logs 無効化設定を検知・自動修復してみた

2025.12.11

📌 本記事では、AWS Config 適合パック (Conformance Packs) を活用して AWS Organizations 全アカウントの VPC Flow Logs が無効化されていることを検知し、S3 への集約設定を自動修復する手順を解説いたします。


はじめに

こんにちは。フニです。
組織のセキュリティ要件上、AWS 組織内のアカウントで VPC Flow Logs が無効化されている場合、それを検知して自動的に有効化する仕組みが必要になるケースもあるのではないでしょうか。
今回は、AWS Config 適合パックを活用することで実装できそうでしたので試してみました。

AWS Config 適合パックとは?

複数の AWS Config ルールと修復アクションを1つのパッケージにまとめて管理できる機能です。
詳細は以下のブログをご参照ください。

https://dev.classmethod.jp/articles/aws-config-conformance-packs-understand/

前提

※ 本記事のコードはあくまでもサンプルです。必要に応じて変更してください。

  • AWS Organizations 環境構築済み
  • 組織の全アカウントにおける展開先リージョンで AWS Config が有効化済み

手順

Phase 1: VPC Flow Logs 用 S3 バケット作成する

  1. ログ集約アカウントにログイン後、S3 コンソール画面へ移動します。

CleanShot 2025-12-10 at 18.37.32@2x.png

  1. リージョンを確認後、「バケットを作成」を押下します。

CleanShot 2025-12-10 at 18.40.13@2x.png

  1. 今回は S3 バケット名のみを入力し、デフォルト設定で作成します。
    (必要に応じてバケット設定を変更してください。)

CleanShot 2025-12-10 at 18.42.03@2x.png

  1. 作成したバケットの「アクセス許可」タブから、バケットポリシーの編集を押下します。

CleanShot 2025-12-10 at 18.44.37@2x.png

  1. 以下のポリシーを参考に、<s3-bucket-name> の箇所を編集して適用します。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::<s3-bucket-name>/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::<s3-bucket-name>"
        }
    ]
}

Phase 2: CloudFormation StackSets で IAM ロールをデプロイする

AWS CloudFormation StackSets の有効化及び委任管理者の登録を実施します。
組織の Payer アカウントでの作業が必要です。詳細は以下を参考にしてください。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/stacksets-orgs-activate-trusted-access.html
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/stacksets-orgs-delegated-admin.html?icmpid=docs_cfn_console

  1. AWS コンソールにログイン後、CloudFormation コンソール画面へ移動します。

CleanShot 2025-12-11 at 11.31.15@2x.png

  1. 左側のタブから「StackSets」を押下し、スタックセットを作成します。

CleanShot 2025-12-11 at 11.33.57@2x.png

  1. 以下のサンプルコードをローカル上に保存しておきます。
    (ファイル名:iam-role-stacksets.yaml)
AWSTemplateFormatVersion: '2010-09-09'
Description: |
  IAM Role for SSM Automation to enable VPC Flow Logs across organization accounts.
  This template is deployed via CloudFormation StackSets with service-managed permissions.

  Features:
  - Least privilege IAM permissions for VPC Flow Logs management
  - Cross-account S3 write access for centralized logging
  - Secure trust relationship with Systems Manager Automation

Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      - Label:
          default: "Logging Configuration"
        Parameters:
          - LogArchiveBucket
          - LogArchiveAccountId
      - Label:
          default: "Role Configuration"
        Parameters:
          - RoleName
    ParameterLabels:
      LogArchiveBucket:
        default: "Centralized Log Archive S3 Bucket Name"
      LogArchiveAccountId:
        default: "Log Archive Account ID"
      RoleName:
        default: "IAM Role Name"

Parameters:
  LogArchiveBucket:
    Type: String
    Description: Name of the centralized S3 bucket for VPC Flow Logs (in Log Archive Account)
    AllowedPattern: '^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$'
    ConstraintDescription: Must be a valid S3 bucket name (lowercase, hyphens allowed)

  LogArchiveAccountId:
    Type: String
    Description: AWS Account ID of the Log Archive Account
    AllowedPattern: '^\d{12}$'
    ConstraintDescription: Must be a 12-digit AWS Account ID

  RoleName:
    Type: String
    Default: VPCFlowLogsAutomationRole
    Description: Name of the IAM Role for SSM Automation
    AllowedPattern: '^[\w+=,.@-]{1,64}$'
    ConstraintDescription: Must be a valid IAM role name

Resources:
  # SSM Automation Execution Role
  VPCFlowLogsAutomationRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Ref RoleName
      Description: |
        IAM Role for Systems Manager Automation to enable and manage VPC Flow Logs.
        Provides least privilege permissions for VPC Flow Logs creation and S3 access.
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          # Allow SSM Automation service to assume this role
          - Effect: Allow
            Principal:
              Service:
                - ssm.amazonaws.com
            Action:
              - 'sts:AssumeRole'
            Condition:
              StringEquals:
                'aws:SourceAccount': !Ref 'AWS::AccountId'
              ArnLike:
                'aws:SourceArn': !Sub 'arn:${AWS::Partition}:ssm:*:${AWS::AccountId}:automation-execution/*'

          # Allow AWS Config service to assume this role for remediation
          - Effect: Allow
            Principal:
              Service:
                - config.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      ManagedPolicyArns: []
      Policies:
        - PolicyName: VPCFlowLogsManagement
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              # CloudWatch Logs permissions for Flow Logs delivery
              - Sid: CloudWatchLogsPermissions
                Effect: Allow
                Action:
                  - 'logs:CreateLogDelivery'
                  - 'logs:DeleteLogDelivery'
                  - 'logs:CreateLogGroup'
                Resource: '*'

              # EC2 VPC Flow Logs Creation
              - Sid: VPCFlowLogsCreation
                Effect: Allow
                Action:
                  - 'ec2:CreateFlowLogs'
                Resource: '*' 

              # SSM Automation passrole permission
              - Sid: PassRoleForAutomation
                Effect: Allow
                Action:
                  - 'iam:PassRole'
                Resource: !Sub 'arn:${AWS::Partition}:iam::${AWS::AccountId}:role/${RoleName}'
                Condition:
                  StringEquals:
                    'iam:PassedToService':
                      - 'ec2.amazonaws.com'
                      - 'logs.amazonaws.com'
                      - 'vpc-flow-logs.amazonaws.com'
      Tags:
        - Key: Name
          Value: !Ref RoleName
        - Key: ManagedBy
          Value: CloudFormation-StackSets
        - Key: Purpose
          Value: VPCFlowLogsAutomation

Outputs:
  AutomationRoleArn:
    Description: ARN of the SSM Automation execution role
    Value: !GetAtt VPCFlowLogsAutomationRole.Arn
    Export:
      Name: !Sub '${AWS::StackName}-AutomationRoleArn'

  AutomationRoleName:
    Description: Name of the SSM Automation execution role
    Value: !Ref VPCFlowLogsAutomationRole
    Export:
      Name: !Sub '${AWS::StackName}-AutomationRoleName'

  LogArchiveBucketName:
    Description: Centralized S3 bucket name for VPC Flow Logs
    Value: !Ref LogArchiveBucket
    Export:
      Name: !Sub '${AWS::StackName}-LogArchiveBucket'
  1. 保存した yaml ファイルをアップロードし、次へを押下します。

CleanShot 2025-12-11 at 11.36.28@2x.png

  1. スタックセット名・パラメータを入力し、次へを押下します。
  • Centralized Log Archive S3 Bucket Name:Phase 1 で作成した S3 バケット名
  • Log Archive Account ID:Phase 1 で利用した AWS アカウント ID
  • IAM Role Name:VPCFlowLogsAutomationRole

CleanShot 2025-12-11 at 11.40.44@2x.png

  1. チェックボックスの内容に同意し、次へを押下します。

CleanShot 2025-12-11 at 11.46.59@2x.png

  1. バージニア北部リージョンを指定し、次へを押下します。
    (必要に応じて同時実行数などを変更してください。)

CleanShot 2025-12-11 at 11.50.42@2x.png

  1. 確認画面で「送信」を押下し、オペレーションが完了になるまで待機します。

CleanShot 2025-12-11 at 12.00.50@2x.png

Phase 3: AWS Config 適合パックをデプロイする

AWS Config の有効化及び委任管理者の登録を実施します。
組織の Payer アカウントでの作業が必要です。詳細は以下を参考にしてください。

https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/aggregated-register-delegated-administrator.html

  1. AWS コンソールにログイン後、CloudShell 画面を開きます。
    (適用対象リージョンで間違いないかご確認ください。)

CleanShot 2025-12-11 at 13.23.11@2x.png

  1. 以下のサンプルコードを修正後、ローカル上に保存しておきます。
    (ファイル名:vpc-flowlogs-conformance-pack.yaml)
  • <AWSアカウントID>:AWS Config 委任管理者の AWS アカウント ID
  • <S3バケット名>:Phase 1 で作成した S3 バケット名
Resources:
  VpcFlowLogsEnabledRule:
    Type: AWS::Config::ConfigRule
    Properties:
      ConfigRuleName: vpc-flow-logs-enabled
      Description: |
        Checks whether Amazon VPC Flow Logs are found and enabled for all VPCs.
        The rule is NON_COMPLIANT if flow logs are not enabled for at least one VPC.

      # Scope: Apply to all VPCs
      Scope:
        ComplianceResourceTypes:
          - AWS::EC2::VPC

      # Input Parameters for the Rule
      InputParameters:
        trafficType: ALL

      # Rule Source: AWS Managed Rule
      Source:
        Owner: AWS
        SourceIdentifier: VPC_FLOW_LOGS_ENABLED

      # Evaluation Frequency
      MaximumExecutionFrequency: TwentyFour_Hours

      # Note: Remediation configuration is separate (see below)

  #############################################################################
  # Automatic Remediation Configuration
  #############################################################################

  VpcFlowLogsRemediation:
    Type: AWS::Config::RemediationConfiguration
    Properties:
      # Link to the Config Rule
      ConfigRuleName: vpc-flow-logs-enabled

      # Target SSM Automation Document - AWS Managed (no runtime management required)
      TargetType: SSM_DOCUMENT
      TargetId: AWS-EnableVPCFlowLogs
      TargetVersion: "1"

      # Resource Type
      ResourceType: AWS::EC2::VPC

      # Automatic Remediation Settings
      Automatic: true
      MaximumAutomaticAttempts: 5
      RetryAttemptSeconds: 60

      # IAM Role for SSM Automation Execution
      ExecutionControls:
        SsmControls:
          ConcurrentExecutionRatePercentage: 10
          ErrorPercentage: 10

      # Parameters passed to SSM Automation
      Parameters:
        # Automation Execution Role
        AutomationAssumeRole:
          StaticValue:
            Values:
              - arn:aws:iam::<AWSアカウントID>:role/VPCFlowLogsAutomationRole

        # VPC IDs from Config Rule evaluation
        VPCIds:
          ResourceValue:
            Value: RESOURCE_ID

        # S3 destination type
        LogDestinationType:
          StaticValue:
            Values:
              - s3

        # S3 bucket ARN for centralized logging
        LogDestinationArn:
          StaticValue:
            Values:
              - arn:aws:s3:::<S3バケット名>

        # Traffic type to log
        TrafficType:
          StaticValue:
            Values:
              - ALL
  1. 保存しておいたファイルを CloudShell 上にアップロードします。

CleanShot 2025-12-11 at 13.30.11@2x.png

  1. 以下のコマンドで Config 適合パックを有効化します。
aws configservice put-organization-conformance-pack \
    --organization-conformance-pack-name="EnableVPCFlowLogsConformancePack" \
    --template-body="file://vpc-flowlogs-conformance-pack.yaml"

CleanShot 2025-12-11 at 13.34.01@2x.png

  1. デプロイした適合パックの状態を確認し、CREATE_SUCCESSFUL になるまで待機します。
デプロイした適合パックを確認するコマンド
$ aws configservice describe-organization-conformance-packs --organization-conformance-pack-name=EnableVPCFlowLogsConformancePack
{
    "OrganizationConformancePacks": [
        {
            "OrganizationConformancePackName": "EnableVPCFlowLogsConformancePack",
            "OrganizationConformancePackArn": "arn:aws:config:ap-northeast-1:<AWSアカウントID>:organization-conformance-pack/EnableVPCFlowLogsConformancePack-g5hniluq",
            "ConformancePackInputParameters": [],
            "ExcludedAccounts": [],
            "LastUpdateTime": "2025-12-11T04:33:20.268000+00:00"
        }
    ]
}
デプロイ状況について確認するコマンド
$ aws configservice describe-organization-conformance-pack-statuses --organization-conformance-pack-name=EnableVPCFlowLogsConformancePack
{
    "OrganizationConformancePackStatuses": [
        {
            "OrganizationConformancePackName": "EnableVPCFlowLogsConformancePack",
            "Status": "CREATE_IN_PROGRESS",
            "LastUpdateTime": "2025-12-11T04:37:31.152000+00:00"
        }
    ]
}
デプロイ状況をアカウント個別に確認するコマンド
$ aws configservice get-organization-conformance-pack-detailed-status --organization-conformance-pack-name=EnableVPCFlowLogsConformancePack
{
    "OrganizationConformancePackDetailedStatuses": [
        {
            "AccountId": "111111111111",
            "ConformancePackName": "OrgConformsPack-EnableVPCFlowLogsConformancePack-g5hniluq",
            "Status": "CREATE_SUCCESSFUL",
            "LastUpdateTime": "2025-12-11T04:35:24.445000+00:00"
        },
        {
            "AccountId": "222222222222",
            "ConformancePackName": "OrgConformsPack-EnableVPCFlowLogsConformancePack-g5hniluq",
            "Status": "CREATE_SUCCESSFUL",
            "LastUpdateTime": "2025-12-11T04:35:24.897000+00:00"
        }
    ]
}

メンバーアカウントで動作確認

📌 補足
Config 適合パックのデプロイの前に、予め作成しておいた VPC で確認しました。


  1. メンバーアカウントの方で、適合パックが作成されていることを確認しました。

CleanShot 2025-12-11 at 14.11.54@2x.png

  1. VPC Flow Logs が無効になっていたため、非準拠として検出されていました。

CleanShot 2025-12-11 at 14.13.48@2x.png

  1. CloudTrail ログ上では、以下3つの活動が順番に実行されていました。
  • PutEvaluations:AWS Config に評価結果を連携する
  • StartAutomationExecution:Automation の Runbook を実行する
  • CreateFlowLogs:VPC Flow Logs を作成する

CleanShot 2025-12-11 at 14.16.37@2x.png

  1. VPC には、S3 バケットを送信先とした VPC Flow Logs が有効化されていました。

CleanShot 2025-12-11 at 14.20.04@2x.png

  1. VPC 上に EC2 インスタンスを立ち上げ、トラフィックを作ってみます。
sh-5.2$ curl https://classmethod.jp/
  1. 保存用 S3 バケットを確認したら、無事に以下のパスに保存されていました。
<S3バケット名>/AWSLogs/<AWSアカウントID>/vpcflowlogs/<リージョン>/YYYY/MM/DD/ファイル

CleanShot 2025-12-11 at 14.34.56@2x.png

環境のクリーンアップ (削除手順)

適合パックを削除したい場合は CloudShell で以下のコマンドを実行します。

$ aws configservice delete-organization-conformance-pack --organization-conformance-pack-name "EnableVPCFlowLogsConformancePack"

あとは以下2点を削除すればクリーンアップは完了です。

  • Phase 2 で作成した CloudFormation StackSets
  • Phase 1 で作成した S3 バケット

注意点

  • デプロイ対象は組織内の全アカウントが対象となります。(OU単位では不可)
  • Config 適合パックは、必要なリージョン毎にデプロイが必要となります。

おわりに

AWS 組織内の VPC Flow Logs が無効化されている場合、AWS Config 適合パック (Conformance Packs) を活用した S3 への集約設定を自動修復する仕組みを作ってみました。

今回は VPC Flow Logs でしたが、他にも組織のセキュリティ要件に反する設定を自動修復する仕組みが必要な場合に検討できる嬉しい機能ですね!

参考

https://aws.amazon.com/jp/blogs/mt/how-to-enable-vpc-flow-logs-automatically-using-aws-config-rules/
https://aws.amazon.com/jp/blogs/mt/deploying-conformance-packs-across-an-organization-with-automatic-remediation/
https://dev.classmethod.jp/articles/config-rules-and-repair-actions-to-accounts-in-organization-using-conformance-packs/

この記事をシェアする

FacebookHatena blogX

関連記事