🏄🏾‍♂️

CloudWatch Logsを使用して、VPCフローログを覗いてみよう

2023/04/19に公開

VPCフローログとは

VPC内にあるネットワークインターフェイスの通信の記録。
IPアドレス、プロトコル、ポート番号、通信結果などのフィールドで成り立ち、まとめてフローログレコードと呼ぶ。
ネットワークインターフェイスの通信状態などをVPCのネットワークの流れから分析することが可能。
通信に障害があった場合に原因を分析したり、通信先や送信元の分析などに使用。
ログを取得することにより、スループットやレイテンシーなどネットワークのパフォーマンスに影響が出ることはない。

用語 意味
ENI Elastic Network interfaceの略。物理サーバーだとNICにあたる。
IPアドレスを付与することができるようになる。インスタンスにアタッチしている部分。

フローログの送信先

取得する目的に合わせ、リソースや発行元を決定。

ログの送信先 CloudWatchLogs、S3、Kinesis Data Firehoseのどれか。

フローログの設定

以下の手順で設定。

  1. フローログを発行するためにCloudWatchへアクセスするためのIAMロールを作成。
  2. Cloudwatch Logsでロググループを作成。
  3. VPCでフローログを設定。
  4. IAMロールの信頼ポリシーを修正。

1. IAMロールの作成

IAMポリシーで「ポリシーの作成」を選択。

ポリシーの作成でJSONタブを選択し、以下のポリシーを入力。
もしくは、ビジュアルエディタでインラインポリシーを選択することも可能。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogGroups",
        "logs:DescribeLogStreams"
      ],
      "Resource": "*"
    }
  ]
}   

任意のタグを作成。

作成したポリシーへ命名し、完成。

IAMロールへ移動し、「ロールを作成」を選択。

カスタム信頼ポリシーを選択し、以下のポリシーを入力。
Conditionセクションで追加し、ログを発行するアカウントを指定。
ArnLikeは一旦ワイルドカードを使用し、フローログ設定後にIDを入力。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": {
                "Service": "vpc-flow-logs.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {                 #Conditionから下のブロックを追加することで、生成するログのアカウントを指定することができる。
                "StringEquals": {                                                         
                    "aws:SourceAccount": "アカウントID"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:ec2:リージョン:アカウントID:vpc-flow-log/*"
                }
            }
        }
    ]
}

前述で作成したポリシーを追加。

作成したロールに命名し、完成。

2. CloudWatch Logsでロググループを作成

CloudWatchのロググループへ移動し、「ロググループを作成」を選択。

グループに命名し、任意の保持期間を選択。

ロググループが完成。

3. VPCフローログの設定

フローログを設定するVPCを選択。
フローログタブを開き、「フローログを作成」を選択。


以下の内容で設定。

設定項目 内容
名前 任意のフローログ名。
フィルター アクセスの許可(ACCEPT)、拒否(REJECT)、両方から選択。ログには"action"として表示。
最大集計期間 10分か1分で選べる。1分の方がログを出力するまでの時間が短いため、すぐに確認する必要がある場合に使用。
送信先 CloudWatchLogs。
送信先ロググループ 前述のロググループ。
IAMロール 前述のIAMロール。
ログレコードの形式 デフォルトかカスタムを選択。カスタムは選択した順番がログに反映される。形式のプレビューで順番を確認可能。

VPCフローログが完成。

4. IAMロールの修正

前述で作成したIAMロールの信頼関係タブを開き、「信頼ポリシーを編集」を選択。
ArnLikeのワイルドカードを作成したフローログIDに差し替え。

フローログの閲覧

フローログは、CloudWatchサービスのLogs Insightsを使用することで検索が可能。

Logs Insightsの使用

クエリ構文を用いて、ログを分析。個別のログを開くとフィールド名と値のセットで閲覧可能。

クエリ構文の例

許可したUDP通信のログを100件抽出。

fields @timestamp, @message 
| sort @timestamp desc.              
| filter protocol=17 and action='ACCEPT'
| limit 100
用語 意味
fields 入力したフィールドの値を出力。
timestamp 到達時刻。ログを取り込んだ時刻。
message ログの内容。
sort 並べ方
desc 降順。ascは昇順。
filter フィルターをかけるフィールドと値を指定。
複数の条件を指定する場合は、and(合わせて)やor(もしくは)で繋ぐ。
limit 出力するログ数の上限。

フローログを覗いてみよう

構成図

セキュリティーグループ

ルール プロトコル ポート ソース
インバウンド HTTP 80 Anywhere IPv4
アウトバウンド すべてのトラフィック すべて Anywhere IPv4

EC2

プライベートIPアドレス ネットワークインターフェイス
10.0.10.30 eni-0322957cfa6bc9585

フローログレコード

取得フィールド

デフォルトのフィールドで設定。

${version} ${account-id} ${interface-id} ${srcaddr} ${dstaddr} ${srcport} ${dstport} ${protocol}
 ${packets} ${bytes} ${pkt-srcaddr} ${pkt-src-aws-service} ${pkt-dstaddr} ${pkt-dst-aws-service} 
${start} ${end} ${log-status}
フィールド 意味
accountId ソースネットワークインターフェースの所有者のアカウント。
action ACCEPT:許可された通信。
REJECT :拒否された通信。
bytes 転送されたバイト数。
dstAddr 送信先のIPアドレス。
dstPort 送信先のポート。
end 最後のパケットが受信された時間(UNIX秒)。
UNIX秒: 協定世界時1970年1月1日午前0時からの経過秒数。UNIX秒計算サイト
interfaceId 通信の記録がされるネットワークインターフェース。
logStatus ログの状態。
OK:正常に記録
NODATA:ネットワークインターフェイスとの通信なし。
SKIPDATA : キャパシティー制限やエラーの原因により記録がスキップされた。
packets 転送されたパケットの数。
パケット: 転送する際に、特定の長さで細かく分割したデータ。送信先で組み合わせる。
protocol トラフィックの IANA プロトコル番号。
srcAddr 送信元のIPアドレス。
srcPort 送信元のポート。
start 最初のパケットが受信された時間(UNIX秒)。
version フローログのバージョン。 デフォルトは2。

セキュリティーグループのインバウンドルールを全て削除

  • 自宅PC(xxx.xxx.xxx.xxx)からのリクエストは拒否。
    リクエストの段階で拒否されているため、レスポンスは発生せず。

ログ出力

2023-02-14T05:30:47.000+09:00
2 123456789012 eni-0322957cfa6bc9585 xxx.xxx.xxx.xxx 10.0.10.30 50611 80 6 11 688 1676320247 1676320367 REJECT OK

フロー

IPアドレス xxx.xxx.xxx.xxx のポート 50611 番から、ネットワークインターフェイス eni-0322957cfa6bc9585 のIPアドレス 10.0.10.30 のポート 80 番あてに HTTP 通信あり、セキュリティグループの設定によりアクセス 拒否
この通信は 2023年02月14日05:30:47 に受信開始 2023年02月14日05:32:47 に受信終了。 588バイト11パケット の通信。

Version accountId interfaceId srcAddr dstAddr srcPort dstPort protocol packets bytes start end action logStatus
2 123456789012 eni-0322957cfa6bc9585 xxx.xxx.xxx.xxx 10.0.10.30 50611 80 6 (HTTP) 11 688 1676320247 1676320367 REJECT OK

  • セキュリティグループがステートフルのため、EC2から発信されたUDP通信はレスポンスも許可。

ログ出力

2023-02-14T05:30:47.000+09:00
2 123456789012 eni-0322957cfa6bc9585 82.209.245.153 10.0.10.30 123 35612 17 1 76 1676320247 1676320307 ACCEPT OK

2023-02-14T05:30:47.000+09:00
2 123456789012 eni-0322957cfa6bc9585 10.0.10.30 82.209.245.153 35612 123 17 1 76 1676320247 1676320307 ACCEPT OK

フロー

ネットワークインターフェイス eni-0322957cfa6bc9585 のIPアドレス 10.0.10.30 のポート 35612 番から、IPアドレス 82.209.245.153 のポート 123 番あてにリクエストの UDP 通信あり、セキュリティグループの設定により発信を 許可
この通信は 2023年02月14日05:30:47 に受信開始 2023年02月14日05:31:47 に受信終了。 76バイト1パケット の通信。

IPアドレス 82.209.245.153 のポート 123 番から、ネットワークインターフェイス eni-0322957cfa6bc9585 のIPアドレス 10.0.10.30 のポート 35612 番あてにレスポンスの UDP 通信あり、セキュリティグループの設定によりアクセス 許可
この通信は 2023年02月14日05:30:47 に受信開始 2023年02月14日05:31:47 に受信終了。 76バイト1パケット の通信。

Version accountId interfaceId srcAddr dstAddr srcPort dstPort protocol packets bytes start end action logStatus
2 123456789012 eni-0322957cfa6bc9585 10.0.10.30 82.209.245.153 35612 123 17 (UDP) 1 76 1676320247 1676320307 ACCEPT OK
2 123456789012 eni-0322957cfa6bc9585 82.209.245.153 10.0.10.30 123 35612 17 1 76 1676320247 1676320307 ACCEPT OK

インバウンドルールにHTTP(80,AnywhereIPv4)を追加

  • 自宅PCからのリクエストにWEBサーバーがレスポンスを発信。

ログ出力

2023-02-14T05:41:01.000+09:00
2 123456789012 eni-0322957cfa6bc9585 xxx.xxx.xxx.xxx 10.0.10.30 49203 80 6 9 1171 1676320861 1676320908 ACCEPT OK

2023-02-14T05:41:01.000+09:00
2 123456789012 eni-0322957cfa6bc9585 10.0.10.30 xxx.xxx.xxx.xxx 80 49203 6 9 5423 1676320861 1676320908 ACCEPT OK

フロー

IPアドレス xxx.xxx.xxx.xxx のポート 49203 番から、ネットワークインターフェイス eni-0322957cfa6bc9585 のIPアドレス 10.0.10.30 のポート 80 番あてにリクエストの HTTP 通信あり、セキュリティグループの設定によりアクセス 許可
この通信は 2023年02月14日05:41:01 に受信開始 2023年02月14日05:41:48 に受信終了。 1171バイト9パケット の通信。

ネットワークインターフェイス eni-0322957cfa6bc9585 のIPアドレス 10.0.10.30 のポート 80 番から、IPアドレス xxx.xxx.xxx.xxx のポート 49203 番あてにレスポンスの HTTP 通信あり、セキュリティグループの設定により発信を 許可
この通信は 2023年02月14日05:41:01 に受信開始 2023年02月14日05:41:48 に受信終了。 5423バイト9パケット の通信。

Version accountId interfaceId srcAddr dstAddr srcPort dstPort protocol packets bytes start end action logStatus
2 123456789012 eni-0322957cfa6bc9585 xxx.xxx.xxx.xxx 10.0.10.30 49203 80 6 9 1171 1676320861 1676320908 ACCEPT OK
2 123456789012 eni-0322957cfa6bc9585 10.0.10.30 xxx.xxx.xxx.xxx 80 49203 6 9 5423 1676320861 1676320908 ACCEPT OK

ACLのインバウンドルールを全て拒否

  • 自宅PCからのリクエストは拒否。
  • EC2からの通信はセキュリティグループのアウトバウンドが発信を許可しているが、レスポンスはACLがアクセス拒否。
    セキュリティーグループがステートフルでも通信が到達しないため受信不可。

ログ出力

2023-02-14T05:51:48.000+09:00
2 123456789012 eni-0322957cfa6bc9585 162.159.200.123 10.0.10.30 123 50392 17 1 76 1676321508 1676321568 REJECT OK

2023-02-14T05:51:48.000+09:00
2 123456789012 eni-0322957cfa6bc9585 10.0.10.30 162.159.200.123 50392 123 17 1 76 1676321508 1676321568 ACCEPT OK

フロー

ネットワークインターフェイス eni-0322957cfa6bc9585 のIPアドレス 10.0.10.30 のポート 50392 番から、IPアドレス 162.159.200.123 のポート 123 番あてにリクエストの UDP 通信あり、セキュリティグループの設定により発信を 許可
この通信は 2023年02月14日05:51:48 に受信開始 2023年02月14日05:52:48 に受信終了。 76バイト1パケット の通信。

IPアドレス 162.159.200.123 のポート 123 番から、ネットワークインターフェイス eni-0322957cfa6bc9585 のIPアドレス 10.0.10.30 のポート 50392 番あてにレスポンスの UDP 通信あり、ACLの設定によりアクセス 拒否
この通信は 2023年02月14日05:51:48 に受信開始 2023年02月14日05:52:48 に受信終了。 76バイト1パケット の通信。

Version accountId interfaceId srcAddr dstAddr srcPort dstPort protocol packets bytes start end action logStatus
2 123456789012 eni-0322957cfa6bc9585 10.0.10.30 162.159.200.123 50392 123 17 1 76 1676321508 1676321568 ACCEPT OK
2 123456789012 eni-0322957cfa6bc9585 162.159.200.123 10.0.10.30 123 50392 17 1 76 1676321508 1676321568 REJECT OK

ルートテーブルからインターネットゲートウェイをデタッチ

  • インターネットゲートウェイをデタッチすると、インスタンスは発信を停止。
    ログは外部からインスタンスへの通信のみで、全て拒否。

ログ出力

2023-02-14T06:01:54.000+09:00
2 123456789012 eni-0322957cfa6bc9585 xxx.xxx.xxx.xxx 10.0.10.30 50859 80 6 9 576 1676322114 1676322169 REJECT OK

フロー

IPアドレス 27.138.93.252 のポート 50859 番から、ネットワークインターフェイス eni-0322957cfa6bc9585 のIPアドレス 10.0.10.30 のポート 80 番あてに HTTP 通信あり、ルートテーブルの設定によりアクセス 拒否
この通信は 2023年02月14日06:01:54 に受信開始 2023年02月14日06:02:49 に受信終了。 576バイト9パケット の通信。

Version accountId interfaceId srcAddr dstAddr srcPort dstPort protocol packets bytes start end action logStatus
2 123456789012 eni-0322957cfa6bc9585 xxx.xxx.xxx.xxx 10.0.10.30 50859 80 6 9 576 1676322114 1676322169 REJECT OK

まとめ

VPCで行われている通信の状況だけでなく通信の一連の流れまで見ることができた。
ステートレス、ステートフルの通信状況をログで確認することで、ACLとセキュリティグループについて深く理解。

GitHubで編集を提案

Discussion