正当なアップロードリクエストが、AWS WAF にブロックされる原因を教えてください。
AWS WAF にブロックされる拡張子が付いたファイルをアップロード (POST) したいと考えています。
簡単な説明
次のいずれかの要因で、POST リクエストが AWS WAF にブロックされる場合があります。
- ファイルが AWS WAF が検査できるリクエスト本文の最大サイズを超えている場合。AWS WAF には、固定値である本文検査サイズのクォータが適用されます。
- SQL インジェクションとクロスサイトスクリプティング (XSS) 対策ルールは、メタデータにランダムな文字が含まれるファイルに反応します。ランダムな文字により、ウェブアクセスコントロールリスト (ウェブ ACL) ルールが呼び出される場合があります。AWS WAF における実際の XSS または SQL インジェクションのシグネチャと類似していることが、この原因です。
まず、ファイルのアップロードをブロックする可能性のある一般的なルールを確認します。一般的なルールではアップロードをブロックしていない場合は、ブロックされたファイルを許可するための追加のオプションを検討してください。
一般に、ファイルのアップロードは、次のルールが原因でブロックされます。
- SQLi_BODY
- CrossSiteScripting_BODY
- WindowsShellCommands_BODY
- GenericLFI_BODY
- SizeRestrictions_BODY
解決策
SQLi_BODY ルールと CrossSiteScripting_BODY ルールが原因でファイルのアップロードがブロックされる場合
AWS WAF 包括ログの terminatingRuleMatchDetails フィールドにルールに関する情報が表示されていないか確認します。
注: terminatingRuleMatchDetails フィールドには、SQLi_BODY および CrossSiteScripting_BODY の攻撃についてのみ入力されます。
以下は、CrossSiteScripting_BODY の matchedData の例です。
"terminatingRuleMatchDetails": [{ "conditionType": "XSS", "location": "BODY", "matchedData": [ "
SQLi_BODY の matchedData の例を次に示します。
"terminatingRuleMatchDetails": [{ "conditionType": "SQL_INJECTION", "location": "BODY", "matchedData": [ ")", "*", "(", "0" ]
次のいずれかの方法で SQLi_BODY または CrossSiteScripting_BODY によってブロックされたアップロードに対処します。
既知の IP アドレスをセーフリストに追加する
アプリケーションにアクセスする IP アドレス範囲がわかっている場合は、IP 一致条件を使用すると、該当する IP アドレスがセーフリストルールに追加されます。
条件一致を含むセーフリストを使用する
文字列または正規表現 (regex) の一致条件が設定されたセーフリストを使用し、リクエストを許可します。AWS WAF ファイルの本文に関連付けられた URI、HTTP ヘッダー、またはフレーズを基準に、セーフリストを作成します。
セーフリストで一意の識別子を使用し、正当と判断できるリクエストを識別します。
セーフリストを作成するには、新しいカスタムルールを作成します。このルールは、XSS または SQLi ベクターを例外条件でブロックします。条件は、アップロードに対する有効なリクエスト属性の照合データを基準としています。マネージドルールグループ内の、誤検知を引き起こす特定のルールによるアクションをオーバーライドします。SQLi_BODY および CrossSiteScripting_BODY を Count に変更します。
このカスタムルールを作成するには、次の手順を実行します。
- AWS WAF コンソールを開きます。
- ナビゲーションペインで [AWS WAF] を選択します。
- [リソースと保護パック] を選択します。
- 目的の保護パックを探し、[ルール] の横にある [表示と編集] を選択します。
- 右側のペインで [ルールを追加] を選択します。
[カスタムルール] を選択し、[次へ] をクリックします。
[カスタムルール] を再度選択し、[次へ] をクリックします。 - ルールの [アクション] を BLOCK に設定します。
- [ルール名] を入力します。
- [リクエストが次の場合] でドロップダウンを展開し、[すべてのステートメントに一致 (AND)] を選択します。
- [ステートメント 1] で次の手順を実行します。
[検査] で [ラベルあり] を選択します。
[ステートメント] で [ラベル] を選択します。
[マッチキー] に誤検知を引き起こすルールのラベルを入力します。たとえば、CrossSiteScripting_BODY ルールが誤検知を引き起こす場合は、awswaf:managed:aws:core-rule-set:CrossSiteScripting_Body と入力します。 - [ステートメント 2] で次の手順を実行します。[検査] で [本体] を選択します。
[ステートメント] の [サイズ超過の処理] で [続行] を選択します。
[マッチタイプ] で [文字列を含む] を選択します。
[一致する文字列] にルールと一致させる値を入力します。
(オプション) [テキスト変換] でテキスト変換または [なし] を選択します。
[ルール設定] を展開し、[ステートメントの否定 (NOT)] で [ステートメント結果の否定] を選択します。 - [ルールを作成] を選択します。
- ルールの優先度を設定するには、右側のペインで [ルール順序の編集] を選択し、このルールをリクエストをブロックしているマネージドルールグループよりも下にドラッグします。この手順を実行すると、ルールグループの検査では、マネージドルールのラベルが最優先されます。その後、AWS WAF はその次のルール優先度に含まれるラベルを使用します。
- [ルール順序を保存] を選択します。
注: 本番以外の環境で [アクション] を [カウント] に設定し、ルールをテストすることをおすすめします。ルールを評価するには、Amazon CloudWatch メトリクスを AWS WAF でサンプリングされたリクエストまたは AWS WAF ログと組み合わせて参照します。ルールが想定通りに動作する場合は、[アクション] を [ブロック] に設定します。
WindowsShellCommands_BODY、GenericLFI_BODY、またはSizeRestrictions_BODY ルールによってファイルのアップロードがブロックされる場合
ファイルのアップロード時に HTTP アーカイブ (HAR) ファイルを作成します。次に、このファイルを参照し、WindowsShellCommands_BODY、GenericLFI_BODY、または SizeRestrictions_BODY ルールが適用されていないか確認します。
WindowsShellCommands_BODY、GenericLFI_BODY、または SizeRestrictions_BODY の誤検知を許可するには、まず、ブロックを引き起こすルールを Count モードに設定します。手順については、「ルールグループの評価結果を Count に変更する」を参照してください。
次に、誤検知を引き起こすマネージドルールに対し、カスタムルールを作成します。
- AWS WAF コンソールを開きます。
- ナビゲーションペインで [AWS WAF] を選択します。
- [リソースと保護パック] を選択します。
- 目的の保護パックを探し、[ルール] の横にある [表示と編集] を選択します。
- 右側のペインで [ルールを追加] を選択します。
[カスタムルール] を選択し、[次へ] をクリックします。
[カスタムルール] を再度選択し、[次へ] をクリックします。 - ルールの [アクション] を BLOCK に設定します。
- [ルール名] を入力します。
- [リクエストが次の場合] でドロップダウンを展開し、[すべてのステートメントに一致 (AND)] を選択します。
- [ステートメント 1] で次の手順を実行します。
[検査] で [ラベルあり] を選択します。
[ステートメント] で [ラベル] を選択します。
[マッチキー] に誤検知を引き起こすルールのラベルを入力します。たとえば、WindowsShellCommands_BODY ルールが誤検知を引き起こす場合は、awswaf:managed:aws:windows-os:WindowsShellCommands_Body と入力します。 - [ステートメント 2] で次の手順を実行します。
[検査] で [URI パス] を選択します。[ステートメント] の [マッチタイプ] で [文字列に完全に一致] を選択します。
[一致する文字列] に現在リクエストが行われている URI パスを入力します。
(オプション) [テキスト変換] でテキスト変換または [なし] を選択します。
[ルール設定] を展開し、[ステートメントの否定 (NOT)] で [ステートメント結果の否定] を選択します。 - [ルールを作成] を選択します。
- ルールの優先度を設定するには、右側のペインで [ルール順序の編集] を選択し、このルールをリクエストをブロックしているマネージドルールグループよりも下にドラッグします。
- [ルール順序を保存] を選択します。
注: 本番以外の環境で [アクション] を [カウント] に設定し、ルールをテストすることをおすすめします。ルールを評価するには、CloudWatch メトリクスを AWS WAF でサンプリングされたリクエストまたは AWS WAF ログと組み合わせて参照します。ルールが想定通りに動作する場合は、[アクション] を [ブロック] に設定します。
ブロックされたファイルを許可する追加オプション
注: ルールは、リストの順番に従って処理されます。次のベストプラクティスでは、必要に応じてルールの優先順位を変更してください。
実際のユースケースに合った方法を選択します。
- AWS WAF の文字列一致ルールステートメント、または AWS WAF Classic の文字列一致条件を使用して選択的除外を適用します。ファイル本文に関連付けられている、特定のフレーズをセーフリストに追加します。例: 特定の URI パスで誤検知が発生する場合は、そのパスをセーフリストに追加します。
- ファイルのアップロードには、別途ドメインを使用します。この方法を、ユースケースにおけるコスト効率の観点で検証します。
- ファイルや画像をスキャン (スクラブ) し、埋め込まれたコードやデータの有無を確認します。この手順を、ファイルをアップロードする前にクライアント側で実行します。または、除外ルールを作成すると、ファイルをアップロードした後にバックエンドでこのアクションを実行できます。
- ファイルをアップロード前に圧縮します。
注: 悪意のあるファイルを圧縮しないよう注意してください。 - 既知の IP アドレスの範囲からアップロードが行われる場合は、それらの IP アドレスをセーフリストに追加します。
- base64 エンコーディングを使用してすべての画像データをエンコードし、AWS WAF が画像に対して XSS や SQLi を呼び出さないようにします。
注: 悪意のある画像をエンコードしないよう注意してください。 - チャンク削除、ビットランダム化などの画像最適化手法を実装します。
