目次

  1. 1.はじめに
  2. 2.使用方法
  3. 3.設定方法の詳細-サンプルを通して-
  4. 4.想定される利用例
  5. 5.注意点
  6. 6.WafCharm での制限事項
  7. 7.おわりに

1. はじめに

2021年2月12日にリクエストボディ内の JSON コンテンツの特定のキーや値を指定する機能(以下 JSON パーサー機能と呼ぶ)が AWS WAF にリリースされました。
これまではリクエストボディ単位での検査にしか対応してませんでしたが、検査する対象を絞り込むことによって不要な検知を減らし、検知精度の向上が期待できます。
設定方法と使用例をご紹介します。

※ AWS WAF Classic では対応しておりません。

2.使用方法

AWS マネージメントコンソールよりルールの作成を行います。

auto

検査対象に「Body」を選択すると「Plain text」か「JSON」かを選ぶことができますので「JSON」を選択します。

auto

「JSON」を選択するとさらに項目を指定できます。項目を確認していきましょう。

auto

項目 説明
JSON match scope この項目で検査対象を「keys」か「Values」か両方(All)を指定します。
How AWS WAF should handle the request if the JSON in the request body is invalid この項目はデータが JSON 形式に一致しなかった場合の処理を選択します。
None: 評価できるところまで評価
Evaluate as plain text: プレーンテキストに変換して評価
Match: JSON形式に一致していない不自然なアクセスとして評価され、アクション(BLOCK、COUNT、ALLOW)を実施
No match: マッチしないものと評価
Content to inspect Full JSON content: 全て
Only included elements: 指定された対象のみ

Only included elements を選択すると対象の入力項目が現れます。 JSON ポインターの構文で対象を指定します。

auto

設定方法については以上ですが、これだけではイメージしづらいかと思いますので具体例を交えて説明していきます。

3.設定方法の詳細-サンプルを通して-

以下の JSON をサンプルに実際の設定値について解説します。

````
{
    "user": {
        "name": "WAF太郎",
        "data": {
            "job": [
                {
                    "role": "Engineers",
                    "position": "manager"
                }
            ]
        }
    }
}
````

データは keys と values に分けると以下となります。

keys user, name, data, job, role, position
values WAF太郎, Engineers, manager

JSON match scope を ALL に設定した場合は全ての値が検査され、「keys」か「Values」かを指定することでどちらかに検査の対象を絞り込むことが可能です。

また例として Content to inspect の対象を制限した場合に検査対象の値は以下になります。

Content to inspect JSON match scope 検査対象
/user/data ALL job, role, Engineers, position, manager
/user/data keys job, role, position
/user/data values Engineers, manager
/user/data/job/0 ALL role, Engineers, position, manager
/user/data/job/0 keys role, position
/user/data/job/0 values Engineers, manager

JSON ポインターは RFC6901 で定義されています。
連想配列 { } の場合は「キー」を、配列 [] の場合は「位置」を指定する形です。

参照:https://tools.ietf.org/html/rfc6901

4.想定される利用例

values のみを評価の対象に変える 対象をクライアントからの入力に絞り込むことによって、誤検知の可能性を減らすことが期待できます。
JSON の構造がユーザーの入力に応じて可変な箇所についてのみを対象とする 対象を絞り込むことによって、誤検知の可能性を減らすことが期待できます。
比較的自由なテキスト入力項目を検査対象から外す 比較的自由な入力欄で発生しうる、誤検知の可能性を減らすことが期待できます。
※ 対象のスコープが増えることで WCU が高コストになる恐れがあります。
※ JSON editor での編集が必須です。
既存ルールへの条件追加による絞り込み 既存のルールに JSON パーサー機能の条件を and 条件でつなげることで、更なる条件の絞り込みが可能となります。

誤検知を減らすために絞り込むことは、検査されない箇所が確実に想定の値以外は入り込まない対策があることで成り立ちます。適切なバリデーションが行われているか確認してから利用しましょう。

5.注意点

  • AWS WAF のリクエストサイズ制限
  • AWS WAF はリクエスト本文の最初の8KB(8,192バイト)のみが検査対象となります。
    場合によってはリクエストサイズでの検査を組み合わせる必要があります。

  • 高コスト
  • JSON パーサー機能を利用することで WCU の使用コストが2倍に上昇します。
    例えば JSON 内の特定の情報のみを検査から除外するような誤検知対策を行うよりも、URI パスによる除外をした方がコストパフォーマンスが良いかもしれません。

6.WafCharm での制限事項

WafCharm では現在 JSON パーサー機能に対応しておりません。
お客様ルールとして登録する場合は問題ございません。
ただし比較的早くに JSON パーサー機能を利用したカスタマイズでの対応が可能になる予定です。

7.おわりに

JSON 形式でのデータという条件はありますが、対象を絞り込むことができるので、誤検知を回避する目的で有効な機能です。
ただし、検査をしない箇所を作ることはセキュリティリスクを生むことになるので、検査をしない箇所に想定以外の値が入らない処理がアプリケーション側で実装されているかを確認の上で利用しましょう。