WordPress環境にAWS WAFでBasic認証を設定したときのループバックリクエスト(REST API)許可ルール
なのでREST APIが正常に呼び出せない場合、WordPressはまともに動作しません。過去のバージョンのWordPressではセキュリティ対策としてREST APIを無効にすることが定石だったため、セキュリティ対策を見直さずにバージョンアップをしたことがきっかけで不具合に見舞われる人も多いみたいです。 (サイトでREST APIのループバックリクエストがうまく処理できていない場合、サイトヘルス上での「サイトでループバックリクエストが完了できませんでした」と表示されます。)
よくあるケースとして、リリース前などにWordPress環境全体にBasic認証が必要なケースを取り上げます。 この場合、例外としてWordPress環境からのREST APIの呼び出し(ループバックリクエスト)を許可する必要があります。 AWS WAFでの設定例を以下に記載します。
前提
ElasticIP(固定のパブリックIP)設定済み
挙動
条件に適合する場合は401を返してBasic認証を要求
条件
Basic認証OKでもIPホワイトリストOKでもない
!(Basic認証OK || IPホワイトリストOK)
AWS WAFで設定できるように変換
上記の条件はAWS WAFにそのまま設定できないので、ド・モルガンの法則でORをANDに変換する
(!Basic認証OK) && (!IPホワイトリストOK)
JSONは以下
code: BasicAuthRequired.json
{
"Name": "BasicAuthRequired",
"Priority": 5,
"Statement": {
"AndStatement": {
"Statements": [
{
"NotStatement": {
"Statement": {
"ByteMatchStatement": {
"SearchString": "Basic xxxxxxxxxxxxxxxxxxxxxxxx",
"FieldToMatch": {
"SingleHeader": {
"Name": "authorization"
}
},
"TextTransformations": [
{
"Priority": 0,
"Type": "NONE"
}
],
"PositionalConstraint": "EXACTLY"
}
}
}
},
{
"NotStatement": {
"Statement": {
"IPSetReferenceStatement": {
"ARN": "arn:aws:wafv2:us-east-1:xxxxxxxxxxxx:global/ipset/EC2-WP/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}
}
]
}
},
"Action": {
"Block": {
"CustomResponse": {
"ResponseCode": 401,
"ResponseHeaders": [
{
"Name": "www-authenticate",
"Value": "Basic"
}
]
}
}
},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "BasicAuthRequired"
}
}
余談
ループバックリクエストを外に出さない方法は簡単な構成じゃないと使えない
/etc/hostsで自ドメインへの外向けリクエストをWAF内のIPに解決させるという定番の方法があるが……
解決不可能なケース
ポートで振り分けている場合
/etc/hostsはポート指定できない
解決先のIPが不定な場合
/etc/hostsはドメインが指定できない
DNS設定のCNAME相当の指定ができない
一般的にCDNとかLBはIPがコロコロ変わる