AWS VPC Flow Logs を収集する
パーサーのバージョン: 17.0
このドキュメントでは、Amazon S3(テキスト形式)、Kinesis Data Firehose を使用した Amazon CloudWatch Logs、Amazon S3 の CSV 形式の 3 つの方法を使用して、AWS VPC Flow Logs を Google Security Operations に取り込む方法について説明します。AWS VPC Flow Logs は、VPC 内のネットワーク インターフェースを経由する IP トラフィックに関する情報を取得できる機能です。この統合により、これらのログを Google SecOps に送信して分析とモニタリングを行うことができます。
サポートされている AWS VPC Flow Logs の形式
Google SecOps は、次の 2 つの主要なテキスト形式で AWS VPC フローログの取り込みをサポートしています。
- 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 フローログのエクスポートを構成する
次のセクションでは、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] をクリックします。
- 次の構成情報を指定します。
- フィルタ: ポリシーに応じて [すべて](または [承認] / [不承認])を選択します。
- 最大集計間隔: [1 分](推奨)または [10 分] を選択します。
- 宛先: [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: 必要に応じて削除オプションを選択します。
- Maximum File Age: デフォルトは 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] > [Create delivery stream] に移動します。
- 次の構成情報を指定します。
- ソース: [直接 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 フィードで生成された秘密鍵を入力します(これは
- [Create delivery stream] をクリックします。
CloudWatch Logs グループを Firehose ストリームに登録する
- [CloudWatch] > [ログ] > [ロググループ] に移動します。
- ターゲット ロググループ(
/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 Logs のカスタム形式で選択したフィールド(正規の 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: 必要に応じて削除オプションを選択します。
- Maximum File Age: デフォルトは 180 日です。
- アクセスキー ID: S3 バケットにアクセスできるユーザー アクセスキー。
- シークレット アクセスキー: S3 バケットにアクセスできるユーザーのシークレット キー。
- アセットの名前空間: アセットの名前空間。
- Ingestion labels: このフィードのイベントに適用されるラベル。
- S3 URI: S3 バケットのアドレス(例:
- [次へ] をクリックします。
- [Finalize] 画面で新しいフィードの設定を確認し、[送信] をクリックします。
UDM マッピング テーブル
| ログのサンプル | ログフィールド | UDM マッピング |
|---|---|---|
"entries: {
data: ""7,11111111111,eni-11aa1a1a1a1aa1a,1.1.1.1,2.2.2.2,51256,16020,6,14,3881,1723542839,1723542871,ACCEPT,OK,vpc-1aa1a1a1a1aa1aa,subnet-1aa1a1a1a1aa1a1,i-1aa1a1a1a1aa1a,0,IPv4,1.1.1.1,2.2.2.2,ap-northeast-1,masked_zone,-,-,-,-,ingress,,-,-,-,-,-,-,-,-,-,-""
collection_time: {
seconds: 1741159282
nanos: 254633949
}
}" |
7 |
metadata.product_version |
11111111111 |
metadata.product_log_id |
|
eni-11aa1a1a1a1aa1a |
principal.user.product_object_id |
|
1.1.1.1 |
principal.ip |
|
2.2.2.2 |
target.ip |
|
51256 |
principal.port |
|
16020 |
target.port |
|
6 |
network.ip_protocol |
|
14 |
network.sent_packets |
|
3881 |
network.received_bytes |
|
1723542839 |
metadata.event_timestamp about.resource.attribute.labels(start_time) |
|
1723542871 |
metadata.ingested_timestamp about.resource.attribute.labels(end_time) |
|
ACCEPT |
security_result.action security_result.action_details |
|
OK |
about.resource.attribute.labels (log-status) |
|
vpc-1aa1a1a1a1aa1a |
principal.resource.attribute.labels (vpcID) |
|
subnet-a1a1a1a1a1 |
principal.asset_id |
|
i-1aa1a1a1a1aa1a |
principal.resource_ancestors.product_object_id |
|
0 |
about.resource.attribute.labels (type) |
|
IPv4 |
additional.fields (pkt-srcaddr-ip) |
|
1.1.1.1 |
intermediary.ip |
|
2.2.2.2 |
additional.fields (tcp_flags) |
|
ap-northeast-1 |
not getting mapped |
|
masked_zone |
not getting mapped |
|
- |
about.resource.attribute.labels (sublocation_type) |
|
- |
about.resource.attribute.labels (sublocation_id) |
|
- |
about.resource.attribute.labels (pkt_src_aws_service) |
|
- |
about.resource.attribute.labels (pkt_dst_aws_service) |
|
ingress |
network.direction |
|
|
additional.fields (traffic_path) |
|
- |
not getting mapped |
|
- |
not getting mapped- |
|
"entries: {
data: ""7,11111111111,eni-11aa1a1a1a1aa1a,5.5.5.5,2.2.2.2,53102,16020,6,8,2112,1723542839,1723542871,ACCEPT,OK,vpc-1aa1a1a1a1aa1a,subnet-1aa1a1a1a1aa1a,i-1aa1a1a1a1aa1a,0,IPv4,5.5.5.5,2.2.2.2,ap-northeast-1,masked_zone,-,-,-,-,ingress,,-,-,-,-,-,-,-,-,-,-""
collection_time: {
seconds: 1741159390
nanos: 374934225
}
}" |
7 |
metadata.product_version |
11111111111 |
metadata.product_log_id |
|
eni-11aa1a1a1a1aa1a |
principal.user.product_object_id |
|
5.5.5.5 |
principal.ip |
|
2.2.2.2 |
target.ip |
|
53102 |
principal.port |
|
16020 |
target.port |
|
6 |
network.ip_protocol |
|
8 |
network.sent_packets |
|
2112 |
network.received_bytes |
|
1723542839 |
metadata.event_timestamp about.resource.attribute.labels(start_time) |
|
1723542871 |
metadata.ingested_timestamp about.resource.attribute.labels(end_time) |
|
ACCEPT |
security_result.action security_result.action_details |
|
OK |
about.resource.attribute.labels (log-status) |
|
vpc-1aa1a1a1a1aa1a |
principal.resource.attribute.labels (vpcID) |
|
subnet-1aa1a1a1a1aa1a |
principal.asset_id |
|
i-1aa1a1a1a1aa1a |
principal.resource_ancestors.product_object_id |
|
0 |
about.resource.attribute.labels (type) |
|
IPv4 |
additional.fields (pkt-srcaddr-ip) |
|
5.5.5.5 |
intermediary.ip |
|
2.2.2.2 |
additional.fields (tcp_flags) |
|
ap-northeast-1 |
not getting mapped |
|
masked_zone |
not getting mapped |
|
- |
about.resource.attribute.labels (sublocation_type) |
|
- |
about.resource.attribute.labels (sublocation_id) |
|
- |
about.resource.attribute.labels (pkt_src_aws_service) |
|
- |
about.resource.attribute.labels (pkt_dst_aws_service) |
|
ingress |
network.direction |
|
|
additional.fields (traffic_path) |
|
- |
not getting mapped |
|
- |
not getting mapped1 |
|
"entries: {
data: ""7,11111111111,eni-11aa1a1a1a1aa1a,1.1.2.2,1.1.2.1,36358,42659,6,1091,3.754327e+06,1747981553,1747981582,ACCEPT,OK,vpc-1aa1a1a1a1aa1a,subnet-1aa1a1a1a1aa1a,i-1aa1a1a1a1aa1a,0,IPv4,1.1.2.2,1.1.2.1,ap-northeast-1,apne1-az1,-,-,-,-,egress,1,-,-,-,-,-,-,-,-,-,-,604249""
collection_time: {
seconds: 1748238552
nanos: 479960397
}
}" |
7 |
metadata.product_version |
11111111111 |
metadata.product_log_id |
|
eni-11aa1a1a1a1aa1a |
about.resource.attribute.labels |
|
1.1.2.2 |
principal.ip |
|
1.1.2.1 |
target.ip |
|
36358 |
principal.port |
|
42659 |
target.port |
|
6 |
network.ip_protocol |
|
1091 |
network.sent_packets |
|
3.75E+06 |
network.sent_bytes |
|
1747981553 |
metadata.event_timestamp about.resource.attribute.labels(start_time) |
|
1747981582 |
metadata.ingested_timestamp about.resource.attribute.labels(end_time) |
|
ACCEPT |
security_result.action security_result.action_details |
|
OK |
about.resource.attribute.labels (log-status) |
|
vpc-1aa1a1a1a1aa1a |
principal.resource.attribute.labels (vpcID) |
|
subnet-1aa1a1a1a1aa1a |
principal.asset_id |
|
i-1aa1a1a1a1aa1a |
principal.resource_ancestors.product_object_id |
|
0 |
additional.fields (tcp_flags) |
|
IPv4 |
about.resource.attribute.labels(type) |
|
1.1.2.2 |
"additional.fields (pkt-srcaddr-ip)条件: if [pkt_dstaddr_ip] != [dstaddr] will map to intermediary.ip" |
|
1.1.2.1 |
"additional.fields (pkt-dstaddr-ip)条件: if [pkt_srcaddr_ip] != [srcaddr] will map to intermediary.ip" |
|
ap-northeast-1 |
principal.location.country_or_region |
|
apne1-az1 |
principal.location.name |
|
- |
about.resource.attribute.labels (sublocation_type) |
|
- |
about.resource.attribute.labels (sublocation_id) |
|
- |
about.resource.attribute.labels (pkt_src_aws_service) |
|
- |
about.resource.attribute.labels (pkt_dst_aws_service) |
|
egress |
network.direction |
|
1 |
additional.fields (traffic_path) |
|
- |
not getting mapped |
|
604249 |
not getting mapped |
|
Connection_info.Tcp_flags |
additional.fields |
|
connection_info.tcp_flags |
additional.fields |
|
Dst_endpoint.Interface_uid |
target.user.product_object_id |
|
Log_status |
additional.fields |
|
Src_endpoint.Instance_uid |
principal.user.product_object_id |
|
Tcp_flags |
additional.fields |
|
tcp_flags |
additional.fields |
|
tgw_dst_az_id |
target.resource.attribute.cloud.availability_zone |
|
tgw_id |
target.resource.product_object_id |
|
tgw_src_az_id |
principal.location.name |
|
Traffic_Bytes |
network.sent_bytes |
|
Traffic_Packets |
network.sent_packets |
リリースの差分
Google SecOps は、AWS VPC Flow Logs パーサーのバージョン 16.0 をリリースしました。これには、Parser_Name ログフィールドの UDM フィールドへのマッピングと、イベントタイプのマッピングに大幅な変更が含まれています。
ログフィールド マッピングの差分
| ログフィールド | 古いマッピング | 現在のマッピング |
|---|---|---|
bytes |
network.sent_bytes |
Removed |
Connection_info.Tcp_flags |
network.dhcp.flags |
additional.fields |
connection_info.tcp_flags |
network.dhcp.flags |
additional.fields |
Dst_endpoint.Interface_uid |
additional.fields |
target.user.product_object_id |
flow_direction |
about.resource.attribute.labels |
Removed |
Log_status |
about.resource.attribute.labels |
additional.fields |
Src_endpoint.Instance_uid |
additional.fields |
principal.user.product_object_id |
Tcp_flags |
network.dhcp.flags |
additional.fields |
tcp_flags |
network.dhcp.flags |
additional.fields |
tgw_dst_az_id |
target.resource.attribute.labels |
target.resource.attribute.cloud.availability_zone |
tgw_id |
additional.fields |
target.resource.product_object_id |
tgw_src_az_id |
principal.resource.attribute.labels |
principal.location.name |
Traffic_Bytes |
additional.fields |
network.sent_bytes |
Traffic_Packets |
additional.fields |
network.sent_packets |
イベントタイプ マッピングの差分
汎用的に分類されていた複数のイベントが、意味のあるイベントタイプで適切に分類されるようになりました。
| イベントタイプ | ログのフィールド | 理由 |
|---|---|---|
| FILE_UNCATEGORIZED | Bytes |
この PR で新たに処理され、適切な特定のイベントタイプにマッピングされます。 |
| NETWORK_CONNECTION | protocol |
この PR で新たに処理され、適切な特定のイベントタイプにマッピングされます |
| NETWORK_UNCATEGORIZED | Class_name |
この PR で新たに処理され、適切な特定のイベントタイプにマッピングされます |
| NETWORK_UNCATEGORIZED | flow_direction |
この PR で新たに処理され、適切な特定のイベントタイプにマッピングされます |
| STATUS_UPDATE | [src_endpoint][ip] |
この PR で新たに対応し、適切な特定のイベントタイプにマッピング |
変更ログ
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。