概觀

公開私人內容的 Web 應用程式需要存取控制機制,以確保只有授權的使用者才能存取內容。範例包括需要使用者驗證的基於 SPA 的內部入口網站以及下載機密檔案。存取控制可根據使用案例在來源層級或 CDN 層級實施。

常見使用案例

以來源為基礎的授權

如果您使用 CloudFront 作為反向 Proxy 且未啟用快取 (即在受管快取政策設定停用快取功能),那麼您只需使用來源的原生授權功能 (例如 API Gateway)。為了使其正常運作,請設定來源請求原則,用於將帶有授權資訊 (例如授權標頭) 的請求屬性轉送到您的來源。

如果您的內容可快取,但您希望繼續在自己的基礎架構管理授權,請考慮使用 Lambda@Edge 將 CloudFront 與授權伺服器整合。此架構可讓您從 CloudFront 快取受益。在此部落格瞭解有關此實作的更多資訊。

如果要將授權邏輯從 Web 應用程式元件卸載到 CloudFront,請考慮下列部分。

使用簽名權杖進行以 CloudFront 為基礎的授權

CloudFront 提供使用已簽署 URL 或已簽署 Cookie 的原生授權機制。若要使用此方法,請遵循文件說明的步驟

  • 使用簽署金鑰群組,設定非對稱加密金鑰來簽署權杖。
  • 在驗證工作流程,在提供的資源 URL 的查詢參數或 Cookie 中追加所需的權杖欄位。權杖包含到期日期、簽署金鑰 ID、政策與簽章。此政策可讓您定義請求透過 CloudFront 的權杖驗證測試所需滿足的條件。例如,您可以使用自訂政策,來產生對以特定路徑開頭的所有 URL 有效的權杖。
  • 在 CloudFront 用於私人內容的快取行為啟用簽章。之後,所有請求都將由 CloudFront 控制進行權杖驗證。未經授權的請求會收到 403 錯誤碼,可使用 CloudFront 的自訂錯誤頁面功能進行自訂。

使用 aws-sdk 運用私密金鑰來產生有效的權杖。作為說明,Nodejs 的以下程式碼為特定物件產生一個 CloudFront 簽署 URL,edge-image.jpg 的有效期限為兩小時。

const AWS = require('aws-sdk');

// It's recommended not to store signing keys in code. The below is just an illustrative example.
const cloudfrontAccessKeyId = 'K25ULYFPSTHQP9';
const cloudFrontPrivateKey = '-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQ....2gvvIH\n-----END RSA PRIVATE KEY-----';

const signer = new AWS.CloudFront.Signer(cloudfrontAccessKeyId, cloudFrontPrivateKey);
const signedUrl = signer.getSignedUrl({
  url: 'https://d3jqlnxofenq2x.cloudfront.net/edge-image.jpg',
  expires: Math.floor((Date.now() + 2 * 60 * 60 * 1000) / 1000),
});
console.log(signedUrl);

上述程式碼片段的輸出如下所示:

https://d3jqlnxofenq2x.cloudfront.net/edge-image.jpg?Expires=1660317158&Key-Pair-Id=K25ULYFP9THQP9&Signature=agW2XF9S5AW0YCc6c7pkCwccJmxaIAWFO~uXn9KtOXtz4JTY7eRF07opJiseGXJxzlMeD4V6FUH8I-gOH~Gvafa16RFV9IryxCyzL9mIYt-XbDKMrY0ONzTWUk2x16AKDK27VoUwEPiI9dpPXMp7f4MsrpKA-u6huZCsulh0~aAYN~x25uNoDO-WgZpfkKFeKc910u4PVnEaKLlZlpuJ0hqWUjMVPes9DfA~msToJeyjrVzLi2R8O8LuuYHsAMAHXr7E9qB8tAoDWz24CurCirxc6sB45Zc-oK9JigX0L4~F~F1TE9i39ysmQF4UrOyu0bp7MKGSDBwLE1P2C3gWNw__

使用 CloudFront Functions 進行以 CloudFront 為基礎的授權

如果 CloudFront 的原生簽署權杖不符合您的授權要求,則可以使用邊緣函數建立自訂授權邏輯。例如,您可能想要使用不同的加密技術來簽署權杖 (例如對稱加密技術),或者您可能想要在簽名中包含非標準屬性 (例如使用者代理標頭),或者您可能想要根據使用者網路來實作條件式記號化邏輯。下列自訂實作說明邊緣函數的一些可能性:

  • CloudFront Functions 用於驗證基於 JWT 的權杖。請注意,CloudFront Functions 目前不允許外部網路呼叫,因此,簽署金鑰需要儲存在函數程式碼中。為了降低在 CloudFront Function 程式碼儲存簽署金鑰的風險,請勿手動設定程式碼的金鑰,而應在部署到 CloudFront 之前,使用輪替金鑰並產生函數程式碼的自動化功能。這樣,金鑰就不會面臨被上傳到 Github 等公共儲存庫的風險。
  • AWS 解決方案:保護在邊緣進行的媒體交付。此 AWS 解決方案使用 CloudFront Function 來實作適合視訊串流的自訂授權機制。
  • 使用 OpenID Connect 對 S3 託管的單頁應用程式進行身分驗證。這些解決方案使用 AWS Secrets Manager 來儲存簽署金鑰,並可與 Cognito 或 Okta 等外部身分提供者 (IdP) 一起使用。此實作在 CloudFront Functions 發布之前就已發布,這就是它完全依賴 Lambda@Edge 的原因。它可以進行最佳化,以使用 CloudFront Functions 作為授權部分,以及 Lambda@Edge 用於與 IDP 的整合。

資源

本頁對您是否有幫助?