こんにちは、SREのぐりもお(@gr1m0h)です。
Topotalでは、SRE as a ServiceというSREを軸にした技術支援サービスを提供しています。
今回は、WafCharm導入用のTerraform Moduleについてお話しします。これは株式会社FiT様への技術支援を機に作成したものです。
WafCharmとは
WafCharmは、パブリッククラウド(AWS/Azure/Google Cloud)に対応したWAFルールの自動運用サービスです。サイバーセキュリティクラウド社が提供しており、WafCharmが管理するWAFルールを利用することで、WAFのルール管理を自動化できます。
AWS WAFの設定ステップ
WafCharmをAWS WAF v2で利用する場合、設定は大きく以下の2ステップに分かれます。
WafCharm:WafCharmのご利用方法 (AWS WAF v2)
- Credential Storeの登録
- WafCharmがAWS WAFを操作するための認証情報(IAMロール)を登録
- WAF Configの登録
- WafCharmで管理するWeb ACLやルール設定を登録
Credential Storeの登録では、IAM RoleによるAssume Role方式が推奨されています。 WafCharmコンソールではCloudFormationによる自動作成も可能です。詳しい手順は以下の通りです。
WafCharm:Credential Storeの設定方法(AWS WAF v2、新プラン)
WAF Configの登録は、WafCharmコンソールから画面操作で簡単に設定できます。詳しい手順は以下の通りです。
WafCharm:WAF Configの設定方法 (AWS WAF v2)
WafCharmプランの違い
WafCharmには新プランと旧プランがあり、設定方法や必要な権限が異なります。今回作成したTerraform Moduleは新プランを対象としています。 また、新プランではRule PolicyとしてAdvancedとLegacyを選択できます。AdvancedはレートベースルールやGeo-match、Botルールなどの設定が可能で、新規導入の場合はAdvancedが推奨されています。
Legacy Rule PolicyとAdvanced Rule Policyの違いについては以下の通りです。
WafCharm:Advanced RuleポリシーとLegacy Ruleポリシーの違い
Terraform Moduleの紹介
Credential Storeの登録では、WafCharmコンソールからCloudFormationでIAMロールを自動作成する方法が用意されています。しかし、以下の理由からTerraform Moduleを作成することにしました。
- Terraformでのインフラ管理との統合
- インフラをTerraformで管理している環境では、IAMロールもTerraformで一元管理したい
- 最小権限に従った設定
- CloudFormationを使用するとAmazonS3ReadOnlyAccessなどの広い権限が付与される
- WAFログ用のS3バケットのみにアクセスを限定するなど、最小権限の原則に従った設定を行いたい
- お客様への迅速な導入
- Topotalとしてお客様に最速でWafCharmを設定できるよう、再利用可能なModuleとして整備したい
作成したTerraform Moduleは、WafcharmのCredential Store登録に必要なIAMロールとポリシーを作成します。新プランのAWS WAF v2を対象としています。
このModuleでは、以下のリソースが作成されます。
- IAMロール
- WafCharmがAssumeRoleするためのロール
- S3読み取りポリシー(カスタムポリシー)
- WAFログ用S3バケットに対する読み取り権限
- ポリシーアタッチメント
AWSWAFFullAccess:AWS WAFの操作権限CloudWatchReadOnlyAccess:CloudWatchメトリクスの読み取り権限S3読み取りポリシー:指定したS3バケットのみへの読み取り権限
これらは、WafCharmのドキュメントに記載がある通りです。
WafCharm:必要な権限 (AWS WAF v2、新プラン)
S3の権限については、AmazonS3ReadOnlyAccess ではなく、WAFログ用バケットに限定したカスタムポリシーを使用しています。これにより、最小権限の原則に従った設定が可能です。
Terraform Moduleの使い方は以下の通りです。
module "wafcharm" { source = "github.com/topotal/terraform-aws-wafcharm" env = "production" wafcharm_trusted_account_ids = ["123456789012"] # WafCharmコンソールから取得 wafcharm_external_ids = ["wafcharm-external-id"] # WafCharmコンソールから取得 waf_log_bucket_arn = "arn:aws:s3:::aws-waf-logs-your-bucket" tags = { Environment = "production" } }
wafcharm_trusted_account_idsとwafcharm_external_idsは、WafCharmコンソールの「既存のIAM Roleを登録する」を選択した際に生成される「IAMロールの信頼ポリシー」から取得できます。
このTerraform Moduleを使用してIAMロールを作成し、出力されるwafcharm_role_arnをWafCharmコンソールのCredential登録画面に入力することで、Credential登録が完了します。
FiT様でのWAF導入
FiT様は、「LifeFit」というチケットを購入するだけですぐに利用できる次世代型フィットネスジムサービスを提供しています。今回、セキュリティ強化の一環としてAWS WAFの導入を進めることになり、WafCharmを採用しました。
Terraform Moduleによるスムーズな適用
FiT様では、StagingとProductionの2環境にWafCharmを導入しました。 今回作成したTerraform Moduleを利用することで、両環境へのIAMロール設定をスムーズに適用できました。
Countモードでの検知と誤検知対応
WafCharm導入時は、まずCountモードで運用を開始しました。Countモードではリクエストをブロックせずに検知のみを行うため、誤検知の影響を受けずに検知状況を確認できます。
運用を進める中で、いくつかの攻撃を検知しました。しかし、その中に明らかに正しいPATHに対するリクエストが含まれていることに気づきました。調査の結果、これはシステム内部で利用しているChannelTalkのWebhookによるものだと判明しました。
ChannelTalkはカスタマーサポートツールで、Webhookを通じてシステムと連携しています。このWebhookからのリクエストがWAFルールに引っかかっていたため、ChannelTalkが公開しているIPアドレスをAllowlistに登録することで対応しました。
WafCharmでもAllowlistを設定できますが、WafCharmで設定するとBotルールより優先度が下がってしまいます。
WafCharmのルールは優先度: 100以上で設定され、ユーザーは優先度: 0~99でルールを追加することができます。 Allowlistについては、WafCharmで作成せず、Terraformで別途作成することとしました。
このように、Countモードでの事前確認と適切なAllowlist設定を組み合わせることで、サービスに影響を与えずにWAFを導入できました。
さいごに
WafCharmのCredential Store登録に必要なIAM設定をTerraform Module化したことで、Terraformでのインフラ管理の統合や最小権限に従った設定が容易になり、Topotalとしてもお客様に最速でWafCharmを設定することができるようになりました。
今回作成したModuleは新プランのAWS WAF v2 Advanced Rule Policyを対象としています。旧プラン、AWS WAF Classic、Legacy Rule Policyには対応していませんので、ご注意ください。
WafCharmの導入を検討されている方や、既存のCloudFormation設定からTerraformへ移行したい方の参考になれば幸いです。何かご質問やフィードバックがありましたら、GitHubのIssueでお気軽にお知らせください。
また、TopotalではWafCharmの代理店販売、導入支援、運用代行を行っています。WafCharmの導入についてご相談がありましたら、お気軽にお声がけください。