API Gateway オーソライザーの選び方

開発者のための AWS セキュリティ活用

Rahul Singh

Technical Product Manager

コード実行前のチェック

呼び出し元はコードに到達する前に API Gateway オーソライザーを通過します。拒否された呼び出し元は401で弾かれます。

合格: リクエストがコードに到達します

失敗: 401 unauthorized、コードは実行されません

開発者のための AWS セキュリティ活用

誰がチェックするか

選べる3種類のオーソライザー
  1. IAM 認証 (AWS_IAM): AWS が署名を検証します

縦軸は、AWSがチェックする方式から自分でチェックする方式までを示しています。記入済みなのは最初のカードのみで、IAM認証ではAWSが署名を検証します。

開発者のための AWS セキュリティ活用

誰がチェックするか

選べる3種類のオーソライザー
  1. IAM 認証 (AWS_IAM): AWS が署名を検証します
  2. Cognito オーソライザー (COGNITO_USER_POOLS): AWS がトークンを検証します
    • 署名、iss、aud、exp

同じ縦のカード列で、2枚が記入済みです。IAM認証ではAWSが署名を検証し、Cognitoオーソライザーでは AWS がトークンを検証します。

開発者のための AWS セキュリティ活用

誰がチェックするか

選べる3種類のオーソライザー
  1. IAM 認証 (AWS_IAM): AWS が署名を検証します
  2. Cognito オーソライザー (COGNITO_USER_POOLS): AWS がトークンを検証します
    • 署名、iss、aud、exp
  3. Lambda オーソライザー: 関数が許可か拒否を返します
    • Cognito以外のトークン向け

3種類のオーソライザーを、AWSがチェックする方式から自分でチェックを書く方式まで並べています。IAM認証ではAWSが署名を検証し、Cognitoオーソライザーでは AWS がトークンを検証し、Lambdaオーソライザーでは自分でチェックを記述します。

開発者のための AWS セキュリティ活用

呼び出し元に合わせて入口を選ぶ

 

呼び出し元が決め手

 

  • 内部サービス: すでに AWS 認証情報を保持

呼び出し元とオーソライザーの対応表、1行目。内部サービスはIAM認証に対応します。

開発者のための AWS セキュリティ活用

呼び出し元に合わせて入口を選ぶ

 

呼び出し元が決め手

 

  • 内部サービス: すでに AWS 認証情報を保持
  • アプリユーザー: Cognito トークンを携帯

呼び出し元とオーソライザーの対応表、2行分。内部サービスはIAM認証に、アプリユーザーはCognitoオーソライザーに対応します。

開発者のための AWS セキュリティ活用

呼び出し元に合わせて入口を選ぶ

 

呼び出し元が決め手

 

  • 内部サービス: すでに AWS 認証情報を保持
  • アプリユーザー: Cognito トークンを携帯
  • パートナーアプリ: 独自の認可ロジックを使用

3種類の呼び出し元を、それぞれに必要なオーソライザーに対応させています。内部サービスはIAM認証、アプリユーザーはCognitoオーソライザー、パートナーアプリはLambdaオーソライザーに対応します。

開発者のための AWS セキュリティ活用

API の種類に注意

REST API

  • 3種類すべてのオーソライザーに加え、リソースポリシーも利用可能
  • API キー、クライアント単位のスロットリング、リクエスト検証、WAF

REST APIの比較カードで、IAM認証、Cognitoユーザープールオーソライザー、Lambdaオーソライザー、リソースポリシーにチェックが入っています。隣のHTTP APIカードはまだ未記入です。

開発者のための AWS セキュリティ活用

API の種類に注意

REST API

  • 3種類すべてのオーソライザーに加え、リソースポリシーも利用可能
  • API キー、クライアント単位のスロットリング、リクエスト検証、WAF

 

HTTP API

  • JWT オーソライザー、任意の OIDC 発行者に対応
  • リソースポリシーはなし。より安価で高速

APIの種類ごとに対応するオーソライザーを比較する2枚のカード。REST APIはリソースポリシーを追加できる一方、HTTP APIはCognitoオーソライザーの代わりにJWTオーソライザーを使い、リソースポリシーはありません。

開発者のための AWS セキュリティ活用

オーソライザーは結果を覚えている

キャッシュで時間を節約

  • 最初の呼び出し: オーソライザーが実行されます
  • 以降の呼び出し: キャッシュされた結果を読み取ります

最初の呼び出しではオーソライザーが実行され、有効期限付きで許可結果がキャッシュに書き込まれます。以降の呼び出しでは、オーソライザーを再実行せずにキャッシュから許可結果を読み取ります。

開発者のための AWS セキュリティ活用

オーソライザーは結果を覚えている

キャッシュで時間を節約

  • 最初の呼び出し: オーソライザーが実行されます
  • 以降の呼び出し: キャッシュされた結果を読み取ります

 

キャッシュ TTL

  • authorizerResultTtlInSeconds: デフォルト300秒、最大3600秒
  • 0 でキャッシュを無効化

最初の呼び出しではオーソライザーが実行され、有効期限付きで許可結果がキャッシュに書き込まれます。以降の呼び出しでは、オーソライザーを再実行せずにキャッシュから許可結果を読み取ります。

開発者のための AWS セキュリティ活用

キャッシュされた許可は権限より長く残ることがある

2本のレーンからなるタイムライン。権限レーンは取り消し時点で有効から取り消し済みに変わりますが、下のキャッシュされた許可レーンはその後も許可のままで、取り消し後の期間が網掛けされています。

権限を取り消した瞬間

  • 権限: 即座に取り消し
  • キャッシュの許可: まだ有効
開発者のための AWS セキュリティ活用

キャッシュされた許可は権限より長く残ることがある

同じ2本レーンのタイムラインで、取り消し時点とTTL失効までの期間が網掛けされ、「まだ許可」と記されています。権限は取り消されていますが、キャッシュされた許可はアクセスを許可し続けます。

その間の期間

  • 権限はなくなってもキャッシュには伝わらない
  • TTL が失効するまでアクセスは続く
開発者のための AWS セキュリティ活用

キャッシュされた許可は権限より長く残ることがある

同じ2本レーンのタイムラインに、網掛け部分を横切る矢印が示されています。TTLを短くすると失効が早まり、取り消し済みの権限がアクセスを許可し続ける期間が短くなります。

その期間をコントロールする

  • 迅速な取り消しが必要な場合は短いTTLを設定
  • 特に機密性の高いルートではTTLを0に
開発者のための AWS セキュリティ活用

正面玄関を通らない呼び出し元

アカウント内のサードパーティ

  • 作成したロールを引き受ける
  • ロール ARN を渡す

モニタリングベンダーが、上の2つの顧客ボックスと下の自分のロールの間に位置しています。自分のボックスはロールARNをベンダーに渡し、ベンダーはそのロールを引き受けます。2つ目の顧客ボックスはグレーアウトしており、まだ話に登場していません。

開発者のための AWS セキュリティ活用

正面玄関を通らない呼び出し元

アカウント内のサードパーティ

  • 作成したロールを引き受ける
  • ロール ARN を渡す

ロール ARN は秘密情報ではない

混乱した代理人問題

2つ目の顧客ボックスが赤色で表示され、あたかも自分のものであるかのようにロールARNを渡しています。モニタリングベンダーから自分のロールへ2本の矢印が伸びており、顧客ごとに1回の呼び出しですが、両者を区別する手段はありません。

開発者のための AWS セキュリティ活用

正面玄関を通らない呼び出し元

アカウント内のサードパーティ

  • 作成したロールを引き受ける
  • ロール ARN を渡す

ロール ARN は秘密情報ではない

混乱した代理人問題

対策: sts:ExternalId

  • ベンダーが顧客ごとに1つ生成
  • 信頼ポリシーで一致を要求

自分のロールには、外部IDが12345であることを要求する条件が設定されています。12345を伴う呼び出しはロールに到達しますが、99999を伴う呼び出しは到達前に赤い×印で阻止されます。

開発者のための AWS セキュリティ活用

練習しましょう!

開発者のための AWS セキュリティ活用

Preparing Video For Download...