🔥
Amazon API Gatewayのアクセス制限・認証のまとめ
2021年2月時点の情報です。今後アップデートされる可能性があります。
REST API と HTTP API におけるアクセス制限・認証方法をまとめました。WebSocket API は本記事の対象外です。
Amazon API Gateway(以下、API Gateway)はデフォルトではフルオープンで誰でもアクセスできてしまいます。エンドユーザやシステムからのアクセスに制限したい場合にいくつかの方法があるのでまとめてみました。
REST API と HTTP APIについて
その前に REST API と HTTP API の違いについて簡単に述べます。
REST API
- API Gateway リリース当初からある API 方式
- HTTP API よりアクセス制限・認証方法は多い
- 多機能である反面、デプロイが面倒
HTTP API
- 後発の API 方式
- REST API よりできることが少ないが、高速でコストも安い(70%ぐらい安い)
- 機能が少しずつ増えているので REST API しかできないことが減っていくかも
- 作成時点でデフォルトステージがあってデプロイが楽、コンソールが見やすい
- Internal ALB への統合ができる
リソースポリシー
JSON でポリシーを規定することでアクセスを制御する仕組みです。リソースポリシーを設定することで以下の制御ができます。
- AWS アカウント、IAM ユーザ、IAM ロール
- IP アドレス、CIDR
- VPC、VPC エンドポイント
Pros
- 簡単に設定できる
- Condition キーが多様なので複雑なアクセス制御も可能
Cons
- HTTP API は対応していない
AWS WAF との統合
AWS WAF と API Gateway を連携することでアクセス制御します。AWS WAF で行えるアクセス制限が可能です。
- IP アドレス、CIDR
- HTTP ヘッダ、メソッド、クエリストリング、URI、リクエストボディ
Pros
- HTTP ヘッダやリクエストボディなどリソースポリシーでは対応できない制御が可能
- XSS など脆弱性を突いた攻撃から守ることができる
Cons
- HTTP API は対応していない
クライアント証明書(相互 TLS 認証)
API Gateway 呼び出し側に SSL 証明書を入れることで、端末単位でアクセス制限ができます。
Pros
- クライアント側はクライアント証明書と秘密鍵を指定すればいいので認証としては簡単
Cons
- クライアント証明書の発行、失効、更新などの管理が面倒
AWS Lambda オーソライザー
認証用の Lambda 関数によるアクセス制御を行う方法です。API Gateway からリクエストを受け取る度に Lambda 関数が呼ばれ、何かしらの認証処理を行います。
Pros
- REST API、HTTP API ともに対応している
- Lambda 関数で認証ロジックを実装するため自由度が高い
Cons
- オーソライザー用の Lambda 関数を実装する必要がある
- 認証の成功・失敗に関わらずリクエストされる度に Lambda 関数が呼ばれるため、AWS Lambda のコストが増える。キャッシュを有効化することで呼び出し回数を減らすことはできる
IAM 認証
API Gateway の呼び出しを IAM に限定することができます。設定やアクセス方法は以下の記事をご参照ください。
[サンプルコード付き]IAM認証をかけたAmazon API Gatewayにアクセスする
Pros
- REST API、HTTP API ともに対応している
- IAM 側で制御できるため管理しやすい
Cons
- AWS 以外の環境では IAM ユーザを作成して AWS アクセスキーを発行する必要がある
Cognito
Amazon Cognito のユーザプールを利用して API Gateway にアクセスできるユーザを制御できます。
Pros
- REST API、HTTP API ともに対応している(HTTP API の場合は JWT オーソライザーとしての使用)
- Facebook、Google などによるアカウントログインや OpenID Connect による認証ができる。モバイルアプリに向いている
Cons
- 上に書いてある認証で済むならそれにこしたことはない
参考 URL
- Controlling and managing access to a REST API in API Gateway - Amazon API Gateway
- Choosing between HTTP APIs and REST APIs - Amazon API Gateway
- Using AWS WAF to protect your APIs - Amazon API Gateway
- Use API Gateway Lambda authorizers - Amazon API Gateway
- Control access for invoking an API - Amazon API Gateway
- Control access to a REST API using Amazon Cognito user pools as authorizer - Amazon API Gateway
Discussion