Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
48
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

@hayao_k

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

はじめに

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

これまで 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>/*",
        }
    ]
}

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

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
48
Help us understand the problem. What are the problem?