選擇 API Gateway 授權器

AWS Security 開發者實務

Rahul Singh

Technical Product Manager

程式碼執行前先檢查

來電者會先經過 API Gateway 授權器才到你的程式碼,被拒絕的來電者會以 401 被擋下。

通過: 請求會到達你的程式碼

未通過: 401 未授權,你的程式碼不會執行

AWS Security 開發者實務

誰來檢查

三種授權器可選
  1. IAM 授權(AWS_IAM):AWS 檢查簽章

一個垂直堆疊,從上到下是由 AWS 檢查到由你檢查。目前只填了第一張卡:IAM 授權,AWS 檢查簽章。

AWS Security 開發者實務

誰來檢查

三種授權器可選
  1. IAM 授權(AWS_IAM):AWS 檢查簽章
  2. Cognito 授權器(COGNITO_USER_POOLS):AWS 驗證權杖
    • 簽章、iss、aud、exp

同樣的垂直堆疊,已填兩張卡:IAM 授權(AWS 檢查簽章)與 Cognito 授權器(AWS 驗證權杖)。

AWS Security 開發者實務

誰來檢查

三種授權器可選
  1. IAM 授權(AWS_IAM):AWS 檢查簽章
  2. Cognito 授權器(COGNITO_USER_POOLS):AWS 驗證權杖
    • 簽章、iss、aud、exp
  3. Lambda 授權器:你的函式回傳允許或拒絕
    • 用於非 Cognito 的權杖

三種授權器由上到下:IAM 授權(AWS 檢查簽章)、Cognito 授權器(AWS 驗證權杖)、Lambda 授權器(你撰寫檢查邏輯)。

AWS Security 開發者實務

替呼叫者配對正確大門

 

由呼叫者決定

 

  • 內部服務: 已持有 AWS 認證

三列對應中的第一列:內部服務對應到 IAM 授權。

AWS Security 開發者實務

替呼叫者配對正確大門

 

由呼叫者決定

 

  • 內部服務: 已持有 AWS 認證
  • App 使用者: 攜帶 Cognito 權杖

三列對應中的前兩列:內部服務對應 IAM 授權;App 使用者對應 Cognito 授權器。

AWS Security 開發者實務

替呼叫者配對正確大門

 

由呼叫者決定

 

  • 內部服務: 已持有 AWS 認證
  • App 使用者: 攜帶 Cognito 權杖
  • 合作夥伴 App: 自帶授權邏輯

三種呼叫者對應所需授權器:內部服務配 IAM 授權、App 使用者配 Cognito 授權器、合作夥伴 App 配 Lambda 授權器。

AWS Security 開發者實務

留意 API 類型

REST API

  • 三種授權器皆支援,另有資源政策
  • API 金鑰、每用戶端節流、請求驗證、WAF

REST API 比較卡,勾選了 IAM 授權、Cognito 使用者池授權器、Lambda 授權器與資源政策。旁邊的 HTTP API 卡尚未填寫。

AWS Security 開發者實務

留意 API 類型

REST API

  • 三種授權器皆支援,另有資源政策
  • API 金鑰、每用戶端節流、請求驗證、WAF

 

HTTP API

  • JWT 授權器,支援任一 OIDC issuer
  • 不支援資源政策;更省、更快

兩張卡比較各 API 類型支援的授權器:REST API 另有資源政策;HTTP API 以 JWT 授權器取代 Cognito 授權器,且無資源政策。

AWS Security 開發者實務

授權器會記得結果

用快取省時間

  • 第一次呼叫:執行授權器
  • 後續呼叫:讀取快取結果

第一次呼叫會執行授權器並將 allow 寫入具存活時間的快取;之後的呼叫直接讀快取,不再重跑授權器。

AWS Security 開發者實務

授權器會記得結果

用快取省時間

  • 第一次呼叫:執行授權器
  • 後續呼叫:讀取快取結果

 

快取 TTL

  • authorizerResultTtlInSeconds:預設 300s,最大 3600s
  • 設為 0 會停用快取

第一次呼叫會執行授權器並將 allow 寫入具存活時間的快取;之後的呼叫直接讀快取,不再重跑授權器。

AWS Security 開發者實務

快取的 allow 可能比權限活得久

雙軌時間線。權限軌在撤銷點變為 revoked;下方的快取 allow 軌在該點之後仍顯示 allow,撤銷後的區間有底色。

你撤銷當下

  • 權限:立即撤銷
  • 快取的 allow:仍在放行
AWS Security 開發者實務

快取的 allow 可能比權限活得久

同一雙軌時間線,撤銷點與 TTL 到期間的區間以底色標示,說明權限已撤銷但快取 allow 仍授權。

中間這段時間窗

  • 權限已失效,快取未得知
  • 可存取直到 TTL 到期
AWS Security 開發者實務

快取的 allow 可能比權限活得久

同一雙軌時間線,箭頭跨越底色區,顯示較短的 TTL 會提前到期並縮短撤銷後仍可存取的區間。

控管這段時間窗

  • 需要快速撤銷時用短 TTL
  • 最敏感路由設 TTL 為 0
AWS Security 開發者實務

有一種呼叫不經前門

第三方在你的帳戶內

  • 承接你建立的角色(assume role)
  • 你交付該角色 ARN

一個監控供應商位於上方兩個客戶方塊與下方你的角色之間。你的方塊將角色 ARN 交給供應商,供應商 assume 你的角色。第二個客戶方塊呈灰色,尚未進入情節。

AWS Security 開發者實務

有一種呼叫不經前門

第三方在你的帳戶內

  • 承接你建立的角色(assume role)
  • 你交付該角色 ARN

角色 ARN 不是機密

Confused deputy 問題

第二個客戶方塊現在以紅色啟用,並交付你的角色 ARN 冒充自己的。從監控供應商到你的角色出現兩支箭頭(每客戶一通),且彼此無從分辨。

AWS Security 開發者實務

有一種呼叫不經前門

第三方在你的帳戶內

  • 承接你建立的角色(assume role)
  • 你交付該角色 ARN

角色 ARN 不是機密

Confused deputy 問題

修正方式:sts:ExternalId

  • 供應商為每位客戶產生一個
  • 你的信任政策要求必須匹配

你的角色現在要求 external ID 必須等於 12345。帶 12345 的呼叫可到達角色,帶 99999 的呼叫在到達前即被紅叉擋下。

AWS Security 開發者實務

一起來練習吧!

AWS Security 開發者實務

Preparing Video For Download...