CloudWatch Logsを使用して、VPCフローログを覗いてみよう
VPCフローログとは
VPC内にあるネットワークインターフェイスの通信の記録。
IPアドレス、プロトコル、ポート番号、通信結果などのフィールドで成り立ち、まとめてフローログレコードと呼ぶ。
ネットワークインターフェイスの通信状態などをVPCのネットワークの流れから分析することが可能。
通信に障害があった場合に原因を分析したり、通信先や送信元の分析などに使用。
ログを取得することにより、スループットやレイテンシーなどネットワークのパフォーマンスに影響が出ることはない。
用語 | 意味 |
---|---|
ENI | Elastic Network interfaceの略。物理サーバーだとNICにあたる。 IPアドレスを付与することができるようになる。インスタンスにアタッチしている部分。 |
フローログの送信先
取得する目的に合わせ、リソースや発行元を決定。
ログの送信先 | CloudWatchLogs、S3、Kinesis Data Firehoseのどれか。 |
フローログの設定
以下の手順で設定。
- フローログを発行するためにCloudWatchへアクセスするためのIAMロールを作成。
- Cloudwatch Logsでロググループを作成。
- VPCでフローログを設定。
- 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とセキュリティグループについて深く理解。
Discussion