保護你的 API
在 AWS 上開發應用程式
Ricardo Sueiras
Principal Technologist
在 AWS 上保護 API
- 保護 API 對雲端原生應用至關重要。
- API 會暴露敏感的業務功能。
- 通常是後端系統的公開入口。
- 使用 API Gateway 可安全對外提供 API。
授權與驗證
- 兩個關鍵概念:
- Authentication:你是誰。
- Authorization:你能做什麼。
IAM 授權
- API Gateway 可用 IAM 進行驗證與授權。
- 透過 Signature Version 4(SigV4)保護 API。
- 用戶端為每個請求簽章。
- API Gateway 在處理前會驗證簽章。
- 接著用 IAM 原則控管各身分可呼叫的資源。
- 最適合 AWS 服務彼此通訊。
Amazon Cognito authorizer
- Cognito 以 JSON Web Token(JWT)驗證使用者。
- 常見情境:行動 App、網頁 App、登入流程。
- 支援同盟身分。
- 可搭配 Google、Apple、Facebook 等外部提供者。
- 企業級提供者透過 SAML 或 OIDC。
- 原生驗證 JWT,無須自訂 authorizer 程式碼。
Lambda authorizer
- 以 Lambda 函式執行自訂授權邏輯。
- 回傳允許或拒絕存取的 IAM 原則。
- 可用來驗證自訂權杖。
- 可整合外部身分提供者。
- 可強制套用自訂規則。
Lambda authorizer
- 範例:驗證來自 Auth0 等提供者的 JWT。
- 請求到達時,API Gateway 會呼叫 authorizer。
- 函式驗證權杖並回傳 IAM 原則。
- 原則決定存取:允許或拒絕。
- 允許則將請求轉送至後端。
- 拒絕則 API Gateway 立即回傳 401。
該用哪種 authorizer
- 使用者導向的應用選 Cognito。
- 提供受管的註冊、登入與權杖驗證。
- 不需自訂程式碼。
- 需要自訂邏輯時選 Lambda。
- 適合第三方身分提供者。
- 或超出 Cognito 功能的規則。
Authorizer 快取
- Authorizer 回應會被快取。
- 可降低常用端點的延遲與成本。
- 可設定快取 TTL。
- 範圍 0 至 3600 秒。
- 預設為 300 秒。
- 將 TTL 設為 0 會停用快取。
API Gateway 資源原則
- 定義原則以控管誰能存取 API。
- 依 AWS 帳戶限制。
- 依 IP 範圍限制。
- 依 VPC 限制。
- 鎖定內部 API、降低暴露面。
加密
- API Gateway 預設支援具 TLS 的 HTTPS 端點。
- HTTPS 會加密用戶端與閘道間的傳輸資料。
- 可與 AWS Certificate Manager(ACM)整合。
- ACM 簡化自訂網域的憑證管理。
- 自訂網域憑證免費。
- 切勿以未加密的 HTTP 對外提供 API。
雙向 TLS(mTLS)
- API Gateway 支援雙向 TLS(mTLS)。
- 以憑證驗證用戶端。
- 需先設定網域名稱。
- 常見於機器對機器通訊。
- 彼此相互驗證身分。
API 節流與速率限制
- 節流可保護後端系統。
- 能提升 API 可靠度。
- 否則後端服務可能過載。
- 速率上限控管每秒穩定請求數。
- 突增上限允許短暫流量尖峰。
- 超出上限會回應
429 Too Many Requests。
防範常見攻擊
- 將 AWS WAF 掛載到 API Gateway。
- 在請求到達你的 API 前阻擋惡意流量。
- 阻擋 SQL 注入嘗試。
- 阻擋跨網站指令碼(XSS)。
- 封鎖已知惡意 IP 範圍的流量。
使用方案與 API 金鑰
- 控制用戶端如何使用你的 API。
- 設定請求額度。
- 定義速率上限。
- 設定訂閱等級。
- 指定每個用戶端的使用上限。
跨來源資源共用(CORS)
- CORS 允許瀏覽器進行跨網域 API 請求。
- 沒有它,合法的瀏覽器請求可能被封鎖。
- CORS 過度寬鬆會有安全風險。
- 產品環境避免使用
Access-Control-Allow-Origin: *。
- 一定要將 CORS 限縮到信任的來源。
CORS 標頭與預檢請求
- 預檢
OPTIONS 請求會先於實際請求執行。
- 用來確認 API 允許跨網域存取。
- API Gateway 會加入必要的 CORS 回應標頭。
- 對 Non-Proxy 整合會自動處理。
- 對 Proxy 整合需由你的 Lambda 回傳 CORS 標頭。
- 你的 Lambda 也必須處理預檢的
OPTIONS。
Preparing Video For Download...