VPC Flow Logs で取得したフローログを CloudWatch Logs に発行する
はじめに
VPC Flow Logs で取得したフローログを CloudWatch Logs に発行する方法についてまとめる。
VPC Flow Logs とは
VPC のネットワークインターフェース(≒ ENI)との間で行き来する IP トラフィックに関する情報をキャプチャしてログに記録する機能であり、取得したデータは CloudWatch Logs または S3 に発行できる。 フローログはネットワークトラフィックのパスの外で収集されるため、ネットワークのスループットやレイテンシーに影響を与えることなく取得できる。
フローログは VPC、サブネット、特定の ENI に対して作成できる。 ログのキャプチャレベルは下記のいずれかが設定できる。
ここからの作業の前提
- AWS マネジメントコンソールから手動で作業を進める。
- AdministratorAccess 権限を持つ IAM ユーザにて作業を行う。この作業では VPC、IAM、CloudWatch Logs の操作を行うため、必要な権限を持つ IAM ユーザで作業を行う必要がある。
- 東京リージョンで作業を行う。
フローログを CloudWatch Logs に発行する
「CloudWatch Logs へのフローログの発行」を参考に取得方法を見ていく。
準備
準備として下記の作業を行う。
- IAM ロールの作成
- CloudWatch Logs のロググループの作成
IAM ロールの作成
VPC Flow Logs にフローログを CloudWatch Logs に発行するための権限を与える必要がある。
IAM のコンソール画面を開き、「ロール」を選択する。
「ロールを作成」を選択する。
「信頼されたエンティティタイプ」では「AWS のサービス」、「ユースケース」では「EC2」を選択して、「次へ」を選択する。
「許可を設定」では、何も設定せずに「次へ」を選択する。 許可(権限)は後続の手順で設定する。
「名前、確認、および作成」では「ロール名」(ここでは「network-demo-role」)のみ設定して、「ロールを作成」を選択する。 信頼されたエンティティは後続の手順で設定する。
IAM ロールの作成が正常終了したことを確認する。 今回作成したロール(ここでは「network-demo-role」)を選択して、詳細画面を開く。
今回作成した IAM ロールに CloudWatch Logs にログを発行するための権限を設定する。 「アクセス許可を追加」のプルダウンメニューを開き、「インラインポリシーを作成」を選択する。
「ポリシーの作成」で「JSON」タブを選択する。 CloudWatch Logs にログを発行するための最小の権限は下記の通り。 これをコピー&ペーストして、「ポリシーの確認」を選択する。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "logs:DescribeLogGroups", "logs:DescribeLogStreams" ], "Resource": "*" } ] }
「ポリシーの確認」では「名前」(ここでは「network-demo-cloudwatch-logs-policy」)を設定し、「概要」に表示されている権限に問題がないことを確認して、「ポリシーの作成」を選択する。
「許可ポリシー」に今回作成したポリシー(ここでは「network-demo-cloudwatch-logs-policy」)が表示されていることを確認する。
「信頼関係」タブを選択して、「信頼ポリシーを編集」を選択する。
VPC Flow Logs に信頼ポリシー(IAM ロールを Assume するための権限)を付与する。 下記をコピー&ペーストして、「ポリシーを更新」を選択する(「Service」の値が差分)。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "vpc-flow-logs.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
CloudWatch Logs のロググループの作成
ログの送付先となる CloudWatch Logs のロググループを作成する。 なお、ログストリームはネットワークインターフェースごとに自動で作成される。
CloudWatch のコンソール画面を開く。 左側メニューで「ログ」を開き、「ロググループ」を選択する。
「ロググループ」で「ロググループを作成」を選択する。
「ロググループの詳細」で「ロググループ名」(ここでは、「network-demo-log-group」)を設定し、「作成」を選択する。
ロググループの作成が正常終了したことを確認する。
フローログを作成する
フローログは VPC、サブネット、特定のネットワークインターフェースに対して作成できるが、ここでは最も取得範囲の広い VPC に対して作成する。
VPC のコンソール画面を開き、フローログを設定したい VPC(ここでは、「network-demo-vpc」)の詳細画面を開く。 「フローログ」のタブを選択して、「フローログを作成」を選択する。
「フローログを作成」の画面に遷移する。
この画面での設定項目と説明、今回の設定値を下記にまとめる。 設定値の入力完了後に、「フローログを作成」を選択する。
設定項目 | 説明 | 設定値 |
---|---|---|
名前 | フローログの名前を設定する。オプション設定 | network-demo-flow-log-vpc |
フィルタ | キャプチャするトラフィックのタイプを設定する。「承諾(ACCEPT)」「却下(REJECT)」「すべて(ACCEPT と REJECT の両方)」から選択する | すべて |
最大集約間隔 | パケットのフローがキャプチャされてからフローログレコードに集約されるまでの間隔の最大時間。「10分間」「1分間」から設定する | 10分間 |
送信先 | フローログデータを公開する宛先。「CloudWatch Logs に送信」「Amazon S3 バケットに送信」から選択する | CloudWatch Logs に送信 |
送信先ロググループ | フローログデータが発行される CloudWatch Logs ロググループの名前を選択する。新しいログストリームは、モニタリングされている各ネットワークインターフェース(ENI)に対して作成される | network-demo-log-group |
IAM ロール | CloudWatch ロググループに発行するアクセス許可を持つ IAM ロールを選択する | network-demo-role |
ログレコードの形式 | フローログレコードに含めるフィールドを指定する。「AWS のデフォルト形式」「カスタム形式」から選択する | AWS のデフォルト形式 |
フローログの作成が正常終了したことを確認する。
ログの確認
VPC 内に EC2 インスタンスを作成し、そのインスタンスと通信した後に最大集約間隔として設定した10分程度待つと、CloudWatch Logs に下記のようなフローログが記録される(アカウント ID と VPC に設定した CIDR ブロック以外の IP アドレスを念のためマスクしている)。
EC2 インスタンスに SSH(#22/TCP)で接続した際に記録されたフローログは下記の通り。 なお、AWS アカウント ID と接続元 IP アドレスは置き換えをしている。
2 123456789012 eni-03f3d84b79d1edb78 10.0.22.65 aaa.bbb.ccc.ddd 22 53443 6 44 6253 1647819365 1647819419 ACCEPT OK
VPC Flow Logs に関する補足事項
フローログレコード
- フローログに記録されるレコードは AWS のデフォルト形式で下記が設定される。カスタマイズも可能。
${version} ${account-id} ${interface-id} ${srcaddr} ${dstaddr} ${srcport} ${dstport} ${protocol} ${packets} ${bytes} ${start} ${end} ${action} ${log-status}
- 各フィールドの説明は下記の通り(参考:「VPC フローログを使用した IP トラフィックのロギング」)。
フィールド | 説明 |
---|---|
version | VPC フローログバージョン。デフォルト形式では2が設定され、カスタム形式の場合は最も高いバージョンが設定される |
account-id | トラフィックが記録されるネットワークインターフェイスの所有者の AWS アカウント ID |
interface-id | トラフィックが記録されるネットワークインターフェイスの ID |
srcaddr | 受信トラフィックの送信元の アドレスか、ネットワークインターフェイスにおける送信トラフィックのネットワークインターフェイスの IPv4 または IPv6 アドレス |
dstaddr | 送信トラフィックの送信先アドレスか、ネットワークインターフェイスにおける受信トラフィックのネットワークインターフェイスの IPv4 または IPv6 アドレス |
srcport | トラフィックの送信元ポート |
dstport | トラフィックの送信先ポート |
protocol | トラフィックの IANA プロトコル番号 |
packets | フロー中に転送されたパケットの数 |
bytes | フロー中に転送されたバイト数 |
start | 集約間隔内にフローの最初のパケットが受信された時間(UNIX 秒) |
end | 集約間隔内にフローの最後のパケットが受信された時間(UNIX 秒) |
action | トラフィックに関連付けられたアクション。「ACCEPT(承諾)」「REJECT(拒否)」のいずれか |
log-status | フローログのロギングステータス。「OK(送信先に正常に記録された)」「NODATA(集約間隔内に通信がなかった)」「SKIPDATA(集約間隔内に何らかの問題があり一部のログがスキップされた。)」 |
最大集約間隔
- 最大集約間隔は「10分間」または「1分間」のいずれかが設定できる。
- 「最大」という表現はログの取得とログの発行に時間がかかるため。実際には下記の時間を目安にベストエフォートで配信される。
- CloudWatch Logs: 5分
- S3: 10分
- Nitro ベースのインスタンス(例:M5、C5、R5 など)のネットワークインターフェースの場合は、設定した最大集約間隔に関係なく常に1分以下となる。
フローログの活用
下記のような利用方法が考えられる。
- フローログを定常運用で定期的に監査して、自社サービスの利用の傾向(時間やアクセス数など)や不審なアクセスの有無などを調査する。
- CloudWatch Logs のメトリクスフィルタと CloudWatch Alarms を利用して、特定の条件を満たした場合にアラートを発報する。
- GuardDuty のインプットとして VPC 内の脅威の検知を行う。