AWS WAFとAmazon CloudFront構成でphpMyAdminに403エラーが発生したので対処してみた

AWS WAFとAmazon CloudFrontを通して、EC2インスタンスで稼働しているphpMyAdminにアクセスしようとしたところ、403エラーが返ってきました。今回はWAFが原因だったので、エラー原因の特定から対処までまとめたいと思います。
2024.05.24

phpMyAdmin画面にアクセスできない

おのやんです。

みなさん、AWS WAF(以下、WAF)とAmazon CloudFront(以下、CloudFront)構成でphpMyAdminに403エラーが発生したことはありませんか?私はあります。

画面上の表示ではCloudFrontのエラーになっていましたが、原因がWAFによるものでしたので、今回はエラー原因の特定までの流れと、その対処法について紹介したいと思います。

403エラーが出た時の状況整理

今回は、最低限必要なリソースを作成した以下の構成を再現して検証します。Amazon EC2(以下、EC2)上では、phpMyAdminがホストされており、このログイン画面にアクセスしようとしていました。

今回の場合、Webブラウザにてhttps://<ドメイン名>にアクセスすると、通常通りページが表示されていました。

しかしhttps://<ドメイン名>/phpMyAdminにアクセスしようとしたところ、403エラーが画面位表示されました。

403 ERROR

The request could not be satisfied.

Request blocked. We can't connect to the server for this app or website at this time. There might be too much traffic or a configuration error. Try again later, or contact the app or website owner. If you provide content to customers through CloudFront, you can find steps to troubleshoot and help prevent this error by reviewing the CloudFront documentation.

Generated by cloudfront (CloudFront) Request ID: XXXX

対処方法

エラー画面の表示ではGenerated by cloudfront (CloudFront)とありましたが、こちらを調べたところhttps://<ドメイン名>/phpMyAdminへのアクセスがWAFによりブロックされた可能性があるとのことです。

ということで、WAFの設定を確認してみます。WAFのコンソール画面にアクセスし、CloudFrontにアタッチしているWebACL詳細画面の「Sampled Request」を見てみます。すると、/phpMyAdminパスへのアクセスがブロックされているのが確認できました。WAFルールを見てみると、マネージドルールであるAWS-AWSManagedRulesAdminProtectionRuleSetに引っかかっているようです。

AWSManagedRulesAdminProtectionRuleSetには、管理者アカウントや管理者権限を持つリソースを保護するためのルールが含まれています。今回phpMyAdminの管理者サイトへアクセスした際に、このアクセスがブロックされたという形になります。

ということで、自身のPCからのアクセスがブロックの対象に含まれないよう、除外する設定を追加したいと思います。WAFのIP Sets画面からIP Setを作成し、先ほどブロックされていたアクセス元IPアドレスを追加します。なお1つのIPアドレスを指定する場合は、X.X.X.X/32のように入力します。

作成後は、このようにIP Setが確認できます。

このIP Setsに設定されたIPアドレスをブロックしないように、WAFのルールへ設定していきます。「Rules」タブからWebACIに設定しているWAFルールが確認できますので、ここのAWSManagedRulesAdminProtectionRuleSetを選択して「Edit」を押下します。

この「Scope of inspection」の項目で、以下のように設定します。

項目 設定値
Choose the scope of inspection Only inspect requests that match a scope-down statement
If a request doesn't match the statement (NOT)
Inspect Originates from an IP address in
IP set 先ほど作成したIP Set
IP address to use as the originating address Source IP address|

これにより、送信元IPアドレスがIP Setの値ではないリクエストをAWSManagedRulesAdminProtectionRuleSetで評価する、つまりIP SetのIPアドレスをWAFのルールから除外する設定が可能になります。

こちらを設定することで、phpMyAdminの画面にアクセスできるようになりました。

WAFのSampled Request画面から確認できる

WAFのルールによりアクセスがブロックされたので、送信元アドレスをWAFの評価から除外する設定を行ってみました。

WAFのSampled Request画面でALLOW、BLOCKが確認できるので、WAFが原因だと思った時はSampled Requestを調べるといいかもしれません。

以上参考になれば幸いです。では!