ENGINEER BLOG ENGINEER BLOG
  • 公開日
  • 最終更新日

AWS Configを使ったVPC Flow Logsの自動設定

この記事を共有する

目次

皆さんこんにちは!
サービスGの山内です!
今回は、AWS Configを使ったVPC Flow Logsの自動修復について紹介したいと思います。

作成するAWS Configルールについて

VPC Flow Logsが設定されていないVPCを検出し、「修復」をクリックすることで自動的にVPC Flow Logsの設定を行います。

01.png

実際にVPC Flow Logsを設定しているのは AWS Systems Manager ドキュメントです。
AWS Configルールの修復アクションにて、AWS Systems Manager ドキュメントを指定しています。 02.png

AWS Configルールの構成とスタックの作成

AWS CloudFormationにて、以下のYAMLテンプレートのスタックを作成し、AWS Config ルールを作成します。
スタックを作成することで、以下のリソースを作成しています。

  • AWS Configルール
  • AWS Systems Manager ドキュメント実行ロール
  • AWS Systems Manager ドキュメント
  • AWS Configルールの自動修復設定

また、VPC Flow Logs保管用バケットは作成済みとします。

ここを押すと展開します

AWSTemplateFormatVersion: "2010-09-09"
Description: Setup AWS Config with auto-remediation to enable VPC Flow Logs
#---------------------
# Parameters
#---------------------
Parameters:
  VPCFlowlogBucketArn:
    Type: String
Resources:
  #------------------------
  # Create RunBook Role
  #------------------------
  AutomationAssumeRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: Check-VPC-Flowlog-role
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action: sts:AssumeRole
            Principal:
              Service:
                - ssm.amazonaws.com
      Policies:
        - PolicyName: CreateVPCFlowLogs
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - ec2:CreateFlowLogs
                  - ec2:Describe*
                  - ecs:List*
                  - ecs:Describe*
                  - logs:CreateLogDelivery
                  - logs:GetLogDelivery
                  - logs:UpdateLogDelivery
                  - logs:DeleteLogDelivery
                  - logs:ListLogDeliveries
                Resource:
                  - "*"
              - Effect: Allow
                Action:
                  - s3:PutObject
                  - s3:GetBucketLocation
                Resource:
                  - !Sub "${VPCFlowlogBucketArn}/*"
              - Effect: Allow
                Action:
                  - s3:GetBucketLocation
                Resource:
                  - !Sub "${VPCFlowlogBucketArn}"
  #----------------------------------------------------
  # Create Runbooks
  #----------------------------------------------------
  SSMDocument:
    Type: AWS::SSM::Document
    Properties:
      Name: Check-VPC-Flowlog-SSMDocument
      DocumentFormat: YAML
      DocumentType: Automation
      UpdateMethod: NewVersion
      Content:
        schemaVersion: "0.3"
        description: Create VPC Flow Logs
        assumeRole: !GetAtt AutomationAssumeRole.Arn
        parameters:
          AutomationAssumeRole:
            type: String
            description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf.
            default: !GetAtt AutomationAssumeRole.Arn
          ResourceIds:
            type: StringList
            description: (Required) The IDs of the resources for which to create the flow log.
            allowedPattern: (vpc|eni|subnet|tgw|tgw-attach)-[0-9a-f]{8,17}
          TrafficType:
            type: String
            description: (Optional) The type of traffic to log.
            default: ALL
            allowedValues:
              - ACCEPT
              - REJECT
              - ALL
          LogDestinationType:
            type: String
            description: (Optional) The destination type to publish flow log data to.
            default: s3
            allowedValues:
              - cloud-watch-logs
              - s3
          LogDestinationARN:
            type: String
            description: (Required) The ARN of the S3 bucket or CloudWatch Logs log group.
        mainSteps:
          - description: Create VPC Flow Logs
            name: CreateFlowLogs
            action: aws:executeAwsApi
            isEnd: true
            inputs:
              Service: ec2
              Api: CreateFlowLogs
              ResourceIds: "{{ ResourceIds }}"
              ResourceType: VPC
              TrafficType: "{{ TrafficType }}"
              LogDestinationType: "{{ LogDestinationType }}"
              LogDestination: "{{ LogDestinationARN }}"
              LogFormat: "${version} ${account-id} ${interface-id} ${srcaddr} ${dstaddr} ${srcport} ${dstport} ${protocol} ${packets} ${bytes} ${start} ${end} ${action} ${log-status} ${vpc-id} ${subnet-id} ${instance-id} ${tcp-flags} ${type} ${pkt-srcaddr} ${pkt-dstaddr} ${region} ${az-id} ${sublocation-type} ${sublocation-id} ${pkt-src-aws-service} ${pkt-dst-aws-service} ${flow-direction} ${traffic-path} ${ecs-cluster-arn} ${ecs-cluster-name} ${ecs-container-instance-arn} ${ecs-container-instance-id} ${ecs-container-id} ${ecs-second-container-id} ${ecs-service-name} ${ecs-task-definition-arn} ${ecs-task-arn} ${ecs-task-id} ${reject-reason}"
              DestinationOptions:
                PerHourPartition: True
  #----------------------
  # Create Config Rule
  #----------------------
  ConfigRule:
    Type: AWS::Config::ConfigRule
    Properties:
      ConfigRuleName: Check-VPC-Flowlog
      Description: "Check that VPC Flow Logs are enabled for all VPCs"
      Source:
        Owner: AWS
        SourceIdentifier: VPC_FLOW_LOGS_ENABLED
  #--------------------------------
  # Create RemediationConfiguration
  #--------------------------------
  RemediationConfiguration:
    Type: AWS::Config::RemediationConfiguration
    Properties:
      Automatic: true
      MaximumAutomaticAttempts: 10
      RetryAttemptSeconds: 300
      ConfigRuleName: !Ref ConfigRule
      TargetType: SSM_DOCUMENT
      TargetId: !Ref SSMDocument
      ResourceType: AWS::EC2::VPC
      Parameters:
        TrafficType:
          StaticValue:
            Values:
              - "ALL"
        LogDestinationType:
          StaticValue:
            Values:
              - "s3"
        LogDestinationARN:
          StaticValue:
            Values:
              - !Ref VPCFlowlogBucketArn
        ResourceIds:
          ResourceValue:
            Value: RESOURCE_ID
        AutomationAssumeRole:
          StaticValue:
            Values:
              - !GetAtt AutomationAssumeRole.Arn

また、今回設定するVPC Flow Logsのログフォーマットは以下です。
ECSのトラフィックログも取得できるように設定しています。

ここを押すと展開します

${version} ${account-id} ${interface-id} ${srcaddr} ${dstaddr} ${srcport} ${dstport} ${protocol} ${packets} ${bytes} ${start} ${end} ${action} ${log-status} ${vpc-id} ${subnet-id} ${instance-id} ${tcp-flags} ${type} ${pkt-srcaddr} ${pkt-dstaddr} ${region} ${az-id} ${sublocation-type} ${sublocation-id} ${pkt-src-aws-service} ${pkt-dst-aws-service} ${flow-direction} ${traffic-path} ${ecs-cluster-arn} ${ecs-cluster-name} ${ecs-container-instance-arn} ${ecs-container-instance-id} ${ecs-container-id} ${ecs-second-container-id} ${ecs-service-name} ${ecs-task-definition-arn} ${ecs-task-arn} ${ecs-task-id} ${reject-reason}

VPC Flow Logs保管用バケットのリソースポリシー

VPC Flow Logsの保管用バケットに、以下のようなバケットポリシーを設定し、VPC Flow Logsが保管できるようにします。
アカウントIDとなる部分は「xxxxxxxxxxxx」としています。

ここを押すと展開します

{
    "Version": "2012-10-17",
    "Id": "AWSLogDeliveryWrite20150319",
    "Statement": [
        {
            "Sid": "AWSLogDeliveryWrite1",
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::my-aws-vpc-flow-logs-20260321/AWSLogs/xxxxxxxxxxxx/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control",
                    "aws:SourceAccount": "xxxxxxxxxxxx"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:logs:ap-northeast-1:xxxxxxxxxxxx:*"
                }
            }
        },
        {
            "Sid": "AWSLogDeliveryAclCheck1",
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::my-aws-vpc-flow-logs-20260321",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "xxxxxxxxxxxx"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:logs:ap-northeast-1:xxxxxxxxxxxx:*"
                }
            }
        }
    ]
}

また、
上記のバケットポリシーは、手動でVPC Flow LogsをVPC Flow Logs保管バケットに対して設定することで自動的に設定されます。 バケットポリシーの設定が面倒な方は、手動でVPC Flow Logsを作成することをお勧めします。

AWS CloudFormationスタックの作成

変更を行う部分だけ解説します。
AWS CloudFormationのマネジメントコンソールから「スタックの作成」をクリックします。

03.png

「テンプレートの指定」にて、「テンプレートファイルをアップロード」を選択し、上記のYAMLテンプレートファイルをアップロードします。

04.png

スタック名を記載し、以下のパラメーターも記載します。

  • VPCFlowlogBucketArn:VPC Flow Logsを保管するS3バケットのARN

記載完了後、「次へ」をクリックします。

05.png

「AWS CloudFormation によって IAM リソースがカスタム名で作成される場合があることを承認します。」にチェックを入れ、「次へ」をクリックします。

06.png

次の画面で、作成するスタックの設定を確認し、問題なければ「送信」をクリックしスタックを作成します。

07.png

無事に作成できました。

08.png

動作確認

以下のようにVPC Flow Logsが設定されていないVPCを作成し、
AWS Configを使って自動的にVPC Flow Logsが設定できることを確認します。

09.png

この状態で作成したAWS Configルールを確認すると、非準拠として検知ができています。

10.png

ルールをクリックし、「対象範囲のリソース」にて、検知しているVPCを選択し「修復」をクリックします。

11.png

「アクションが正常に実行されました」という表示になれば、VPC Flow Logsの作成は完了しています。

12.png

「アクション」から「再評価」をクリックし、AWS Configルールが準拠状態になることを確認します。

13.png

再評価が完了すると、先ほどまで非準拠だったVPCが準拠となっていました。

15.png

最後にVPC Flow Logsが作成できているかを確認します。
問題なく作成できていました。

16.png

まとめ

今回は、AWS Configを使ったVPC Flow Logsの設定について紹介しました。
VPCの数が多く、効率よくVPC Flow Logsを設定したい場合に有効だと思います。

この記事は私が書きました

山内 宏紀

記事一覧

CloudFormationが好きです。 使っているギターはSGです。

山内 宏紀

この記事を共有する

クラウドのご相談

CONTACT

クラウド導入や運用でお悩みの方は、お気軽にご相談ください。
専門家がサポートします。

サービス資料ダウンロード

DOWNLOAD

ビジネスをクラウドで加速させる準備はできていますか?
今すぐサービス資料をダウンロードして、詳細をご確認ください。