AWS WAF v2でWafCharmを導入設定する際に知っておきたいこと

WafCharmを導入設定する際に知っておいた方がよさそうな点をまとめてみました。
2020.06.29

WafCharmは世界中のWebに対する攻撃パターンをAIによって学習し、環境に応じたアクセスのパターン等を判別し、AWS WAFのルールを最適化してくれるサービスです。これにより、ルール設定や運用に関する工数削減を実現することができます。

今回は、そんなWafCharmを導入する際の設定で、知っておいた方がよさそうな点についてまとめてみました。

なお、本記事ではAWS WAF v2 (以下、AWS WAF)での利用を前提としておりますので、AWS WAF Classicで利用する際はこの通りでない可能性がありますのでご注意ください。WafCharm利用における、AWS WAF Classic、AWS WAFの変更点等については以下をご確認ください。

WafCharm設定の流れ

WafCharm利用までの設定をざっくりお伝えしますと、以下のような流れです。

  • AWS WAFでWeb ACLを作成
  • WafCharm初期設定
    • Web ACL Config
    • Web Site Config
  • WafCharm追加設定
    • レポート機能
    • 通知機能

上記、WafCharm初期設定設定を行うことで、AWS WAFに自動でルールが追加されるようになります。初期設定後、必要に応じレポート機能や、通知機能を利用することが可能です。詳細な設定手順については、WafCharmのブログで詳しく解説されていますので、本記事では割愛しています。(リンクのみ)

WafCharm初期設定

WafCharmにてWeb ACL Config、Web Site Configの設定を行います。設定手順は以下になります。

Web ACL Config

Web ACL Configには「Default WAF Action」という設定項目があります。こちらは、Web ACLにルール追加の際のアクションを指定する項目で、COUNTにすることで各ルールの上書き設定(Override rules action)が有効化された状態で登録されます。以下は、「Default WAF Action」をCOUNTにして、ルール追加が行われた際の画面です。

なお、「Default WAF Action」は、Web ACLの各ルールを更新する機能ではないため、 ルールグループ内で誤検知等が発生した場合など、各ルールのアクションを変更する際は、Web ACLにて個別にOverride rules actionの変更を行います。

ルールアクションの上書き設定については、以下を参考にしてください。

Web Site Config

Web Site Configには「S3 Path」という設定項目があり、 リソース(ALB、CloudFrontなど)のアクセスログの出力先のパスを指定する項目となります。

Web Site Configの作成は、この「S3 Path」ごとに必要となります。

たとえば、サーバ側でバーチャルホストを行い、複数FQDNを単一のALBに向けている構成では、ALBのログは単一のS3バケットに保存されるので、Web Site Configも1つ作成すればOKです。複数ALBを利用しているなど、ログの出力バケットが複数あるケースでは、Web Site Configもその分だけ作成することになります。

00

なお、Web Site Configには「FQDN」という設定項目がありますが、ここで指定した値にWafCharmがアクセスすることはないため、任意の値を設定して構いません。ただし、WafCharmを管理していくことを考えると「FQDN」でどのサイトに対する設定なのか識別できる値が望ましいと思います。

ここでお伝えしたいことは、Web Site Configの作成単位は「S3 Path」ごとに作成するのであって、「FQDN」ごとに作成するのではないといった点になります。

WafCharm追加設定

レポート機能、通知機能を利用するには、AWS WAFログのデータをWafCharmへ送信する必要があります。設定手順は以下となります。

上記ドキュメントには、データ送信に必要なサービス、アーキテクチャについても記載されています。

レポート機能

登録されているWeb ACLに対して、どのような種類の攻撃を受けているのかなどを月毎に可視化することができます。レポートは、毎月初旬に前月分が閲覧可能になるので、初期設定を行った際に正しく設定できているのか(設定不備でレポートが出力されない..といった事がないか)が気になるところです。

先に記載した手順通り正しく設定していて、前月に検知があればレポート出力の条件を満たします。設定が正しく行われていることの確認としては、以下が有効かと思います。

  • AWS WAFログがS3に出力されていること(gzip)
  • Lambda Functionのログ(CloudWatch Logs)に何らかのERRORが出力されていないこと

検知があるかについては、AWS WAFのログを確認してください。ログ項目ruleGroupList配下のterminatingruleまたは、excludedRulesがNULL以外でなければ検知していると考えていいと思います。なお、ルールの設定がBLOCKCOUNTによりロギングされる項目が異なります。

COUNTモードで検知したログの出力例

{
   "timestamp":1591852918531,
   "formatVersion":1,
   "webaclId":"arn:aws:wafv2:ap-northeast-1:XXXXXXXXXXXX:regional/webacl/test-acl/f4d7925f-e083-4e50-a11e-d6b5d11d0fbf",
   "terminatingRuleId":"Default_Action",
   "terminatingRuleType":"REGULAR",
   "action":"ALLOW",
   "terminatingRuleMatchDetails":[
   ],
   "httpSourceName":"ALB",
   "httpSourceId":"XXXXXXXXXXXX-app/test-dev-alb/bc94cd2c62049c0a",
   "ruleGroupList":[
      {
         "ruleGroupId":"arn:aws:wafv2:ap-northeast-1:XXXXXXXXXXXX:regional/rulegroup/WafCharm_Blacklist_Group_991/3ca9bfa0-7e0d-4294-b0bc-deddb70cd21a",
         "terminatingRule":null,
         "nonTerminatingMatchingRules":[
         ],
         "excludedRules":[
            {
               "exclusionType":"EXCLUDED_AS_COUNT",
               "ruleId":"wafcharm-blacklist-991"
            }
         ]
      }
   ],
(省略)
}

AWS WAFのログ詳細については、以下を参照ください。

おまけ

レポート機能、通知機能を利用するために、AWS WAFログをS3に出力しますが、その際にKinesis Data Firehose(以下、Firehose)、WafCharmが提供するLambda Function等を利用する必要があります。Firehoseではプレフィックスをカスタマイズできるので、Athenaでの解析を考慮して、Apache Hiveフォーマットに設定したところ、WafCharmへのデータ連携に失敗しました。

その際、設定していたFirehoseのプレフィックスは以下となります。

任意のプレフィックス/year=!{timestamp:yyyy}/month=!{timestamp:MM}/day=!{timestamp:dd}/hour=!{timestamp:HH}/

これにより、以下のような構成でAWS WAFのログが出力されます。

上記バケットにAWS WAFログが作成されると、それをトリガーにLambda Functionを起動するように設定するのですが、Lambda Functionのログ(CloudWatch Logs)に、以下のようなメッセージが出力されました。

2020-06-12T08:33:27.982Z 5bf66153-59b2-4557-9628-4585f03724c5 ERROR
Not match the AWS WAF full log event. :year%3D2020/month%3D06/day%3D12/hour%3D08/aws-waf-logs-test-delivery-stream-2-2020-06-12-08-32-24-c5309f6e-a668-47cc-8ad3-951065c3e954.gz

Lambda Functionのコードindex.js内の以下定義によりエラーが発生しているようです。

let match = event.Records[0].s3.object.key.match(/\d{4}\/\d{2}\/\d{2}\/\d{2}\/[^\/]*$/);

WafCharmを利用する上で、FirehoseのPrefix設定はwaflog/のような設定であれば問題になりませんが、Firehoseによりデフォルトで付与されるプレフィックスYYYY/MM/DD/HHをカスタマイズすると、エラーになると思いますのでご注意ください。

さいごに

WafCharmを導入する際に、気になった点をまとめてみました。導入する際のお役に立てれば幸いです。

WafCharmはAWS WAFのルールを最適化してくれるので、設定や運用が楽になると思います。設定自体はシンプルで、お手軽に利用を開始できますので、トライアルしてみるのもいいと思います。