AWS VPC Flow Logs を収集する
このドキュメントでは、Amazon S3(テキスト形式)、Kinesis Data Firehose を使用した Amazon CloudWatch Logs、Amazon S3 の CSV 形式の 3 つの方法を使用して、AWS VPC フローログを Google Security Operations に取り込む方法について説明します。AWS VPC フローログは、VPC 内のネットワーク インターフェースを経由する IP トラフィックに関する情報を取得できる機能です。この統合により、これらのログを Google SecOps に送信して分析とモニタリングを行うことができます。
サポートされている AWS VPC Flow Logs の形式
Google SecOps は、次の 2 つの主要なテキスト形式で AWS VPC Flow Logs の取り込みをサポートしています。
- JSON 形式:
AWS_VPC_FLOW
ログタイプは、JSON 形式のログを解析します。この形式では、各ログエントリにキーとその対応する値の両方が含まれるため、データが自己記述型になります。 - CSV 形式: Google SecOps は、CSV 形式の AWS VPC Flow Logs のパーサーも提供しています。この形式では、ヘッダー行にフィールドキーが 1 回だけリストされ、後続の行にはカンマ区切りの値のみが含まれます。
CSV 形式では各ログエントリにフィールドキーが含まれていないため、AWS_VPC_FLOW_CSV パーサーは値の厳密な事前定義された順序に依存します。CSV ファイルは、正しく解析するために次のフィールド順序に準拠する必要があります。
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
CSV ログ行の例を次に示します。
7,369096419186,eni-0520bb5efed19d33a,10.119.32.34,10.119.223.3,51256,16020,6,14,3881,1723542839,1723542871,ACCEPT,OK,vpc-0769a6844ce873a6a,subnet-0cf9b2cb32f49f258,i-088d6080f45f5744f,0,IPv4,10.119.32.34,10.119.223.3,ap-northeast-1,apne1-az4,-,-,-,-,ingress,,-,-,-,-,-,-,-,-,-,-
値が使用できないフィールドについては、CSV 行内の正しい位置順序を維持するために、空の値(,, など)を渡す必要があります。
始める前に
次の前提条件を満たしていることを確認してください。
- Google SecOps インスタンス。
- AWS への特権アクセス。
オプション 1: AWS S3 を使用して AWS VPC Flow Logs のエクスポートを構成する(テキスト形式)
次のセクションでは、Google SecOps による分析のために VPC Flow Logs のエクスポートを有効にするように Amazon S3 と Identity and Access Management の権限を構成する方法について説明します。
Google SecOps 用に AWS S3 バケットと IAM を構成する
- バケットの作成のユーザーガイドに沿って、Amazon S3 バケットを作成します。
- 後で参照できるように、バケットの名前とリージョンを保存します(例:
aws-vpc-flowlogs
)。 - IAM ユーザーの作成のユーザーガイドに沿って、ユーザーを作成します。
- 作成したユーザーを選択します。
- [セキュリティ認証情報] タブを選択します。
- [アクセスキー] セクションで [アクセスキーを作成] をクリックします。
- [ユースケース] として [サードパーティ サービス] を選択します。
- [次へ] をクリックします。
- 省略可: 説明タグを追加します。
- [アクセスキーを作成] をクリックします。
- [CSV ファイルをダウンロード] をクリックし、[アクセスキー] と [シークレット アクセスキー] を保存して、今後の参照に備えます。
- [完了] をクリックします。
- [権限] タブを選択します。
- [権限ポリシー] セクションで [権限を追加] をクリックします。
- [権限を追加] を選択します。
- [ポリシーを直接アタッチする] を選択します。
- AmazonS3FullAccess ポリシーを検索します。
- ポリシーを選択します。
- [次へ] をクリックします。
- [権限を追加] をクリックします。
VPC Flow Logs を作成する(宛先: Amazon S3、テキスト形式)
- AWS コンソール > VPC > VPC/サブネット/ネットワーク インターフェースを開き、ロギングするスコープを選択します。
- [Actions] > [Create flow log] をクリックします。
- 次の構成の詳細を入力します。
- フィルタ: ポリシーに沿って [すべて](または [承認] / [拒否])を選択します。
- Maximum aggregation interval: [1 minute](推奨)または [10 minutes] を選択します。
- 宛先: [Amazon S3 バケットに送信] を選択します。
- S3 バケット ARN: 前のセクションで作成したバケット名を
arn:aws:s3:::<your-bucket>
の形式で入力します。 - ログ レコード形式: [AWS default format] を選択します。
- ログファイル形式: [テキスト(書式なし)] を選択します。
- 省略可: 必要がない限り、Hive 互換の接頭辞と時間単位のパーティションを無効にします。
- [フローログを作成] をクリックします。
AWS VPC Flow Logs(S3 テキスト)を取り込むように Google SecOps でフィードを構成する
- [SIEM 設定] > [フィード] に移動します。
- [+ 新しいフィードを追加] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例:
AWS VPC Flow Logs - S3 (Text)
)。 - [ソースタイプ] として [Amazon S3 V2] を選択します。
- [Log type] として [AWS VPC Flow] を選択します。
- [次へ] をクリックします。
- 次の入力パラメータの値を指定します。
- S3 URI: S3 バケットのアドレス(例:
s3://<your-bucket>/AWSLogs/<account-id>/vpcflowlogs/<region>/
)を入力します。 - Source deletion options: 必要に応じて削除オプションを選択します。
- 最大ファイル経過時間: デフォルトは 180 日です。
- アクセスキー ID: S3 バケットにアクセスできるユーザー アクセスキー。
- シークレット アクセスキー: S3 バケットにアクセスできるユーザーのシークレット キー。
- アセットの名前空間: アセットの名前空間。
- Ingestion labels: このフィードのイベントに適用されるラベル。
- S3 URI: S3 バケットのアドレス(例:
- [次へ] をクリックします。
- [Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。
オプション 2: Amazon CloudWatch Logs と Kinesis Data Firehose を使用して AWS VPC Flow Logs のエクスポートを構成する
このオプションでは、CloudWatch に送信されるようにフローログを設定した後、Kinesis Data Firehose を使用してログデータを任意の宛先にストリーミングすることで、データ エクスポートの追加レイヤが提供されます。
VPC Flow Logs を作成する(宛先: Amazon CloudWatch Logs)
- AWS コンソール > VPC > [Your VPCs/Subnets/Network interfaces] を開きます。
- [Actions] > [Create flow log] をクリックします。
- 次の構成の詳細を入力します。
- フィルタ: ポリシーに応じて [すべて](または [承認] / [不承認])を選択します。
- Maximum aggregation interval: [1 minute](推奨)または [10 minutes] を選択します。
- 宛先: [CloudWatch Logs に送信] を選択します。
- 宛先ロググループ: ロググループ(
/aws/vpc/flowlogs
など)を選択または作成します。 - IAM ロール: CloudWatch Logs に書き込むことができるロールを選択します。
- ログ レコード形式: [AWS default](バージョン 2)または [Custom](追加フィールドを含む)を選択します。
- [フローログを作成] をクリックします。
Google SecOps でフィードを作成してエンドポイント URL と秘密鍵を取得する
- [SIEM 設定] > [フィード] に移動します。
- [+ 新しいフィードを追加] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例:
AWS VPC Flow Logs - CloudWatch via Firehose
)。 - [ソースタイプ] として [Amazon Data Firehose] を選択します。
- [Log type] として [AWS VPC Flow] を選択します。
- [次へ] をクリックします。
- 次の入力パラメータの値を指定します。
- 分割区切り文字: 省略可能な
n
。 - アセットの名前空間: アセットの名前空間(
aws.vpc.flowlogs.cwl
など)。 - Ingestion labels: このフィードのイベントに適用されるラベル(
source=vpc_flow_firehose
など)。
- 分割区切り文字: 省略可能な
- [次へ] をクリックします。
- フィードの設定を確認し、[送信] をクリックします。
- [秘密鍵を生成する] をクリックして、このフィードを認証するためのシークレット キーを生成します。
- このシークレットは再び表示できないため、秘密鍵をコピーして保存します。
- [詳細] タブに移動します。
- [エンドポイント情報] フィールドから、フィードのエンドポイント URL をコピーします。
- [完了] をクリックします。
Amazon Data Firehose フィード用の API キーを作成する
- Google Cloud コンソールの [認証情報] ページに移動します。
- [認証情報を作成] をクリックして [API キー] を選択します。
- キーをコピーして安全な場所に保存します。
- API キーのアクセスを Google SecOps API に制限します。
CloudWatch Logs から Firehose への IAM 権限を構成する
- AWS コンソールで、[IAM] > [ポリシー] > [ポリシーの作成] > [JSON] に移動します。
次のポリシー JSON を貼り付けます。
<region>
と<account-id>
は、AWS リージョンとアカウント ID に置き換えます。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "firehose:PutRecord", "firehose:PutRecordBatch" ], "Resource": "arn:aws:firehose:<region>:<account-id>:deliverystream/cwlogs-to-secops" } ] }
ポリシーに
CWLtoFirehoseWrite
という名前を付けて、[ポリシーを作成] をクリックします。[IAM]> [ロール]> [ロールの作成] に移動します。
[カスタム信頼ポリシー] を選択して、次のように貼り付けます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "logs.<region>.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
ポリシー
CWLtoFirehoseWrite
をロールにアタッチします。ロールに「
CWLtoFirehoseRole
」という名前を付けて、[ロールを作成] をクリックします。
Amazon Kinesis Data Firehose を Google SecOps に構成する
- AWS コンソールで、[Kinesis] > [Data Firehose] > [配信ストリームを作成] に移動します。
- 次の構成の詳細を入力します。
- ソース: [直接 PUT またはその他のソース] を選択します。
- 宛先: [HTTP エンドポイント] を選択します。
- 名前:
cwlogs-to-secops
- HTTP エンドポイント URL: Google SecOps のフィード HTTPS エンドポイント URL を入力し、API キーを追加します。
<ENDPOINT_URL>?key=<API_KEY>
- HTTP メソッド: [POST] を選択します。
- [アクセスキー] で、次の操作を行います。
- Google SecOps フィードで生成された秘密鍵を入力します(これは
X-Amz-Firehose-Access-Key
ヘッダーになります)。 - バッファリングのヒント: バッファサイズ = 1 MiB、バッファ間隔 = 60 秒に設定します。
- 圧縮: [無効] を選択します。
- S3 バックアップ: [無効] を選択します。
- 再試行とロギングの設定はデフォルトのままにします。
- Google SecOps フィードで生成された秘密鍵を入力します(これは
- [配信ストリームを作成] をクリックします。
CloudWatch Logs グループを Firehose ストリームに登録する
- [CloudWatch] > [Logs] > [Log groups] に移動します。
- ターゲット ロググループ(
/aws/vpc/flowlogs
など)を選択します。 - [サブスクリプション フィルタ] タブを開き、[作成] をクリックします。
- [Amazon Kinesis Data Firehose サブスクリプション フィルタを作成] を選択します。
- 次の構成の詳細を入力します。
- 宛先: 配信ストリーム
cwlogs-to-secops
を選択します。 - 権限を付与: ロール
CWLtoFirehoseRole
を選択します。 - フィルタ名: 「
all-events
」と入力します。 - フィルタ パターン: すべてのイベントを送信する場合は、空白のままにします。
- 宛先: 配信ストリーム
- [ストリーミングを開始] をクリックします。
オプション 3: Amazon S3 を使用して CSV 形式で AWS VPC Flow Logs を構成する
ログを CSV 形式に変換する(省略可)
- CSV の行が、VPC Flow Log のカスタム形式(正規の v2 フィールド セット、v5/v7 セットなど)で選択したフィールドと一致する厳密で一貫性のある列順序に従っていることを確認します。パーサー オプションでヘッダー行が想定されている場合を除き、本番環境ファイルにヘッダー行を含めないでください。
- CSV ファイルを安定した接頭辞(
s3://<your-bucket>/vpcflowlogs-csv/<region>/year=<year>/month=<month>/day=<day>/
など)に書き込みます。
AWS VPC Flow Logs(CSV)を取り込むように Google SecOps でフィードを構成する
- [SIEM 設定] > [フィード] に移動します。
- [+ 新しいフィードを追加] をクリックします。
- [フィード名] フィールドに、フィードの名前を入力します(例:
AWS VPC Flow Logs - S3 (CSV)
)。 - [ソースタイプ] として [Amazon S3 V2] を選択します。
- [Log type] で [AWS VPC Flow (CSV)] を選択します。
- [次へ] をクリックします。
- 次の入力パラメータの値を指定します。
- S3 URI: S3 バケットのアドレス(例:
s3://<your-bucket>/vpcflowlogs-csv/<region>/
)を入力します。 - Source deletion options: 必要に応じて削除オプションを選択します。
- 最大ファイル経過時間: デフォルトは 180 日です。
- アクセスキー ID: S3 バケットにアクセスできるユーザー アクセスキー。
- シークレット アクセスキー: S3 バケットにアクセスできるユーザーのシークレット キー。
- アセットの名前空間: アセットの名前空間。
- Ingestion labels: このフィードのイベントに適用されるラベル。
- S3 URI: S3 バケットのアドレス(例:
- [次へ] をクリックします。
- [Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。
UDM マッピング テーブル
ログフィールド | UDM マッピング | ロジック |
---|---|---|
accountId | read_only_udm.metadata.product_log_id | 未加工ログ フィールド accountId から抽出された値。 |
アクション | read_only_udm.security_result.action_details | 未加工ログ フィールド action から抽出された値。 |
アクション | read_only_udm.security_result.action | action が ACCEPT の場合は ALLOW にマッピングされ、action が REJECT の場合は BLOCK にマッピングされます。 |
az_id | read_only_udm.principal.cloud.availability_zone | 未加工ログ フィールド az_id から抽出された値。 |
バイト | read_only_udm.network.received_bytes | 未加工ログ フィールド bytes から抽出された値。 |
dstaddr | read_only_udm.target.ip | 未加工ログ フィールド dstaddr から抽出された値。 |
dstport | read_only_udm.target.port | 未加工ログ フィールド dstport から抽出された値。 |
end_time | read_only_udm.about.resource.attribute.labels.value | 未加工ログ フィールド end_time から抽出された値。 |
end_time | read_only_udm.metadata.ingested_timestamp | 未加工ログ フィールド end_time から抽出された値。 |
flow_direction | read_only_udm.network.direction | flow_direction が ingress の場合は INBOUND にマッピングされ、flow_direction が egress の場合は OUTBOUND にマッピングされます。 |
インスタンス ID | read_only_udm.principal.cloud.project.id | 未加工ログ フィールド InstanceID から抽出された値。 |
interfaceId | read_only_udm.about.resource.attribute.labels.value | 未加工ログ フィールド interfaceId から抽出された値。 |
logStatus | read_only_udm.about.resource.attribute.labels.value | 未加工ログ フィールド logStatus から抽出された値。 |
packets | read_only_udm.about.resource.attribute.labels.value | 未加工ログ フィールド packets から抽出された値。 |
pkt_dst_aws_service | read_only_udm.about.resource.attribute.labels.value | 未加工ログ フィールド pkt_dst_aws_service から抽出された値。 |
pkt_dstaddr | read_only_udm.intermediary.ip | 未加工ログ フィールド pkt_dstaddr から抽出された値。 |
pkt_srcaddr | read_only_udm.intermediary.ip | 未加工ログ フィールド pkt_srcaddr から抽出された値。 |
pkt_src_aws_service | read_only_udm.about.resource.attribute.labels.value | 未加工ログ フィールド pkt_src_aws_service から抽出された値。 |
プロトコル | read_only_udm.network.ip_protocol | protocol が 6 の場合は TCP にマッピングされ、protocol が 17 の場合は UDP にマッピングされ、それ以外の場合は UNKNOWN_IP_PROTOCOL にマッピングされます。 |
地域 | read_only_udm.principal.location.country_or_region | 未加工ログ フィールド Region から抽出された値。 |
srcaddr | read_only_udm.principal.ip | 未加工ログ フィールド srcaddr から抽出された値。 |
srcport | read_only_udm.principal.port | 未加工ログ フィールド srcport から抽出された値。 |
start_time | read_only_udm.about.resource.attribute.labels.value | 未加工ログ フィールド start_time から抽出された値。 |
start_time | read_only_udm.metadata.event_timestamp | 未加工ログ フィールド start_time から抽出された値。 |
SubnetID | read_only_udm.about.resource.attribute.labels.value | 未加工ログ フィールド SubnetID から抽出された値。 |
tcp_flags | read_only_udm.about.resource.attribute.labels.value | 未加工ログ フィールド tcp_flags から抽出された値。 |
traffic_path | read_only_udm.about.resource.attribute.labels.value | 未加工ログ フィールド traffic_path から抽出された値。 |
version | read_only_udm.metadata.product_version | 未加工ログ フィールド version から抽出された値。 |
vpcID | read_only_udm.principal.cloud.vpc.id | 未加工ログ フィールド vpcID から抽出された値。 |
read_only_udm.metadata.vendor_name | AMAZON にハードコードされています。 |
|
read_only_udm.metadata.product_name | AWS VPC Flow にハードコードされています。 |
|
read_only_udm.metadata.log_type | AWS_VPC_FLOW にハードコードされています。 |
|
read_only_udm.metadata.event_type | dstaddr が空でない場合は NETWORK_CONNECTION にマッピングされ、それ以外の場合は GENERIC_EVENT にマッピングされます。 |
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。