【VPC Flow Logs】マルチアカウントの VPCフローログ を 1つのS3バケットへ集約する
VPCフローログ(VPC Flow Logs) は VPC内で行き来する IPトラフィックをキャプチャする機能です。 IPトラフィックの分析に役立ちます。
フローログデータは Amazon CloudWatch Logsまたは Amazon S3 に発行 できます。
CloudWatch Logs へ発行した場合は、 CloudWatch Logs Insights を使ってロググループに対して クエリを実行、結果を確認できます。 リアルタイムのログの可視化・アラートに役立ちます。
S3(バケット)へ発行した場合は、 Amazon Athena(ほか分析ツール) など使って ログを調査できます。 IPトラフィックのデータを蓄積、後に分析したい場合はこちらが役立ちます。
本ブログでは、マルチアカウント環境において 複数のVPCフローログを 1つのS3バケットへ集約 してみます。
S3バケットの作成
集約してフローログを格納するための S3バケットを作成します。 フローログは貯まり続けるので、ライフサイクルルール(XX日で失効) を入れることをおすすめします。
S3バケットに以下のようなバケットポリシーを入れます。
バケットに対する s3:PutObject
、 s3:GetBucketAcl
を許可するポリシーです。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AWSLogDeliveryWrite", "Effect": "Allow", "Principal": { "Service": "delivery.logs.amazonaws.com" }, "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::(バケット名)/AWSLogs/(AWSアカウントID#A)/*", "arn:aws:s3:::(バケット名)/AWSLogs/(AWSアカウントID#B)/*", "arn:aws:s3:::(バケット名)/AWSLogs/(AWSアカウントID#C)/*" ], "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } } }, { "Sid": "AWSLogDeliveryAclCheck", "Effect": "Allow", "Principal": { "Service": "delivery.logs.amazonaws.com" }, "Action": "s3:GetBucketAcl", "Resource": "arn:aws:s3:::(バケット名)" } ] }
VPC Flow Logs の有効化
CloudFormationテンプレートを準備して作成します。
以下のようなテンプレートを作成してそれぞれのアカウントに展開します。
AWS::EC2::FlowLog
リソースを作成するテンプレートです。
(参考: AWS::EC2::FlowLog | AWSドキュメント)
AWSTemplateFormatVersion: '2010-09-09' Parameters: BucketName: Type: String Default: xxx FlowLogsFilter: Type: String Default: ALL AllowedValues: [ ALL, ACCEPT, REJECT ] Resources: FlowLogs: Type: AWS::EC2::FlowLog Properties: LogDestinationType: s3 LogDestination: !Sub "arn:aws:s3:::${BucketName}" ResourceType: VPC ResourceId: !ImportValue Vpc TrafficType: !Ref FlowLogsFilter
パラメータ、リソース(FlowLogs) の内容は以下のとおりです。
- パラメータ
- BucketName: 先程作成した S3バケット名
- FlowLogsFilter: 保存するIPトラフィックの種類(すべて/許可/拒否)
- FlowLogsプロパティ
- LogDestinationType: 送信先を S3とします
- LogDestination: 送信先を指定します(S3バケット ARN)
- ResourceType: リソースの種類(VPC)
- ResourceId: 対象のVPC ID。
(上記テンプレートは別CFnスタックの
Vpc
アウトプットを参照するものにしています) - TrafficType: 保存するIPトラフィックの種類
確認
S3バケットを見てみます。
作成した S3バケットの AWSLogs/
に各アカウントIDのフォルダがあります。
各アカウントID毎に以下のようにフローログが保存されます。
適宜、これらログを Athena(ほか分析ツール)など使って調査しましょう。 (参考: VPCフローログをAmazon Athenaで分析する | Developers.IO)
おわりに
マルチアカウントのVPCフローログを、1バケットに集約してみました。
マルチアカウント統制に便利な Organizations の直接の連携機能として VPC Flow Logs の一括設定機能は今のところありません。
ですが CloudFormation StackSets との連携 で 組織単位で簡単にCFnテンプレートを展開できるので、 それを活用してマルチアカウントで一括 VPC Flow Logs 設定を検討すると良いかもしれません。
(参考: 【Organizations】組織単位で CloudFormation StackSetsを簡単にデプロイしてみる | Developers.IO)
少しでもどなたかのお役に立てば幸いです。
補足: S3バケットのCFnテンプレート
今回の構築で使った S3バケットの CFnテンプレートも以下記します。 適宜、バケットポリシーに記載しているアカウントID含んだARNを修正してください。
AWSTemplateFormatVersion: '2010-09-09' Parameters: BucketName: Type: String Default: xxx BucketExpirationInDays: Type: Number Default: 90 Resources: S3Bucket: Type: AWS::S3::Bucket Properties: BucketName: !Ref BucketName # S3デフォルトの暗号化 BucketEncryption: ServerSideEncryptionConfiguration: - ServerSideEncryptionByDefault: SSEAlgorithm: AES256 # XX日失効のライフサイクルルール LifecycleConfiguration: Rules: - Id: ExpirationRule Status: Enabled ExpirationInDays: !Ref BucketExpirationInDays # ブロックパブリックアクセスを全てONに PublicAccessBlockConfiguration: BlockPublicAcls: true BlockPublicPolicy: true IgnorePublicAcls: true RestrictPublicBuckets: true S3BucketPolicy: Type: AWS::S3::BucketPolicy Properties: Bucket: !Ref BucketName PolicyDocument: # BucketPolicy Version: '2012-10-17' Statement: - Sid: AWSLogDeliveryWrite Effect: Allow Principal: Service: delivery.logs.amazonaws.com Action: s3:PutObject Resource: - !Sub "arn:aws:s3:::${BucketName}/AWSLogs/(アカウントID#A)/*" - !Sub "arn:aws:s3:::${BucketName}/AWSLogs/(アカウントID#B)/*" - !Sub "arn:aws:s3:::${BucketName}/AWSLogs/(アカウントID#C)/*" Condition: StringEquals: s3:x-amz-acl: bucket-owner-full-control - Sid: AWSLogDeliveryAclCheck Effect: Allow Principal: Service: delivery.logs.amazonaws.com Action: s3:GetBucketAcl Resource: !Sub "arn:aws:s3:::${BucketName}"