CloudWatch メトリクスを利用して AWS Client VPN の接続を検知してみた

2023.08.28

こんにちは、コンサル部の有福です。

AWS Clinet VPN では接続ログを CloudWatch に保存する機能が提供されているので、VPN エンドポイントへの接続履歴を確認することが可能です。

ただし、VPN エンドポイントへの接続を通知で受け取りたい場合などには、接続検知の仕組みを用意する必要があります。

今回は、AWS Client VPN が発行する CloudWatch メトリクスを使って VPN エンドポイントへの接続検知を試してみたので、備忘の意味も込めてブログにまとめました。

やりたいこと

AWS Client VPN エンドポイントへの接続があった際に、その接続を検知して通知を出したい

前提条件

  • AWS Client VPN を設定済み

試した方法

今回やろうとしたのは、AWS Client VPN が発行する CloudWatch メトリクスをもとに VPN エンドポイントへの接続があった時にアラートを発報する CloudWatch アラームを作成し、Amazon SNS でメール通知を行うという方法です。

イメージ

AWS Client VPN が発行する CloudWatch メトリクスについて

AWS Client VPN では、いくつかの CloudWatch メトリクスを5分ごとに発行します。

今回は、このメトリクスのうち「ActiveConnectionsCount(VPN エンドポイントへのアクティブな接続数)」が接続検知に使えそうだと考えました。

ただし、メトリクスの値そのものは「アクティブな接続数」であるため、新たな接続を検知するために VPN エンドポイントへのアクティブな接続数が増えた時にだけ CloudWatch アラームのアラートが発報させたいです。

CloudWatch メトリクスの増減値を取得する方法

CloudWatch には、「CloudWatch Metric Math」という機能が用意されており、既存の CloudWatch メトリクスをもとに数式を適用して新たな時系列(メトリクス)を作成したり、複数の CloudWatch メトリクスをクエリするといったことを可能にします。

今回はメトリクスの増減値を取得したかったので、CloudWatch Metric Math の DIFF 関数を使うことにしました。

やってみた

「ActiveConnectionsCount」メトリクスの増減値の取得

まずは CloudWatch コンソール を開き、サイドメニューから「すべてのメトリクス」を選択します。

「ClientVPN」 > 「エンドポイント別」 を順に選択し、 検知対象となる VPN エンドポイントの「ActiveConnectionsCount」メトリクスのチェックボックスをオンにします。

次に「グラフ化したメトリクス」タブを選択します。

「数式を追加」ボタンをクリックし、プルダウンから「空の式で始まる」を選択します。

すると、グラフ化したメトリクスの一覧に行が1つ追加されると同時に、各行にIDが表示されるようにます。(下画像の「e1」、「m1」が該当)

追加された行の「詳細」列にあるペン型のアイコンをクリックし、 DIFF(m1) と入力して「適用」ボタンをクリックします。

なお、「m1」の部分には「ActiveConnectionsCount」メトリクスに付された ID と同じものを入力します。

これでID「e1」のメトリクスが「ActiveConnectionsCount」メトリクスの増減値を示すようになります。

CloudWatch アラームの作成

「ActiveConnectionsCount」メトリクスの増減値が用意できたので、CloudWatch アラームを作成します。

作成したメトリクスの「アクション」列にあるベルの形のアイコンをクリックします。

CloudWatch アラームの作成画面に遷移した段階で、先ほど用意した「ActiveConnectionsCount」メトリクスの増減値が適用された状態になっています。

各設定値を下画像のように入力します。

VPN エンドポイントへのアクティブな接続数が増えた時にアラートを出したいので、条件のしきい値(メトリクスの増減値)を「1」 「以上」としました。

  • 接続数が増加 → 「プラス」

  • 接続数に増減なし → 「0」

  • 接続数が減少 → 「マイナス」

また、その他の設定として

  • メトリクス期間:「1分」

  • データポイント:「1 / 1」

  • 欠落データの処理:「欠落データを適正 (しきい値を超えていない)として処理」

としているのは、アクティブ接続数が連続して増加した場合でも、その都度 Amazon SNS からの通知を行わせるためです。

もう少し具体的に説明しますと、AWS Client VPN ではメトリクスを5分ごとに発行しますが、これに合わせてメトリクス期間も「5分」にしてしまと、アクティブ接続数の増加が連続した場合「アラート」の状態が継続となります。

Amazon SNS からの通知はアラート発報時(アラート状態が始まったとき)に行われるので、このアラートが「適正」状態にリセットされるまでは、アクティブ接続数が増加しても新たな通知が行われないという点に注意です。

それでは、次の画面に進みアクションを設定します。

アラーム状態トリガーに「アラーム状態」を選択し、通知用のSNSトピックを指定します。

SNS トピックは既存のものを選択するこもできますし、この画面で新規作成することもできます。

次の画面でアラームの名前と説明(オプション)を入力し、「プレビューと作成」ページで内容を確認したら「アラームの作成」ボタンをクリックして完了です。

動作確認

実際に検知対象の VPN エンドポイントに接続を行いました。

接続開始後、少し経つと CloudWatch アラームのアラート発報の内容でメール通知が届きました。

その後も何度か接続を試してみましたが、AWS Client VPN から5分ごとにメトリクスが発行されているということで、遅くとも VPN 接続開始から5分以内に通知が来ることも確認できました。

また、連続での接続検知ができているかということで、5分の間を置いて異なる端末から VPN 接続してみたところ、ちょうど5分間隔で通知を受け取ることができました。

ただし、よく考えてみればそうなのですが、メトリクスが発行される5分の間に

  • VPN 接続を開始しても切断した場合

  • ある端末が新たに接続を開始しても、接続中の別端末が切断を行なった場合

など接続検知が行われないケースも確認できました。

さいごに

今回は、AWS Client VPN の接続検知を行う方法として CloudWatch メトリクス を利用する方法を試してみました。

「検知」というと実装が難しいイメージを持つ方もいらっしゃるかもしれませんが、AWS サービスが用意している機能を組み合わせることで、マネジメントコンソール上の作業のみで接続の検知・通知を行うことができました。

ただし、この方法では

  • 検知にとりこぼしの可能性がある

  • 通知を受け取っても、どのユーザーによる接続かなどアクティビティの詳細を知るには別途「接続ログ」などの確認が必要

といった課題も残ります。

個人的には学びとなるポイントもあったのでので、この記事を通じて何かの参考としていただけると幸いです。