Help us understand the problem. What is going on with this article?

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

はじめに

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 ブロックを定義するだけで簡単に設定できます。

image.png

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

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 キーによる制限も便利そうです。

注意点

2020/7/10 追記
以前は設定値を空にして保存できなかったのですが、2020年7月時点では
値を空に戻して保存できるようになっており、以下の事象は改善されていました。

リソースポリシーの設定画面には削除ボタンが無いので、一度設定すると
現状コンソール上での削除はできないように見えます。(空にすると保存できない)
その場合は以下のように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>/*",
        }
    ]
}

簡単ですが、以上です。
参考になれば幸いです。

hayao_k
インフラ大好きです。2019 & 2020 APN AWS Top Engineers に選出いただきました。 掲載内容は個人の見解であり、所属する企業を代表するものではありません。
saison_information_systems
モード1(守りのIT)・モード2(攻めのIT)を兼ね備えたバイモーダル・インテグレーターとしてデータ連携プラットフォームのHULFTシリーズ, リンケージサービス, 流通ITサービス, フィナンシャルITサービスを提供します。
https://home.saison.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした