API Gateway のリソースポリシーと WAF の評価順序を確認してみた
AWS WAF を使用して API Gateway の REST API を保護する - Amazon API Gateway
AWS WAF は、ウェブの脆弱性に対する防御の最前線です。API で AWS WAF が有効になっている場合は、リソースポリシー、IAM ポリシー、Lambda オーソライザー、および Amazon Cognito オーソライザーなど他のアクセスコントロール機能の前に AWS WAF ルールが評価されます。たとえば、AWS WAF がリソースポリシーで許可されている CIDR ブロックからのアクセスをブロックした場合、AWS WAF が優先され、リソースポリシーは評価されません。
上記ドキュメントの挙動を確認してみました。
事前準備
- バックエンドとなる Lambda 関数の作成 (デフォルトコード)
- API Gateway で API 作成
- WAF の Web ACL 作成
- API へのアクセスクライアント
- 手元の PC (Windows)
- CloudShell
API Gateway のリソースポリシー/WAF なし
アクセス制限を行っていないので、PC および CloudShell の両方でバックエンドの Lambda からのレスポンスを取得できます。
$ curl https://iwscypr6vl.execute-api.ap-northeast-1.amazonaws.com/test
{"statusCode":200,"body":"\"Hello from Lambda!\""}
[cloudshell-user@ip-10-132-83-96 ~]$ curl https://iwscypr6vl.execute-api.ap-northeast-1.amazonaws.com/test
{"statusCode":200,"body":"\"Hello from Lambda!\""}
API Gateway のリソースポリシーあり/WAF なし
特定の IP アドレスが API Gateway REST API にアクセスすることを許可する | AWS re:Post
API Gateway に以下のリソースポリシーをアタッチします。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:ap-northeast-1:012345678901:iwscypr6vl/*/*/*"
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:ap-northeast-1:012345678901:iwscypr6vl/*/*/*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": "<my-ip>/32"
}
}
}
]
}
<my-ip>
には http://checkip.amazonaws.com/ で確認した IP アドレスを入力しました。
上記ポリシー設定後に API をデプロイすることで、PC の IP アドレス以外からのアクセスはできなくなります。
$ curl https://iwscypr6vl.execute-api.ap-northeast-1.amazonaws.com/test
{"statusCode":200,"body":"\"Hello from Lambda!\""}
[cloudshell-user@ip-10-132-83-96 ~]$ curl https://iwscypr6vl.execute-api.ap-northeast-1.amazonaws.com/test
{"Message":"User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:ap-northeast-1:********0123:iwscypr6vl/test/GET/ with an explicit deny"}[
上記の通り、CloudShell からのアクセスは拒否されました。
API Gateway のリソースポリシーあり/WAF あり
WAF でも IP アドレス制限を行います。
IP セットを作成し、WAF のルールに設定します。
API Gateway に WAF を紐づけます。
$ curl https://iwscypr6vl.execute-api.ap-northeast-1.amazonaws.com/test
{"message":"Forbidden"}
[cloudshell-user@ip-10-132-83-96 ~]$ curl https://iwscypr6vl.execute-api.ap-northeast-1.amazonaws.com/test
{"message":"Forbidden"}
上記の通り PC からのアクセスは WAF によってブロックされました。
CloudShell からのアクセスでも同じようにブロックされている理由は、WAF のどのルールにもマッチしなかった場合のデフォルトアクションをブロックに設定しているためです。
デフォルトアクションを Allow にすると CloudShell からのアクセスは API Gateway のリソースポリシーで拒否されます。
$ curl https://iwscypr6vl.execute-api.ap-northeast-1.amazonaws.com/test
{"message":"Forbidden"}
[cloudshell-user@ip-10-132-83-96 ~]$ curl https://iwscypr6vl.execute-api.ap-northeast-1.amazonaws.com/test
{"Message":"User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:ap-northeast-1:********0123:iwscypr6vl/test/GET/ with an explicit deny"}
冒頭のドキュメント通り、WAF でブロックされたリクエストは API Gateway のリソースポリシーでは評価されないことを確認できました。
まとめ
今回は API Gateway のリソースポリシーと WAF の評価順序を確認してみました。
どなたかの参考になれば幸いです。
Discussion