LoginSignup
16
9

More than 1 year has passed since last update.

WordPress + AWS WAF設定時の注意点

Last updated at Posted at 2021-12-26

はじめに

Wordpressサーバーを運用するにあたり、セキュリティー対策として、AWS WAFを導入する機会があったのですが、思わぬエラーが出たため、書き留めます。

環境構築図

スクリーンショット 2021-12-26 19.04.09.png

WAFの概要

流れ

  1. WAFの導入
  2. 導入直後、サイト閲覧
  3. 導入後、画像アップロード時、エラー
  4. uploadのパスのみ、コアルールセットを適用しない方法
  5. 導入後、問い合わせフォームでのエラー
  6. ログの保存方法

WAFの導入

WAFの導入方法についてはこちらの記事を参考にしてください。

ルールの詳細はこちら

導入方法でも説明されていますが、WAF導入時は必ずCountアクションに設定してください。
正しくWordPressのサイトを閲覧していても、どこかでBLOCKされる可能性があります。

私が今回導入したルールは、こちらです。

  • Wordpress application
  • SQL database
  • PHP application
  • Linux operating system
  • Core rule set
  • Anonymous IP list
  • Amazon IP reputation list

導入直後、サイト閲覧

導入直後、サイトを適当に閲覧した後に、WAFのCOUNTを確認してみると、コアルールセットNoUserAgent_HEADERがCOUNTされていました。

NoUserAgent_HEADERとは、「HTTP User-Agent ヘッダーのないリクエストをブロックする」という意味です。
UserAgent_HEADER自体、chromeでは、2023年には、廃止を決めているなど、特にブロックする必要はありません。

そのため、NoUserAgent_HEADERは、COUNTモードにしたまま、他のすべてのルールをBLOCKにしました。

導入後、画像アップロード時、エラー

Wordpressでメディアアップのロードで画像がアップロードできないエラーが発生しました。

スクリーンショット 2021-12-26 19.29.25.png
スクリーンショット 2021-12-26 19.30.47.png

サーバーの負荷が高いか十分なリソースがないため画像の後処理に失敗しました。
もっと小さな画像をアップロードしてみてください。推奨する最大サイズは2500ピクセルです。
サーバーから予期しないレスポンスがありました。
ファイルは正しくアップロードされているかもしれません。
メディアライブラリもしくはページをリロードして確認してください。

WAFを確認してみると、コアルールセットの以下2つのルールがBLOCKされていました。

CrossSiteScripting_BODY

組み込み XSS 検出ルールを使用して、URI パスの値を検査し、一般的なクロスサイトスクリプティング (XSS) パターンをブロックします。AWS WAF。パターンの例には、 などのスクリプトあります。

SizeRestrictions_BODY

リクエスト本文のサイズが最大 10,240 バイトを超える場合、ブロックする ​

SizeRestrictions_QUERYSTRING

URI クエリ文字列の長さが最大 2,048 バイトを超える場合、ブロックする ​

対処法は3つ

  1. COUNTモードにする
  2. 管理画面ページを使用するIPが限られている場合、ホワイトリストにIPアドレスを追加します。
  3. BLOCKされたURIであるwp-admin/upload.php(仮)のみコアルールセットを適用せず、他すべてのURIは、上記2つのルールも含めて、すべてのルールを適用する。

セキュリティー面を考えると2が最もよいです。

2,3に関して、方法を説明いたします。

ホワイトリストにIPアドレスを追加する方法は、下記の記事参考にしてください。

uploadのパスのみ、コアルールセットを適用しない方法

  1. 正規表現パターンセット(Regex pattern sets)を作成します。スクリーンショット 2021-12-26 19.48.54.png

  2. ルールグループを作成します。

  • 名前を決めます。CloudWatchメトリクスにも記録されるようです。スクリーンショット 2021-12-26 19.54.28.png

  • 正規表現パターンセットのuploadとマッチしたら、ALLOWするルールを作成します。日本語訳するとわかりやすいです。
    スクリーンショット 2021-12-26 20.04.26.png

↓日本語訳

スクリーンショット 2021-12-26 20.05.45.png

作成したルールグループをWAFに加え、コアルールセットよりも優先順位を高くすると、wp-admin/upload.phpのみコアルールセットが適用されずに、ALLOWされます。

ちなみにwp-admin/upload.php以外のパスもコアルールセットに入れたくない場合、正規表現パターンセットを作成し、ルールグループに追加するとよいです。

WAF導入後、問い合わせフォームでのエラー

問い合わせフォームを送るとき、エラーが起き、送れませんでした。
コアルールセットの以下1つがBLOCKされていました。

GenericRFI_BODY

リクエスト本文の値を検査し、ウェブアプリケーションの RFI (リモートファイルインクルージョン) を悪用しようとするリクエストをブロックします。パターンの例には、:// などがあります。

先程の対処法を参考に、対処しましょう。

WAF導入後、phpMyAdminでsqlのエクスポートができない(404エラー)

AWSManagedRulesSQLiRuleSetSQLi_QUERYARGUMENTSのルールでブロックされていました。

SQLi_QUERYARGUMENTS

組み込みの AWS WAF SQL インジェクション match ステートメントを使用して、すべてのクエリパラメータの値に、悪意のある SQL コードに一致するパターンがないかを検査します。

対処法

こちらは、sqlのエクスポートするIPが特定している場合、特定のIPのみ許可(ホワイトリスト)するようにしましょう。
先程の対処法は、パスに対して、コアルールセットよりもルールグループを優先させる方法でしたので、
同様にパスではなく、特定のIPのルールグループを作成し、AWSManagedRulesSQLiRuleSetよりもルールグループを優先させるとよいです。

WordPressでBLOCKされやすいWAFルール

今回のWordPressにWAFを適用するにあたり、以下の4つのルールがBLOCKされましたので、COUNTにしております。
もしくは、特定のIPや特定のパスのみルールを適用しない方法もありますので、状況に応じて対応しましょう。
同様の構築をする際に、参考になればと思います。

コアルールセット:AWSManagedRulesCommonRuleSet

ルール 意味
NoUserAgent_HEADER HTTP User-Agent ヘッダーのないリクエストをブロックする
CrossSiteScripting_BODY 組み込み XSS 検出ルールを使用して、URI パスの値を検査し、一般的なクロスサイトスクリプティング (XSS) パターンをブロックします。AWS WAF。パターンの例には、 などのスクリプトあります。
SizeRestrictions_BODY リクエスト本文のサイズが最大 10,240 バイトを超える場合、ブロックする
SizeRestrictions_QUERYSTRING URI クエリ文字列の長さが最大 2,048 バイトであることを確認します。
GenericRFI_BODY リクエスト本文の値を検査し、ウェブアプリケーションの RFI (リモートファイルインクルージョン) を悪用しようとするリクエストをブロックします。パターンの例には、:// などがあります。

SQL データベース:AWSManagedRulesSQLiRuleSet

ルール 意味
SQLi_QUERYARGUMENTS 組み込みの AWS WAF SQL インジェクション match ステートメントを使用して、すべてのクエリパラメータの値に、悪意のある SQL コードに一致するパターンがないかを検査します。

ログの保存方法

下記の記事通りすると、COUNTBLOCKのみWloudWatchLogsに保存できます。

  • 「aws-waf-logs-」で始まるロググループを作成する必要あり
16
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
9