保護你的 API

在 AWS 上開發應用程式

Ricardo Sueiras

Principal Technologist

在 AWS 上保護 API

 

保護 API

  • 保護 API 對雲端原生應用至關重要。
  • API 會暴露敏感的業務功能。
  • 通常是後端系統的公開入口。
  • 使用 API Gateway 可安全對外提供 API。
在 AWS 上開發應用程式

授權與驗證

 

驗證與授權

  • 兩個關鍵概念:
  • Authentication:你是誰。
  • Authorization:你能做什麼。
在 AWS 上開發應用程式

IAM 授權

 

IAM

  • API Gateway 可用 IAM 進行驗證與授權。
  • 透過 Signature Version 4(SigV4)保護 API。
  • 用戶端為每個請求簽章。
  • API Gateway 在處理前會驗證簽章。
  • 接著用 IAM 原則控管各身分可呼叫的資源。
  • 最適合 AWS 服務彼此通訊。
在 AWS 上開發應用程式

Amazon Cognito authorizer

  • Cognito 以 JSON Web Token(JWT)驗證使用者。
  • 常見情境:行動 App、網頁 App、登入流程。
  • 支援同盟身分。
  • 可搭配 Google、Apple、Facebook 等外部提供者。
  • 企業級提供者透過 SAML 或 OIDC。
  • 原生驗證 JWT,無須自訂 authorizer 程式碼。

 

Cognito 授權

在 AWS 上開發應用程式

Lambda authorizer

  • 以 Lambda 函式執行自訂授權邏輯。
  • 回傳允許或拒絕存取的 IAM 原則。
  • 可用來驗證自訂權杖。
  • 可整合外部身分提供者。
  • 可強制套用自訂規則。

 

Lambda authorizer

在 AWS 上開發應用程式

Lambda authorizer

  • 範例:驗證來自 Auth0 等提供者的 JWT。
  • 請求到達時,API Gateway 會呼叫 authorizer。
  • 函式驗證權杖並回傳 IAM 原則。
  • 原則決定存取:允許或拒絕。
  • 允許則將請求轉送至後端。
  • 拒絕則 API Gateway 立即回傳 401。

 

Lambda authorizer

在 AWS 上開發應用程式

該用哪種 authorizer

 

選擇哪種 authorizer

  • 使用者導向的應用選 Cognito。
  • 提供受管的註冊、登入與權杖驗證。
  • 不需自訂程式碼。
  • 需要自訂邏輯時選 Lambda。
  • 適合第三方身分提供者。
  • 或超出 Cognito 功能的規則。
在 AWS 上開發應用程式

Authorizer 快取

 

快取授權

  • Authorizer 回應會被快取。
  • 可降低常用端點的延遲與成本。
  • 可設定快取 TTL。
  • 範圍 0 至 3600 秒。
  • 預設為 300 秒。
  • 將 TTL 設為 0 會停用快取。
在 AWS 上開發應用程式

API Gateway 資源原則

 

資源原則

  • 定義原則以控管誰能存取 API。
  • 依 AWS 帳戶限制。
  • 依 IP 範圍限制。
  • 依 VPC 限制。
  • 鎖定內部 API、降低暴露面。
在 AWS 上開發應用程式

加密

  • API Gateway 預設支援具 TLS 的 HTTPS 端點。
  • HTTPS 會加密用戶端與閘道間的傳輸資料。
  • 可與 AWS Certificate Manager(ACM)整合。
  • ACM 簡化自訂網域的憑證管理。
  • 自訂網域憑證免費。
  • 切勿以未加密的 HTTP 對外提供 API。

 

加密

在 AWS 上開發應用程式

雙向 TLS(mTLS)

 

  • API Gateway 支援雙向 TLS(mTLS)。
  • 以憑證驗證用戶端。
  • 需先設定網域名稱。
  • 常見於機器對機器通訊。
  • 彼此相互驗證身分。

 

mTLS

在 AWS 上開發應用程式

API 節流與速率限制

  • 節流可保護後端系統。
  • 能提升 API 可靠度。
  • 否則後端服務可能過載。
  • 速率上限控管每秒穩定請求數。
  • 突增上限允許短暫流量尖峰。
  • 超出上限會回應 429 Too Many Requests

 

節流

在 AWS 上開發應用程式

防範常見攻擊

 

WAF

  • 將 AWS WAF 掛載到 API Gateway。
  • 在請求到達你的 API 前阻擋惡意流量。
  • 阻擋 SQL 注入嘗試。
  • 阻擋跨網站指令碼(XSS)。
  • 封鎖已知惡意 IP 範圍的流量。
在 AWS 上開發應用程式

使用方案與 API 金鑰

 

使用方案

  • 控制用戶端如何使用你的 API。
  • 設定請求額度。
  • 定義速率上限。
  • 設定訂閱等級。
  • 指定每個用戶端的使用上限。
在 AWS 上開發應用程式

跨來源資源共用(CORS)

 

CORS

  • CORS 允許瀏覽器進行跨網域 API 請求。
  • 沒有它,合法的瀏覽器請求可能被封鎖。
  • CORS 過度寬鬆會有安全風險。
  • 產品環境避免使用 Access-Control-Allow-Origin: *
  • 一定要將 CORS 限縮到信任的來源。
在 AWS 上開發應用程式

CORS 標頭與預檢請求

  • 預檢 OPTIONS 請求會先於實際請求執行。
  • 用來確認 API 允許跨網域存取。
  • API Gateway 會加入必要的 CORS 回應標頭。
  • 對 Non-Proxy 整合會自動處理。
  • 對 Proxy 整合需由你的 Lambda 回傳 CORS 標頭。
  • 你的 Lambda 也必須處理預檢的 OPTIONS

 

CORS 標頭

在 AWS 上開發應用程式

一起來練習吧!

在 AWS 上開發應用程式

Preparing Video For Download...