特定のIPセットが登録されたWebACLを抽出したいときはAWS Configの高度なクエリを使おう

2021.05.24

こんにちは、岩城です。

AWS WAFのIPセットを削除しようとした際、WebACLに関連付けられているため削除できないことを示す以下メッセージが出力されました。

AWS WAF couldn’t perform the operation because your resource is being used by another resource or it’s associated with another resource.

これを解決するには、当該IPセットを利用したルールが関連付けられたWebACLを特定し、そのルールを削除する必要があります。WebACLやそれに関連するルールの数が少なければ、マネジメントコンソールで1つずつ確認すれば良いかも知れません。ところが、数が多いと手動で確認するのは辛いです。

マネジメントコンソールやCLIなど調べましたが、現状AWS WAF独自の機能でIPセットをキーに検索はできません。それではどうするか、AWS Configの高度なクエリ機能を使いましょう。

高度なクエリ

本エントリでは、手動で総当りするのは避けるため、Configの高度なクエリ機能を利用して手軽に抽出する方法を紹介します。

やってみた

前提として、Configの記録が有効であることと、WAFv2 IPSetWAFv2 WebACLが記録するリソースタイプに含まれている必要があります。

Configの高度なクエリで以下のクエリを実行すれば、IPセットのARNをキーに関連付けられたWebACLを検索することができます。 表示するカラムはConfig JSONのKeyを指定しています。カスタマイズしたい場合は、ドキュメントやマネジメントコンソールから各リソースのConfig情報を確認して変更してみてください。

SELECT
  resourceId,
  resourceName,
  relationships
WHERE
  resourceType = 'AWS::WAFv2::WebACL'
  AND relationships.resourceId = '<IPセットのARN>'

実際に実行すると以下のような感じで表示されます。

IPセットのARNを確認する方法はいくつかあります。

  • WebACLのコンソールから関連づいたIPセットのARNを確認する
    • IPセットのコンソールからは確認できません
    • IPセットが関連づいたWebACLが分かっている必要がある
  • CLIを使ってARNを確認する
  • ConfigのリソースからIPセットを検索してARNを確認する

本エントリではConfigのリソースからIPセットのARN(Amazon Resource Name)を確認する方法を紹介します。

Configのリソースを開き、リソースタイプにAWS WAFv2 IPSetを選択すると、Configを実行したリージョンに存在するIPセットのリストが表示されます。

Configはリージョナルサービスであるため、リージョンを横断的に確認することができません。調べたいリソースを作成したリージョンやConfigの実行リージョンを確認してください。

たとえば、CloudFrontに関連するWAFの場合、一律バージニアリージョンでWebACLやIPセットが作られているはずです。

IPセットを選択すると詳細ページに遷移しARNを確認できます。

おまけ

今回紹介したクエリはリソースタイプにAWS::WAFv2::WebACLを指定しました。 これはIPセットのrelationshipsには、IPセットに関連付けられたWebACLが含まれないからです。

WebACLのConfig情報には、関連付けられたIPセットが含まれるため、WebACLに対してIPセットのARNをキーにクエリしました。

おわりに

実は当初、全WebACLの情報をCLIで出力した後、IPセット名でgrepしようとしてました。

もっと他に良い方法があるはずと思い社内で相談したところ、AWS Configでいけるかもとコメントいただき、素早く簡単に調べることができました。

丸毛さんありがとうございます!

今回はIPセットを調べるためにConfigの高度なクエリを使用しましたが、あるセキュリティグループに関連付けられたEC2インスタンスを調べるなど、応用の幅は広いと思います。

Configの高度なクエリは便利なので活用しましょう!

できればIPセットのコンソールからARNや関連付けられたWebACLを調べられると嬉しいですね!

本エントリがどなたかのお役に立てれば幸いです。