ユーザーが現在の AWS WAF 設定ルールをブロックすることなく、特定のファイル拡張子を使用してファイルをアップロードできるようにしたいと考えています。
簡単な説明
HTTP ファイルのアップロードコンテンツは、一般的に次のいずれかのタイプとなります。
- フォームデータ: ウェブサイトのフォームから API にマルチパートフォームデータの一部として送信されるデータ。
- バイナリデータ: テキストペイロード以外のファイル。バイナリファイルとしては、JPEG ファイル、GZip ファイル、または PDF ファイルなどがあります。
AWS WAF が POST リクエストをブロックする理由を確認するには、まず、ファイルのアップロードをブロックする一般的なルールを確認します。一般的なルールでアップロードがブロックされているわけではない場合は、ブロックされたファイルを許可するための追加オプションを確認してください。
ファイルのアップロードをブロックする一般的なルールは、次のとおりです。
- CrossSiteScripting_BODY
- SQLi_BODY
- SizeRestrictions_BODY
- リクエスト本文 (BODY) を評価するカスタムルール
解決方法
ファイルのアップロードをブロックするルールを特定する
ファイルのアップロードをブロックするルールを特定するには、次の手順を実行します。
-
AWS WAF コンソールを開きます。
-
サンプリングされたウェブリクエストを確認します。サンプリングされたリクエストには、リクエストをブロックするルールに関する情報と、HTTP リクエストコンポーネントに関する情報の両方が含まれています。
-
[概要] ページの [ルールグループ内のルール] の下から、HTTP リクエストコンポーネントを探します。コンポーネントは次の例のような外観を持っています。
ルールグループ内のルール
awswaf:managed:aws:core-rule-set:CrossSiteScripting_Body
リクエスト
`POST /upload`
`User-Agent: PostmanRuntime/7.30.0 Accept: */* Host: example.amazonaws.com Connection: keep-alive Content-Type: multipart/form-data; boundary=--------------------------421232031360350156757252 Content-Length: 4060737 `
- terminatingRuleMatchDetailsを AWS WAF の全ログで確認します。
注: SQLi_BODY 攻撃と CrossSiteScripting_BODY 攻撃に対してのみ、TerminatingRuleMatchDetails フィールドに入力が行われます。
POST データのコンテンツタイプを特定
コンテンツタイプを特定するには、POST データの HTTP ヘッダーで content-type を確認してください。前の例では、コンテンツタイプは multipart/form-data です。
フォームデータコンテンツ
ヘッダー値として multipart/form-data を含むフォームデータコンテンツの場合は、次の手順を実行します。
-
AWS WAF コンソールを開きます。
-
ナビゲーションペインの [AWS WAF] で、[ウェブ ACL] を選択します。
注: [リージョン] のデフォルト設定は、[米国東部 (バージニア北部)] です。ウェブ ACL を作成した AWS リージョンを選択します。ウェブ ACL が Amazon CloudFront 用に設定されている場合は、[グローバル] を選択してください。
-
お使いのウェブ ACL を選択します。
-
[ルール] タブで [ルールを追加] を選択し、[独自のルールとルールグループを追加] を選択します。
-
[ルールを追加] 画面の [ルールタイプ] で、[ルールビルダー] を選択します。
[名前] に、このルールを識別するための名前を入力します。
[タイプ] で [正規ルール] を選択します。
[リクエストがあった場合] で、[ステートメントと一致] を選択します。
[検査] には [本文] を選択します。
[コンテンツタイプ] で [JSON] を選択します。
[JSON の一致範囲] では、[値] を選択します。
リクエスト本文の JSON が無効な場合の AWS WAF によるリクエストの処理方法については、お客様に適するオプションを選択してください。
[検査する内容] で [すべての JSON コンテンツ] を選択します。
[一致タイプ] で [正規表現と一致] を選択します。
[正規表現] には、次の正規表現パターン例を貼り付けます。
(?:.pdf|.doc|.docx|.ppt)
(オプション) **[テキスト変換]**では、テキスト変換または [なし] を選択します。詳細については、「テキスト変換」を参照してください。
[オーバーサイスの取り扱い] では、ご使いの設定に適したオプションを選択します。詳細については、「AWS WAFでオーバーサイズのWebリクエストコンポーネントを処理する」を参照してください。
[アクション] で [許可] を選択します。詳細については、[ルールアクション] を参照してください。
-
[ルールを追加] を選択します。
-
[ルールの優先度を設定] でルールを選択し、他のリクエストをブロックするルールよりも高い優先度に移動します。AWS WAF は、設定された優先度に従ってルールを評価します。詳細については、「AWS WAFでオーバーサイズのWebリクエストコンポーネントを処理する」を参照してください。
-
[保存] を選択します。ルールが正常に動作するかを確認してください。
バイナリデータコンテンツ
ヘッダー値が application/pdf または application/ppt に似ているバイナリデータコンテンツになっている場合は、次の手順を実行してください。
-
AWS WAF コンソールを開きます。
-
ナビゲーションペインの [AWS WAF] で、[ウェブ ACL] を選択します。
注: [リージョン] のデフォルト設定は、[米国東部 (バージニア北部)] です。ウェブ ACL を作成した AWS リージョンを選択します。ウェブ ACL が Amazon CloudFront 用に設定されている場合は、[グローバル] を選択してください。
-
お使いのウェブ ACL を選択します。
-
[ルール] タブで [ルールを追加] を選択し、[独自のルールとルールグループを追加] を選択します。
-
[ルールを追加] 画面の [ルールタイプ] で、[ルールビルダー] を選択します。
[名前] に、このルールを識別するための名前を入力します。
[タイプ] で [正規ルール] を選択します。
[リクエストがあった場合] で、[ステートメントと一致] を選択します。
[検査] で [単一ヘッダー] を選択します。
[ヘッダーフィールド名] に「コンテンツタイプ」を入力します。
[一致タイプ] で [正規表現と一致] を選択します。
[正規表現] には、次の正規表現パターン例を貼り付けます。
(?:pdf|jpeg)
(オプション) **[テキスト変換]**では、テキスト変換または [なし] を選択します。詳細については、「テキスト変換」を参照してください。
[アクション] で [許可] を選択します。詳細については、[ルールアクション] を参照してください。
-
[ルールを追加] を選択します。
-
[ルールの優先度を設定] でルールを選択し、他のリクエストをブロックするルールよりも高い優先度に移動します。AWS WAF は、設定された優先度に従ってルールを評価します。詳細については、「AWS WAFでオーバーサイズのWebリクエストコンポーネントを処理する」を参照してください。
-
[保存] を選択します。ルールが正常に動作することを確認してください。
注: ルールを特定のアップロード URI パスに制限するには、ウェブ ACL ルール内で AND ステートメントを使用します。
関連情報
AWS WAF のログ記録をオンにしてCloudWatch、Amazon S3、Kinesis Data Firehose にログを送信するにはどうすればよいのですか?