全体の一元化のために VPC フローログを設定する AWS アカウント - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

全体の一元化のために VPC フローログを設定する AWS アカウント

Benjamin Morris、Aman Kaur Gandhi (Amazon Web Services)

概要

AWS 仮想プライベートクラウド (VPC) では、VPC フローログ機能は運用およびセキュリティのトラブルシューティングに役立つデータを提供します。ただし、マルチアカウント環境での VPC フローログの使用には制限があります。具体的には、Amazon CloudWatch Logs からのクロスアカウントフローログがサポートされません。代わりに、Amazon Simple Storage Service (Amazon S3) バケットに適切なバケットポリシーを設定して、ログを一元化できます。

注記

このパターンでは、一元管理する場所にフローログを送信するための要件について説明しています。ただし、メンバーアカウントでローカルにもログを利用できるようにする場合、各VPC ごとに複数のフローログを作成できます。ログアーカイブアカウントにアクセスできないユーザーは、トラブルシューティングの目的でトラフィックログを参照できます。また、VPC ごとに1つのフローログを設定して、CloudWatch ログにログを送信することもできます。その後、Amazon Data Firehose サブスクリプションフィルタを使用して、ログを S3 バケットに転送できます。詳細については、「関連リソース」セクションを参照してください。

前提条件と制限事項

前提条件

  • アクティブな AWS アカウント

  • ログを一元化するために使用されるアカウントを持つ AWS Organizations 組織 (ログアーカイブなど)

制限事項

AWS Key Management Service (AWS KMS) マネージドキーを使用して中央バケットをaws/s3暗号化する場合、別のアカウントからログを受信しません。代わりに、特定の ResourceId"LogDestination: <bucketName> is undeliverable" などのメッセージを含む、Unsuccessful エラーコード 400 が表示されます。これは、アカウントの AWS マネージドキーをアカウント間で共有できないためです。解決策は、Amazon S3 マネージド暗号化 (SSE-S3) またはメンバーアカウントと共有できる AWS KMS カスタマーマネージドキーのいずれかを使用することです。

アーキテクチャ

ターゲットアーキテクチャ

以下の図では、VPC ごとに 2 つのフローログがデプロイされています。1 つは、ローカルの CloudWatch ロググループにログを送信します。もう 1 つは、一元化されたロギングアカウントの S3 バケットにログを送信します。バケットポリシーにより、ログ配信サービスによるバケットへのログの書き込みが許可されます。

注記

2023 年 11 月 AWS 現在、 は aws:SourceOrgID 条件キーをサポートしています。この条件により、 AWS Organizations 組織外のアカウントの一元化されたバケットへの書き込みを拒否できます。

各 VPC から、1 つのフローログが CloudWatch にログを送信し、別のフローログは S3 バケットにログを送信します。

自動化とスケール

各 VPC は、セントラルロギングアカウントの S3 バケットにログを送信するように設定されます。フローログが適切に設定されるように、以下の自動化ソリューションのいずれかを使用します。

ツール

ツール

  • Amazon CloudWatch Logs を使用すると、すべてのシステム、アプリケーション、および からのログを一元化 AWS のサービス できるため、ログをモニタリングして安全にアーカイブできます。

  • Amazon Simple Storage Service (Amazon S3) は、あらゆる量のデータを保存、保護、取得できるクラウドベースのオブジェクトストレージサービスです。

  • Amazon Virtual Private Cloud (Amazon VPC) は、定義した仮想ネットワークに AWS リソースを起動するのに役立ちます。この仮想ネットワークは、ユーザー自身のデータセンターで運用されていた従来のネットワークと似ていますが、 AWSのスケーラブルなインフラストラクチャを使用できるという利点があります。このパターンでは、「VPC フローログ」特徴量 を使用して、 VPC のネットワークインターフェイスとの間で行き来する IP トラフィック情報をキャプチャします。

ベストプラクティス

Infrastructure as Code (IaC)を使用して、VPC フローログのデプロイプロセスを大幅に簡素化できます。VPC デプロイ定義を抽象化してフローログリソース構造を含める場合、フローログを含む VPC が自動的にデプロイされます。これについては、次のセクションで説明します。

一元化されたフローログ

次に、一元化されたフローログを、HashiCorp Terraform の VPC モジュールに追加する構文の例を示します。このコードは、一元化された S3 バケットに VPC からログを送信するフローログを作成します。このパターンでは、S3 バケットの作成は扱っていないことに注意してください。推奨されるバケットポリシーステートメントについては、「追加情報」セクションを参照してください。

variable "vpc_id" { type = string } locals { custom_log_format_v5 = "$${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}" } resource "aws_flow_log" "centralized_flow_log" { log_destination = "arn:aws:s3:::centralized-vpc-flow-logs-<log_archive_account_id>" # Optionally, a prefix can be added after the ARN. log_destination_type = "s3" traffic_type = "ALL" vpc_id = var.vpc_id log_format = local.custom_log_format_v5 # If you want fields from VPC Flow Logs v3+, you will need to create a custom log format. }

カスタムログ形式の詳細については、Amazon VPC ドキュメントを参照してください。

ローカルフローログ

次に、必要なアクセス許可を使用して、ローカルフローログを Terraform の VPC モジュールに追加する構文の例を示します。このコードは、VPC からローカル CloudWatch Logs グループにログを送信するフローログを作成します。

data "aws_region" "current" {} variable "vpc_id" { type = string } resource "aws_iam_role" "local_flow_log_role" { name = "flow-logs-policy-${var.vpc_id}" assume_role_policy = <<EOF { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": {"Service": "vpc-flow-logs.amazonaws.com"}, "Action": "sts:AssumeRole" }] } EOF } resource "aws_iam_role_policy" "logs_permissions" { name = "flow-logs-policy-${var.vpc_id}" role = aws_iam_role.local_flow_log_role.id policy = <<EOF { "Version": "2012-10-17", "Statement": [{ "Action": ["logs:CreateLog*", "logs:PutLogEvents", "logs:DescribeLog*", "logs:DeleteLogDelivery"], "Effect": "Allow", "Resource": "arn:aws:logs:${data.aws_region.current.name}:*:log-group:vpc-flow-logs*" }] } EOF } resource "aws_cloudwatch_log_group" "local_flow_logs" { name = "vpc-flow-logs/${var.vpc_id}" retention_in_days = 30 } resource "aws_flow_log" "local_flow_log" { iam_role_arn = aws_iam_role.local_flow_log_role.arn log_destination = aws_cloudwatch_log_group.local_flow_logs.arn traffic_type = "ALL" vpc_id = var.vpc_id }

エピック

タスク説明必要なスキル

暗号化戦略を決定し、中央の S3 バケットのポリシーを作成する

中央バケットはキー AWS KMS aws/s3をサポートしていないため、SSE-S3 または AWS KMS カスタマーマネージドキーを使用する必要があります。 AWS KMS キーを使用する場合、キーポリシーはメンバーアカウントにキーの使用を許可する必要があります。

コンプライアンス

中央のフローログバケットを作成する

フローログの送信先となる中央バケットを作成し、前のステップで選択した暗号化戦略を適用します。このバケットは、ログアーカイブ、または同様の目的のアカウントに作成する必要があります。

追加情報」セクションからバケットポリシーを取得し、環境固有の値でプレースホルダーを更新してから、中央バケットに適用します。

AWS 全般

VPC フローログを設定して、中央のフローログバケットにログが送信されるようにする

データを収集しようとする各 VPC に、フローログを追加します。これを行う最もスケーラブルな方法は、AFT や などの IaC ツールを使用することです AWS Cloud Development Kit (AWS CDK)。たとえば、フローログと一緒に VPC をデプロイする Terraform モジュールを作成できます。必要に応じて、フローログを手動で追加します。

ネットワーク管理者

VPC フローログをローカル CloudWatch ログに送信するように設定します。

(オプション) ログが生成されているアカウントでフローログを表示する場合、別のフローログを作成して、ローカルアカウントの CloudWatch Logs にデータを送信します。あるいは、ローカルアカウントのアカウント固有の S3 バケットにデータを送信することもできます。

AWS 全般

関連リソース

追加情報

バケットポリシー

このバケットポリシーの例は、プレースホルダー名の値を追加した後に、フローログ用のセントラル S3 バケットに適用できます。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AWSLogDeliveryWrite", "Effect": "Allow", "Principal": { "Service": "delivery.logs.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::<BUCKET_NAME>/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control", "aws:SourceOrgID": "<ORG_ID>" } } }, { "Sid": "AWSLogDeliveryCheck", "Effect": "Allow", "Principal": { "Service": "delivery.logs.amazonaws.com" }, "Action": "s3:GetBucketAcl", "Resource": "arn:aws:s3:::<BUCKET_NAME>", "Condition": { "StringEquals": { "aws:SourceOrgID": "<ORG_ID>" } } }, { "Sid": "DenyUnencryptedTraffic", "Effect": "Deny", "Principal": { "AWS": "*" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::<BUCKET_NAME>/*", "arn:aws:s3:::<BUCKET_NAME>" ], "Condition": { "Bool": { "aws:SecureTransport": "false" } } } ] }