VPC Flow Logsについて書いてみる

今回はAWSのVPCの機能の一つである VPC Flow Logs について書いてみます。
VPC Flow Logsを使う目的としては

  • ネットワークキャプチャ(ネットワークを流れるパケットを収集することができる)
  • 運用状況の把握やトラブル発生時の問題解決に役立つ

という点が挙げられます。
VPC Flow Logsは VPCの内部のトラフィックのログを取得できるサービスです。

VPC Flow Logsはさまざまな単位でログの取得が可能で、
VPC毎やサブネット毎、ENI毎にログを取得することも可能です。
またネットワークパフォーマンスに影響しないのも利点です。
今回はVPC Flow LogsのログをCloudWatch Logsに出力するパターンとS3に出力するパターンの2通りを説明します。

設定手順について

まずVPC FlowLogsを使うためには CloudWatch Logsへログを出力するために IAM Roleが必要になります。
下記にロール作成手順を貼ります。(ユースケースについては一旦EC2を選択して後で変更します)
とりあえずポリシーをアタッチしていないロールを作成します。

ロールの設定手順

次に上で作った空のロールにインラインポリシーを作成します。

インラインポリシーの内容については

公式ドキュメント https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/flow-logs-cwl.htmlにある フローログ発行のためのポリシー設定を貼ってください。

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

インラインポリシー作成手順

JSONタブで上のインラインポリシーを貼り付ける

これでVPC Flow Logs用のポリシー作成完了です。

次にロールの「信頼関係」タブから「信頼ポリシーの編集」をクリックしてServiceの項目を 「ec2.amazonaws.com」から「vpc-flow-logs.amazonaws.com」に変更してください(下の内容をコピペしても大丈夫です)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "vpc-flow-logs.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

これでロール関係の設定は一旦完了です。

ロググループを作成

次にVPC Flow Logs のログ送信先のCloudWatch ロググループを作成します。

次にVPCに移動して ログを取得したいVPCにチェックを入れて「フローログ」のタブから「フローログの作成」をクリックしてください

設定は下記の通り
送信先は 上で作成したCloudWatchLogsのロググループにする

ログ形式はカスタムにして全て選択する

これでフローログの作成は完了です。
試しにVPC内部のEC2にSSH接続してpingコマンドを飛ばしてみます。

その後、CloudWatch で [ログ] を選択し、フローログを含むロググループを選択します。ログストリームの項目を見るとログが取得できているのが確認できます。

内容はこんな感じです。

VPC Flow LogsをCloudWatch Logsに送信する処理はここまでです。

VPCフローログ関連削除手順

  1. VPCの  「フローログ」のタブから今回作成したフローログを削除
  2. CloudWatchのロググループから今回作成したロググループを削除
  3. ロールも削除して良い

次は VPC Flow Logsで取得したログをS3のバケットに保管&Athenaで検索してみる

まずログ保管用のS3バケットを作成してみる

S3バケットの「プロパティ」からARN情報をコピーする

先ほどと同じようにVPCに移動して、「フローログ」のタブから「フローログを作成」をクリック

今回は送信先を「Amazon S3バケットに送信」を選択して上で作成したバケットのARN情報を貼り付ける

これでフローログは作成完了。

ちなみにログ送信先として設定したS3のバケットポリシーを見てみると自動で
バケットポリシーが追加されているのがわかる

試しにまたpingコマンドを飛ばしてみる

s3に保管された VPC FlowLogsを調べるにはAthenaを使ってみます
しかしAthenaの設定は面倒臭い。
そこで VPC FlowLogsを作成した際のページ上側に出てくる「統合オプションを調べる」をクリックする
これを使えば S3に保管されているVPC Flow LogsのログとAthenaの連携まで設定したCloudFormationテンプレートを作成することができます。

統合テンプレートを下記のような設定項目で作成してみる
今回はクエリ結果保存用のS3バケットとCloudFormationテンプレートのs3バケットを同じものを指定する

Athena統合テンプレートがS3バケットで作成完了されたら(下はS3のバケットの中身)

次に画面右上の「CloudFormationスタックの作成」をクリック

スタック作成画面Step1
テンプレートソースとして上で作成したテンプレートファイルを指定する

スタック作成画面Step2(スタックの名前を設定)

スタック作成画面Step3

STEP4は省略。

しばらくするとCloudFormationスタックが作成されているのが確認できる

次に「Athena」で検索してAthenaのページに移動
クエリエディタのワークグループからCloudFormationテンプレートで作成されたワークグループを選択。
ワークグループ名は、<flow-log-subscription-id><partition-load-frequency><start-date><end-date>workgroup の名前になっている

設定用の画面になるので「認証」をクリック

「保存したクエリ」のタブをクリックするとCloudFormationで定義された名前付きクエリ(全16個)を確認できます。
16個から実行したいクエリを選択してVPC Flow Logsの中身を調べることができます。

16個の詳細は下記の通り(公式サイトから引用) vpcFlowLogsAcceptedTraffic — セキュリティグループとネットワーク ACL に基づいて許可された TCP 接続。 vpcFlowLogsAdminPortTraffic — 管理用 ウェブアプリポートに記録されたトラフィック。 vpcFlowLogsIPv4Traffic — 記録された IPv4 トラフィックの合計バイト数。 vpcFlowLogsIPv6Traffic — 記録された IPv6 トラフィックの合計バイト数。 vpcFlowLogsRejectedTCPTraffic — セキュリティグループまたはネットワーク ACL に基づいて拒否された TCP 接続。 vpcFlowLogsRejectedTraffic — セキュリティグループまたはネットワーク ACL に基づいて拒否されたトラフィック。 vpcFlowLogsShrdpTraffic — SSH および RDP トラフィック。
vpcFlowLogStopTalkers — 記録されたトラフィックが最も多い50個のIPアドレス。
vpcFlowLogStopTalkersPacketLevel — 記録されたトラフィックが最も多くある 50 個のパケットレベルの IP アドレス。
vpcFlowLogStopTalkingInstances — 記録されたトラフィックが最も多い50個のインスタンスの ID。
vpcFlowLogStopTalkingSubnets — 記録されたトラフィックが最も多くある 50 個のサブネットの ID。
vpcFlowLogStopTcpTraffic — 送信元 IP アドレスに対して記録されたすべての TCP トラフィック。
vpcFlowLogstotalBytestRansFerred — 記録されたバイト数が最も多い送信元と送信先 IP アドレスの 50 個のペア。
vpcFlowLogstotalBytestRansFerredPacketLevel — 記録されたバイト数が最も多いパケットレベルの送信元および送信先 IP アドレスの 50 個のペア。
vpcFlowLogStrafficFrmsrcaddr — 特定の送信元 IP アドレスについて記録されたトラフィック。
vpcFlowLogStadfficToDr — 特定の送信先 IP アドレスについて記録されたトラフィック。

今回は下の「保存したクエリ」から「vpcFlowLogsShrdpTraffic」を選択してSSH および RDP トラフィックを確認してみます。

データベースはワークグループと同じものを設定して、「実行」をクリックするとVPC Flow Logsに対してクエリが実行されます。

結果が表示される。

上の手順については公式でも詳しく説明されているので不明点などある場合は見てみてください。

削除手順VPCに戻ってVPCフローログを削除→CloudFormationテンプレートから作成したAthenaやLambdaをスタックを削除することで削除できる→バケットを削除→Athenaのワークグループから該当箇所を削除


・公式ドキュメント
Amazon Athena を使用したフローログのクエリ

\弊社では一緒に働いてくれる仲間を募集しております/

エントリーはこちらから▼

Related article

おすすめ関連記事