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
なせばなる感じでやってます。人生のモットーは自由です。まだ何か言わなきゃいけないですか?将来の夢は忍者になることですが、どこの忍者も20代健康な男子募集なので切ない思いをしてます。
TAG
- Android
- AWS
- Bitrise
- CodePipeline
- Firebase
- HTML
- iOS
- IoT
- JavaScript
- KPI
- Linux
- Mac
- Memcached
- MGRe
- MGReのゆるガチエンジニアブログ
- MySQL
- PHP
- PICK UP
- PR
- Python
- Ruby
- Ruby on Rails
- SEO
- Swift
- TIPS
- UI/UX
- VirtualBox
- Wantedly
- Windows
- アクセス解析
- イベントレポート
- エンジニアブログ
- ガジェット
- カスタマーサクセス
- サーバ技術
- サービス
- セキュリティ
- セミナー・展示会
- テクノロジー
- デザイン
- プレスリリース
- マーケティング施策
- マネジメント
- ラボ
- リーンスタートアップ
- 企画
- 会社紹介
- 会社紹介資料
- 勉強会
- 実績紹介
- 拡張性
- 採用
- 日常
- 書籍紹介
- 歓迎会
- 社内イベント
- 社員インタビュー
- 社長ブログ
- 視察
- 開発環境