VPCフローログを設定して、EC2へアクセスした際のログをCloudWatch Logsに保存してみる

VPCフローログを設定して、EC2へアクセスした際のログをCloudWatch Logsに保存しました。AWSで代表的なログ管理サービスであるVPCフローログを使って、最小構成のVPC環境からログを取得してみましょう。
2023.08.03

はじめに

こんにちは!おのやんです。

みなさん、AWSでログを管理したいと思ったことはありませんか?私はあります。

AWSではログ管理サービスがいくつか存在します。そんなサービスの中でも、今回はVPCフローログでログを管理していきたいと思います。

下準備

最初に、以下のミニマルなVPC環境を用意していきます。

VPC

EC2を設置するVPCは、以下の画像のように作りました。

こちらのVPCには、念の為インターネットゲートウェイが設置してあります。そのため、SSHを使って外部からパブリックサブネットにアクセスすることもできます。

パブリックサブネット

パブリックサブネットは、以下のように作成しました。

EC2インスタンス

EC2インスタンスは、以下のスペックで作成します。

  • AMIはAmazon Linux 2
  • インスタンスタイプはt2.micro
  • さきほど作成したVPC・サブネットにインスタンスを設置

なお、Session ManagerでEC2インスタンスにアクセスするケースを想定するため、SSM接続を許可するIAMロールを設定しておきます。

詳細はこちらを参照ください。

VPCフローログ作成

このインスタンスに対して、VPCフローログを有効化します。最終的に、EC2インスタンスのネットワークインターフェースで発生したログを、CloudWatch Logsに格納できる状態にします。

ロググループの作成

ログを送信する際は、CloudWatch Logs内のロググループという単位で宛先を指定します。

まずはCloudWatchのサービス画面に移動します。左側のナビゲーションバーにロググループの項目があるので、ここからロググループ画面に入ります。

この画面で「ロググループを作成」をクリックします。

ロググループの作成画面では、名前や保存期間が指定できます。今回は名前のみ設定しておきましょう。

設定が完了したら「作成」を押して、ロググループを作成しましょう。

IAMロールの作成

ここでは、CloudWatch Logs へのフローログ発行のための IAM ロールを作成します。

IAMロール作成画面では、信頼されたエンティティタイプに「AWSのサービス」、ユースケースに「EC2」を選択しておきます。

これらが設定できたら、「次へ」を押します。

ここでは、何も設定せずに「次へ」に進みます。

ロール作成の確認画面では、画像のように名前だけ入力しておきます。

入力が完了したら、「ロールを作成」を行います。

IAMロールが作成できたので、IAMロール名をクリックして詳細画面に移ります。

IAMロール詳細画面に入ると、下の「許可」のタブに「許可を追加」ボタンがあるので、この「ポリシーをアタッチ」を選択します。

今回は、まだアタッチするポリシーが無いため、「ポリシーを作成」をクリックします。

この画面で、JSONを選択し、以下に記載するインラインポリシーを設定します。

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

これらが完了したら、ポリシーの名前を入力して...

そして、「ポリシーの作成」ボタンを押します。

これで許可ポリシーを作成することができました。

このポリシーを、先程のIAMロールに付与しましょう。

さきほどのvpc-flow-logsのロール画面に移ります。ここで、改めて「ポリシーをアタッチ」を選択します

すると、アタッチしたいポリシーを検索できるようになるので、さきほど作成したポリシーを選択します。

選択ができたら、「許可を追加」を押します。

これで、IAMロールにVPCフローログの権限を割り当てることができました。IAMロール詳細画面からも確認できますね。

次に、このIAMロールを付与できる対象を設定しましょう。

IAMロール詳細画面の「信頼関係」タブを押すと、IAMロールの信頼関係を記述するJSONが表示されます。ここの「信頼ポリシーを編集」を押します。

この部分を、以下に示すJSONに書き換えて、「ポリシーを更新」を押します。

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

これで、今回作成したIAMロールをVPCフローログが使えるようになりました。

フローログの作成

EC2インスタンスの詳細画面に移ります。こちらの「ネットワーキング」のタブを選択します。

「ネットワーキング」タブを下にスクロールすると、「ネットワークインターフェース」という項目があります。こちらにEC2のデフォルトネットワークインターフェースが作成されているため、こちらを選択します。

ネットワークインターフェースの画面で、詳細が選択できますので、こちらをクリックして詳細画面に移ります。

詳細画面の下の方に行くと、フローログを設定できますので、こちらの「フローログの作成」をクリックしましょう。

ここでフローログを作成できますので、名前などを入力していきます。

今回はすべてのログを取得することにします。また、集計間隔は10分で問題ありません。今回はログの送信先はCloudWatch Logsなので、送信先の項目も設定しておきます。

ここで大事なのが、ロググループとIAMロールです。さきほど作成したvpc-flow-log-groupとvpc-flow-logsのIAMロールをそれぞれ選択します。

これらが設定できたら、下にスクロールして「フローログの作成」を押しましょう。

これで、フローログが作成できました!

ログの確認

実際のログは、CloudWatch Logsから確認することができます。まずはログを発生させましょう。

今回はEC2インスタンスにSSMからアクセスし、簡単なコマンドを叩いてログを発生させてみます。

それから、CloudWatch Logsに移動します。

CloudWatch Logsのロググループ一覧には、さきほどのロググループが表示されていますので、こちらから詳細画面に入りましょう。

すると、新しいログストリームが追加されていることがわかります。

こちらのログストリームを実際に見てみると、ログイベントが実際に送信されているのが確認できると思います!

おわりに

VPCフローログをCloudWatch Logsに送信するアプローチは、AWSでも代表的なログ管理手法の一つです。長期保存には向かないので、長期でログを管理したい場合はS3に送信先を設定しておきましょう。

では!

参考資料