[CloudFront]WAFとRestrict Viewer Accessはどっちが先に適用されるの?

2021.01.15

CloudFrontでは様々なアクセス制限ができますが、WAFとRestrict Viewer Access(署名付きURL または署名付きCookieによるアクセスユーザー制限)を両方適用した場合の適用順序はどうなるの?というのが気になったので試してみました。

それぞれWAFとRestrict Viewer Accessを個別に適用した場合

CloudFrontディストリビューションにそれぞれのアクセス制限を行い、ルールにマッチしない条件でアクセスした場合の挙動は下記になります。

WAFのみ
403エラーとともに、"The request could not be satisfied."のエラーメッセージが返ります。

% curl https://XXXXXX.cloudfront.net
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>ERROR: The request could not be satisfied</TITLE>
</HEAD><BODY>
<H1>403 ERROR</H1>
...

これはWAFの仕様通りですね。

https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/cloudfront-features.html

AWS WAF は、指定した条件に基づいてウェブリクエストをブロックすると、CloudFront に HTTP ステータスコード 403 (Forbidden) を返します。

Restrict Viewer Accessのみ
"Missing Key-Pair-Id query parameter or cookie value"というエラーメッセージが返ってきます(エラーは403)。

% curl https://XXXXXX.cloudfront.net
<?xml version="1.0" encoding="UTF-8"?><Error><Code>MissingKey</Code><Message>Missing Key-Pair-Id query parameter or cookie value</Message></Error>%

WAFとRestrict Viewer Accessを併用した場合

CloudFrontディストリビューションにWAFとRestrict Viewer Accessを適用し、いずれの条件にもマッチしない状態でアクセスしてみます。

% curl https://XXXXXX.cloudfront.net
<?xml version="1.0" encoding="UTF-8"?><Error><Code>MissingKey</Code><Message>Missing Key-Pair-Id query parameter or cookie value</Message></Error>%

WAFのエラーではなく、Restrict Viewer Accessのエラーが返ってきました。

結論

CloudfrontでWAFとRestrict Viewer Accessを併用した場合、Restrict Viewer Accessによる評価がWAFによる評価より先に行われます

これらの評価順序に関して、AWSから公開情報がありませんでしたが、現時点での動作としては上記のようになるとのことです。