API GatewayでIP制限してメッセージをカスタムする
PICK UP POST

API GatewayでIP制限してメッセージをカスタムする

最近仕事用マシン変わったんですけど、昨日は「j」のキーボードが効かないし、今日はついさっきまで「n」が効かなかったです。
家のmacは基盤交換になるしiPodは壊れるしで、これ何ですか?電磁波ですか?ささむらです。

今年2018年4月からAPI Gatewayでリソースポリシー設定できるようになってます。公式でいくつかサンプルも公開されており、世の中どんどん便利になっていくものですねぇ。と思わざるを得ませんな。
あれ、お前最近までカスタマーサクセスだとか運用だとかマネージメントだとかの記事書いてなかった?とお思いのあなた。それは残像です。

API Gatewayのポリシー設定例は公式で丁寧に解説されていますが、いざ自分の要件で書き直すときは専門担当に聞くか毎度ググる私のような人たちへ、とりあえずこれだけ押さえたら良さそうなものたちを挙げ列ねてみます。API Gateway自体については割愛します。

ポリシーステートメント

API Gatewayでリソースポリシー設定内容。リソース、アクション、エフェクト、プリシパルなどのエレメントを組み合わせて、これは許可する、拒否するなど設定します。
個人的に名前から直感的にわからなそうかもと思ったのが、エフェクト、プリシパルですが、直訳すると「効果」「主役」的なもんなので、それぞれアクションリスエストに対するAllowかDenyかの設定と、アクション・リソースへのアクセス許可を持ってるIAMユーザーないしアカウントになります。なお、リソース識別はARNで記述します。

ARNでのリソース識別

基本構成

arn:aws:execute-api:region:account-id:api-id/stage-name/HTTP-VERB/resource-path-specifier

各種指定内容こんな感じ

 

region メソッドのデプロイされたAPIに対応するAWSリージョン。アジアパシフィック (東京)はap-northeast-1
account-id EST API所有者の12桁のAWSアカウントID。要はそのコンソールをいじってるアカウントID
api-id メソッドのAPIに割り当てられたAPI Gateway識別子。Gateway設定のメソッドリクエストに表示されてる。
stage-name メソッドに関連付けられたステージの名前。API Gatwayステージの名前。メソッドリクエストには*で表示されてる。
HTTP-VERB メソッドHTTP 動詞。いわずもがな。
resource-path-specifier パス。いわずもがな

一部機能のみ、API制限をかける

現実的によくあるのは外部連携等でのIP制限かなぁというところでGET /api/miserarenai_yoのみ制限あり、以外は通常公開の例をあげて見ます。
複数システム連携周りで「ここはAからのアクセスだけ」「あっちはBからのアクセスだけ」とか機能単位で分類するようなイメージです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:ap-northeast-1:<account-id>:<api-id>/*/GET/api/miserarenai_yo",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "[許可IP]"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:ap-northeast-1:<account-id>:<api-id>/*/*/api/*"
        }
    ]
}

これでAPIGatewayをステージにあげると、通常公開の機能についてはどっからでもアクセスできるけど、一部の機能ついては指定IP以外からのアクセスだとステータス403とメッセージが返ってきます。

403メッセージのカスタマイズ

ステータスはいいとしてもこのままのメッセージは出せないのでGateway Responseの403応答をカスタムします。

ステージにアップした上で再度アクセスすると

メッセージが変わります。

本番適用を前提とした場合に考慮すべきことはもっとあるだろうし、大枠だったらWAFとかもありですが、センシティブな対応を要する場合はこちらの方がいいかもね。

毎度忘れるから元ネタリンクはっとくぜヒャッハー
Amazon リソースネーム (ARN) と AWS サービスの名前空間
https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-arns-and-namespaces.html

API を呼び出すためのアクセスの制御
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-control-access-using-iam-policies-to-invoke-api.html

TAG

  • このエントリーをはてなブックマークに追加
ささまる
プロジェクトマネージャー ささまる sasa

なせばなる感じでやってます。人生のモットーは自由です。まだ何か言わなきゃいけないですか?将来の夢は忍者になることですが、どこの忍者も20代健康な男子募集なので切ない思いをしてます。