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 のコンソール画面を開き、「ロール」を選択する。

IAM のコンソール画面
IAM のコンソール画面

「ロールを作成」を選択する。

IAM ロールのコンソール画面
IAM ロールのコンソール画面

「信頼されたエンティティタイプ」では「AWS のサービス」、「ユースケース」では「EC2」を選択して、「次へ」を選択する。

「信頼されたエンティティを選択」の画面
「信頼されたエンティティを選択」の画面

「許可を設定」では、何も設定せずに「次へ」を選択する。 許可(権限)は後続の手順で設定する。

「許可を設定」の画面

「許可を設定」の画面
「許可を設定」の画面

「名前、確認、および作成」では「ロール名」(ここでは「network-demo-role」)のみ設定して、「ロールを作成」を選択する。 信頼されたエンティティは後続の手順で設定する。

「名前、確認、および作成」の画面

「名前、確認、および作成」の画面
「名前、確認、および作成」の画面

IAM ロールの作成が正常終了したことを確認する。 今回作成したロール(ここでは「network-demo-role」)を選択して、詳細画面を開く。

IAM ロールの作成完了画面
IAM ロールの作成完了画面

今回作成した IAM ロールに CloudWatch Logs にログを発行するための権限を設定する。 「アクセス許可を追加」のプルダウンメニューを開き、「インラインポリシーを作成」を選択する。

IAM ロールの「許可ポリシー」の画面
IAM ロールの「許可ポリシー」の画面

「ポリシーの作成」で「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」)が表示されていることを確認する。

IAM ロールの「許可ポリシー」の画面
IAM ロールの「許可ポリシー」の画面

「信頼関係」タブを選択して、「信頼ポリシーを編集」を選択する。

IAM ロールの「信頼関係」の画面
IAM ロールの「信頼関係」の画面

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 のコンソール画面を開く。 左側メニューで「ログ」を開き、「ロググループ」を選択する。

CloudWatch のコンソール画面
CloudWatch のコンソール画面

「ロググループ」で「ロググループを作成」を選択する。

ロググループの画面
ロググループの画面

「ロググループの詳細」で「ロググループ名」(ここでは、「network-demo-log-group」)を設定し、「作成」を選択する。

「ロググループを作成」の画面
「ロググループを作成」の画面

ロググループの作成が正常終了したことを確認する。

ロググループの作成完了画面
ロググループ の作成完了画面

フローログを作成する

フローログは VPC、サブネット、特定のネットワークインターフェースに対して作成できるが、ここでは最も取得範囲の広い VPC に対して作成する。

VPC のコンソール画面を開き、フローログを設定したい VPC(ここでは、「network-demo-vpc」)の詳細画面を開く。 「フローログ」のタブを選択して、「フローログを作成」を選択する。

VPC の「フローログ」の画面
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}

フィールド 説明
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 内の脅威の検知を行う。

参考文献