Edited at

リソースポリシーによるAPI GatewayのIPアドレス制限を試す

More than 1 year has passed since last update.


はじめに

API Gatewayにリソースポリシーを設定できる様になりました。

https://aws.amazon.com/jp/about-aws/whats-new/2018/04/amazon-api-gateway-supports-resource-policies/

これまでAPIでIP制限を行うには、CloudFront+AWS WAF組合せて使うか、カスタムオーソライザーで制御する

必要があり少々大掛かりだったのですが、S3のバケットポリシーの様にJSON形式で簡単に指定できます。


やってみる

コンソールでAPIを選択すると、ナビゲーションペインにリソースポリシーが追加されています。

IP 範囲のブラックリストを選択すると自動的にポリシーのサンプルが入力されるので

Resourceでステージ、メソッド、リソースパスの情報と、Conditionに接続を拒否したいIPアドレスまたはCIDRブロックを

定義するだけで簡単に設定できます。

ステージ等は省略可能です、今回はホワイトリスト型に設定したかったので、以下のように指定しました。


policy.json

{

"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:ap-northeast-1:account-id:api-id/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "接続を許可するIPアドレス"
}
}
}
]
}

保存後、APIのデプロイをお忘れなく。反映までは数秒かかりました。

許可対象外のIPアドレスからAPIを呼ぶと、以下のようなエラーメッセージが表示されます

{"Message":"User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:ap-northeast-1:account-i:api-id/dev/GET/}"

リソースポリシーで明示的なDenyを設定し、アクセスが拒否された場合は with an explicit deny

というメッセージも追加されます。

{"Message":"User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:ap-northeast-1:account-i:api-id/dev/GET/ with an explicit deny"}

Conditionには、aws:SourceIP 以外も指定可能で、以下のドキュメントにまとまっています。

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/apigateway-resource-policies-aws-condition-keys.html

aws:CurrentTime キーによる日付条件や、aws:UserAgent キーによる制限も便利そうです。


注意点

リソースポリシーの設定画面には削除ボタンが無いので、一度設定すると

現状コンソール上での削除はできないように見えます。(空にすると保存できない)

その場合は以下のようにCondition 部分を削れば制限解除となると思いますが、どうせなら削除もしたい。。


poclicy.json

{

"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:ap-northeast-1:account-id:api-id/*",
}
]
}

簡単ですが、以上です。

参考になれば幸いです。