2020.09.01 CloudFormationを利用したセキュリティグループの自動更新について検証してみた

今回は設定や運用が難しく手間なセキュリティグループの自動更新を、AWSを活用し実現可能か、検証をしてみました。

セキュリティグループの設定って手間だ!

AWS上でEC2やRDSを立ち上げたときに、通信制御のためセキュリティグループを利用します。

セキュリティグループは、特定のIPアドレスからの通信を許可するルールを設定することで、許可された通信を通過させることが可能です。サービスの要件によっては、特定のホスト名からの通信を許可してほしいと要望があります。しかし、セキュリティグループだけでは実現することができないので、多くの場合ファイアウォール機能を有したEC2などを利用して通信制御を実現しています。

それ以外の方法がないかと考えたところ、CloudFormationのAWS Lambda-backedカスタムリソースを利用することで、CloudFormationがLambda APIを呼び出し、動的なリソース構築をすることが実現できるか、今回検証してみました。

AWSを活用し検証してみた

今回はLambdaの中でDNSの名前解決を実施し、取得したIPアドレスの許可ルールをセキュリティグループに設定する仕組みと、定期的にDNS情報を監視し更新がある際に、CloudFormation Stackをアップデートする仕組みを構築、DNS情報の変更がされたときに自動的にセキュリティグループを変更する仕組みを検証してみました。

  • 注意点としては、この方法はIPアドレスによって制限しているので、HTTPベースアクセスでワイルドカード指定されているドメインでは利用できません。その場合にはサードパーティ製のUTMを導入する必要があります。

全体構成図

DNSの変更を自動的に検知しCloudFormationで自動的にセキュリティグループを更新するフローを表した画像

作成したCloudFormationをご紹介!

今回はセキュリティグループをローンチするCloudFormation-1とDNSの監視、更新をするCloudFormation-2の2つに分けて作成しました。

CloudFormation-1

作成ポイント:DNSの名前解決を実施し、セキュリティグループを作成する一連のリソースを作成する。

  • CloudFormation-1のテンプレートは下記よりダウンロードできます。

FQDN-Allow-SecurityGrop.yaml

CloudFormation-1で指定するパラメータ

パラメータの指定方法を表した画像
  • 利用したCloudFormationでLambdaに利用するIAM Roleを作成しているので、"AWS CloudFormationによってIAMリソースが作成される場合があることを承認します。"の項目にチェックをいれてスタックを作成する必要があります。
  • セキュリティグループの許可ポリシーはアウトバンドルールに設定しております。(DNS情報を利用してインバウンドの許可をする場合は、特に信頼できるサイトの情報であることを注意してください。)

CloudFormation-2

作成ポイント:CloudWatch Eventにより定期的に監視Lambdaを実行し、DNS登録情報に変更がないかを確認する。変更がある場合は、CloudFormation-1を再実行しDNS登録情報の変更をセキュリティグループに反映する一連のリソースを作成する。

  • CloudFormation-2のテンプレートは下記よりダウンロードできます。

Check-FQDN-and-stack-update.yaml

CloudFormation-2で指定するパラメータ

パラメータの指定方法を表した画像
  • 利用したCloudFormationでLambdaに利用するIAM Roleを作成しているので、"AWS CloudFormationによってIAMリソースが作成される場合があることを承認します。"の項目にチェックをいれてスタックを作成する必要があります。

本当に自動更新できるか確認してみた

今回の検証環境としては、Route 53にドメインを作成し、テスト用のAレコードを登録しています。
CloudFormation-1をローンチすることでセキュリティグループにAレコードに指定されているIPアドレスの許可ポリシーが設定されます。

Route53に登録したAレコード

Route53に登録したAレコードを表示している画像

CloudFormationにより作成されたセキュリティグループ

CloudFormationにより作成されたセキュリティグループを表示している画像

Route 53のAレコードを変更することで、監視プログラムが変更を検知します。CloudFormation-1のスタックアップデートを実施後、セキュリティグループのIPアドレスが変更されます。DNS情報に変更があったかについては、IPアドレスの文字列をハッシュ化しタグ情報として保管しており、監視プログラムはタグ情報のハッシュ値と、DNSから取得したIPアドレスのハッシュ値を比較して判断しています。また、CloudFormationのスタックアップデートでは、変更された値がないとアップデートに失敗しますが、こちらもタグ情報として変更日と変更回数を含めアップデートを実施しています。

気を付けなければならない点ですが、セキュリティグループの入れ替えは、一時的にルールが削除され、新しいルールに入れ替える動作となります。そのため、一時的にアクセスできない状況が発生するので、周知などの対応が必要です。

変更したAレコード

変更したAレコードを表示している画像

Aレコードの変更が反映されたセキュリティグループ

Aレコードの変更が反映されたセキュリティグループが表示されている画像

セキュリティグループのタグ情報

セキュリティグループのタグ情報が表示されている画像

自動更新できた!

CloudFormationとLambdaを組み合わせることで、自動的にセキュリティグループの書き換えを実施する仕組みについて検証し、動作の確認ができました。CloudFormationのAWS Lambda-backedカスタムリソースの利用により、動的な処理を組み込めるため、工夫次第でいろいろな自動化が可能になります。是非、今までの運用を見直してみることをオススメします!

実際、今回の検証内容をそのまま実環境に適用できるかは、セキュリティ要件、コストなどの要件を総合的に判断する必要があります。弊社ではAWSだけではなく、その他のプラットフォームでのシステムの設計、運用の知見もあり、システム構成のご相談や実際の設計など幅広く対応が可能です。お困りのことがありましたら、是非当社にご相談・お問合せ下さい。

関連サービス

おすすめ記事

導入のお問い合わせはこちら

AWSやAmazon WorkSpacesの導入から接続回線、運用・保守まで何でもお任せください。

お問い合わせ・資料請求