AWS WAF によってブロックされているファイルをアップロードするにはどうすればよいですか?
AWS WAF によってブロックされている拡張子を使用するファイルをアップロード (POST) する必要があります。
簡単な説明
AWS WAF が POST リクエストをブロックする理由を理解するには、以下の点に注意してください。
- AWS WAF_BODY マネージドルールは、ウェブアクセスコントロールリスト (ACL) の本文サイズ制限までのリクエスト本文のみを検査します。リージョナンウェブ ACL の制限は 8 KB、Amazon CloudFront ウェブ ACL の制限は 16 KB です。CloudFront ウェブ ACL の場合、ウェブ ACL の設定で制限を最大 64 KB まで増やすことができます。
- SQL インジェクションとクロスサイトスクリプティング (XSS) ルールは、メタデータにランダムな文字が含まれるファイルを認識します。これらのランダムな文字は、AWS WAF の実際の XSS または SQL インジェクションシグネチャと類似するため、ウェブ ACL ルールを呼び出す可能性があります。
まず、ファイルのアップロードをブロックする可能性のある共通ルールを確認します。共通ルールがアップロードをブロックさしていない場合は、ブロックされたファイルを許可する追加のオプションを検討します。
ファイルのアップロードをブロックする共通ルールは、次のとおりです。
- CrossSiteScripting_BODY
- SQLi_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 アドレスを追加します。手順については、「Working with IP match conditions」を参照してください。
条件に一致するセーフリストを使用する
リクエストを許可するには、文字列または正規表現 (regex) の一致条件が設定されたセーフリストを使用します。セーフリストは、AWS WAF ファイル の本文 (BODY) に関連付けられた URI、HTTP ヘッダー、またはフレーズに基づいて作成できます。
セーフリストを作成するには、新しいカスタムルールを作成します。このルールは、アップロード用の有効なリクエスト属性の一致データに基づく例外条件で XSS または SQLi ベクターをブロックします。必ず、誤検知の原因となるマネージドルールグループ内の特定のルールによるアクションをオーバーライドしてください (SQLi_BODY および CrossSiteScripting_BODY)。
このカスタムルールを作成するには、次の手順を実行します。
- AWS WAF コンソールを開きます。
- ナビゲーションペインの [AWS WAF] で、[ウェブ ACL] を選択します。
- [リージョン] で、ウェブ ACL を作成した AWS リージョンを選択します。
注: ウェブ ACL が Amazon CloudFront 用に設定されている場合は、[グローバル] を選択してください。 - ウェブ ACL を選択します。次に、ウェブ ACL の [ルール] タブで [ルール] を選択します。
- [ルールを追加]、[独自のルールとルールグループを追加] の順に選択します。
- [名前]に ルール名を入力し、[標準ルール] を選択します。
- [リクエストが次の場合] で [すべてのステートメントに一致 (AND)] を選択します。
- [ステートメント 1] の次のフィールドを入力します。
[検査] で [ラベルあり] を選択します。
[マッチスコープ] で **[ラベル]**を選択します。
**[マッチキー]**に誤検知を作成するルールのラベルを入力します。例えば、CrossSiteScripting_BODY ルールによって誤検知が発生している場合は、awswaf:managed:aws:core-rule-set:CrossSiteScripting_Body と入力します。 - [ステートメント 2] の次のフィールドを入力します。
[Negate ステートメントの結果] のチェックボックスをオンにします。
[検査] で [本文] を選択します。
[マッチタイプ] で [文字列を含む] を選択します。
[一致する文字列] に、ルールと一致させる値を入力します。 - (オプション) **[テキスト変換]**では、[テキスト変換] または [なし] を選択します。
- [アクション] で [ブロック] を選択します。次に、[ルールを追加] を選択します。
- [ルールの優先度の設定] で、リクエストをブロックしているマネージドルールグループの下にルールを移動します。これにより、AWS WAF が次のルール優先度内のラベルを使用する前に、ルールグループの検査用のマネージドルールラベルが最初に設定されます。
- [保存] を選択します。
重要: [アクション] を [カウント] に設定した非本番環境でルールをテストすることをお勧めします。ルールを評価するには、Amazon CloudWatch メトリクスを AWS WAF サンプリングリクエストまたは AWS WAF ログと組み合わせて使用します。ルールの動作が想定どおりである場合は、[アクション] を [ブロック] に変更します。
WindowsShellCommands_BODY、GenericLFI_BODY、またはSizeRestrictions_BODY ルールによってファイルのアップロードがブロックされる場合
ファイルのアップロード時に HTTP アーカイブ (HAR) ファイルを取得します。次に、このファイルで WindowsShellCommands_BODY、GenericLFI_BODY、または SizeRestrictions_BODY ルールについて確認します。手順については、「AWS サポートケース用にブラウザから HAR ファイルを作成するにはどうすればよいですか?」を参照してください。
WindowsShellCommands_BODY、GenericLFI_BODY、または SizeRestrictions_BODY の誤検知を許可するには、まず対応するルールを [カウント] モードに設定します。手順については、「ルールグループの評価結果を Count にオーバーライド」を参照してください。
次に、誤検知の原因となる特定のマネージドルールに対するカスタムルールを作成します。
- AWS WAF コンソールを開きます。
- ナビゲーションペインの [AWS WAF] で、[ウェブ ACL] を選択します。
- [リージョン] で、ウェブ ACL を作成した AWS リージョンを選択します。
注: ウェブ ACL が Amazon CloudFront 用に設定されている場合は、[グローバル] を選択してください。 - ウェブ ACL を選択します。次に、ウェブ ACL の [ルール] タブで [ルール] を選択します。
- [ルールを追加]、[独自のルールとルールグループを追加] の順に選択します。
- [名前]に ルール名を入力し、[標準ルール] を選択します。
- [リクエストが次の場合] で [すべてのステートメントに一致 (AND)] を選択します。
- [ステートメント 1] の次のフィールドを入力します。
[検査] で [ラベルあり] を選択します。
[マッチスコープ] で **[ラベル]**を選択します。
**[マッチキー]**に誤検知を作成するルールのラベルを入力します。例えば、WindowsShellCommands_BODY ルールによって誤検知が発生した場合は、awswaf:managed:aws:windows-os:WindowsShellCommands_Body と入力します。 - [ステートメント 2] の次のフィールドを入力します。
[Negate ステートメントの結果] のチェックボックスをオンにします。
[検査] で [URI パス] を選択します。
[マッチタイプ] で [完全一致文字列] を選択します。
[一致する文字列] に、リクエストが行われている URI パスを入力します。 - (オプション) **[テキスト変換]**では、[テキスト変換] または [なし] を選択します。
- [アクション] で [ブロック] を選択します。
- [ルールを追加] を選択します。
- [ルールの優先度を設定] で、リクエストをブロックしたマネージドルールの下にルールを移動します。
- [保存] を選択します。
重要: [アクション] を [カウント] に設定した非本番環境でルールをテストすることをお勧めします。CloudWatch メトリクスと AWS WAF サンプリングリクエストまたは AWS WAF ログを組み合わせて、ルールを評価します。ルールの動作が想定どおりである場合は、[アクション] を [ブロック] に変更します。
ブロックされたファイルを許可する追加オプション
注: ルールの処理は、ウェブ ACL のリストと同じ順序で行われます。以下の推奨事項については、必要に応じてルールの優先順位を変更してください。
以下から自身のユースケースに最適な方法を選択します。
- 文字列一致ルールステートメント (AWS WAF) または文字列一致条件 (AWS WAF Classic) を使用して選択的除外を適用します。ファイルの本文 (BODY) に関連付けられる特定のフレーズをセーフリストに追加します。特定の URI パスで誤検知が発生した場合は、そのパスをセーフリストに追加します。
- ファイルのアップロードには別のドメインを使用します。これが自身のユースケースにとって費用対効果の高いオプションであるか、十分に検討してください。
- ファイルや画像をスキャン (スクラブ) して、埋め込まれたコードやデータの有無を確認します。このアクションは、ファイルをアップロードする前にクライアント側で実行できます。または、除外ルールを作成すると、ファイルをアップロードした後にバックエンドでこのアクションを実行できます。
- ファイルはアップロードする前に圧縮します。
注意: 悪意のあるファイルは絶対に圧縮しないでください。 - 既知の IP アドレスの範囲からアップロードが行われる場合は、それらの IP アドレスをセーフリストに追加します。
- base64 エンコーディングを使用してすべての画像データをエンコードし、AWS WAF が画像に対して XSS や SQLi を呼び出さないようにします。
注意: 悪意のある画像のエンコードは絶対に行わないで下さい。 - チャンクの削除やビットのランダム化などの画像最適化手法を実装します。
関連するコンテンツ
- 質問済み 3ヶ月前lg...
- AWS公式更新しました 8ヶ月前
- AWS公式更新しました 8ヶ月前
- AWS公式更新しました 6ヶ月前