限制對 Application Load Balancer 的存取 - Amazon CloudFront

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

限制對 Application Load Balancer 的存取

您可以將內部和面向網際網路的 Application Load Balancer 與 Amazon CloudFront 搭配使用。您可以使用 VPC 原始伺服器,將私有子網路內的內部 Application Load Balancer 與 CloudFront 搭配使用。CloudFront VPC 原始伺服器可讓您從私有 VPC 子網路中託管的應用程式提供內容,而無需將其公開至公有網際網路。如需詳細資訊,請參閱使用 VPC 原始伺服器限制存取

如果您使用面向網際網路的 Application Load Balancer 搭配 CloudFront,您可以使用下列安全性緩解措施來防止使用者直接存取 Application Load Balancer,並僅允許透過 CloudFront 存取。

  1. 設定 CloudFront 將自訂 HTTP 標頭新增至其傳送至 Application Load Balancer 的要求。

  2. 將 Application Load Balancer 設定為僅轉寄包含自訂 HTTP 標頭的請求。

  3. 需要 HTTPS 才能改善此解決方案的安全性。

CloudFront 還可以幫助減少延遲,甚至吸收一些分散式阻斷服務 (DDoS) 攻擊。

如果您的使用案例需要透過網際網路直接從 CloudFront 和 Application Load Balancer 雙重存取 Web 應用程式,請考慮分割您的 Web 應用程式 APIs,如下所示:

  • 必須通過 CloudFront APIs。在此情況下,請考慮使用個別的私有 Application Load Balancer 做為原始伺服器。

  • 需要透過 Application Load Balancer 存取APIs。在此情況下,您會略過 CloudFront。

或者,對於 Elastic Load Balancing 中面向網際網路的 Application Load Balancer 提供的 Web 應用程式或其他內容,CloudFront 可以快取物件並將其直接提供給使用者 (檢視者),從而減少 Application Load Balancer 上的負載。面向網際網路的負載平衡器具有可公開解析的 DNS 名稱,並透過網際網路將請求從用戶端路由到目標。

如需詳細資訊,請參閱下列主題。完成這些步驟後,使用者只能透過 CloudFront 存取您的 Application Load Balancer。

設定 CloudFront 將自訂 HTTP 標頭新增至請求

您可以將 CloudFront 設定為將自訂 HTTP 標頭新增至其傳送至來源的請求 (在本例中為 Application Load Balancer)。

重要

此用例依賴於保留自訂標頭名稱和值密碼。如果標頭名稱和值不是密碼,其他 HTTP 用戶端可能會將它們包含在直接傳送至 Application Load Balancer 的請求中。這可能會導致 Application Load Balancer 的運作方式如同來自 CloudFront 的請求一樣,即便當它們並非來自於此。若要防止這種情況,請保留自訂標頭名稱和值密碼。

您可以使用 CloudFront 主控台 AWS CloudFormation或 CloudFront API,設定 CloudFront 將自訂 HTTP 標頭新增至原始伺服器請求。

新增自訂 HTTP 標頭 (CloudFront 主控台)

在 CloudFront 主控台中,使用原始伺服器設定中的原始伺服器自訂標頭設定。輸入標頭名稱及其

注意

在生產環境中,使用隨機產生的標頭名稱和值。將標頭名稱和值視為安全登入資料,例如使用者名稱和密碼。

當您建立或編輯現有 CloudFront 發佈的來源,以及建立新發佈時,您可以編輯來源自訂標頭設定。如需詳細資訊,請參閱更新分佈建立分發

新增自訂 HTTP 標頭 (AWS CloudFormation)

在 AWS CloudFormation 範本中,使用 OriginCustomHeaders 屬性,如下列範例所示。

注意

此範例中的標頭名稱和值僅為演示。在生產中,使用隨機產生的值。將標頭名稱和值視為安全登入資料,如使用者名稱和密碼。

AWSTemplateFormatVersion: '2010-09-09' Resources: TestDistribution: Type: 'AWS::CloudFront::Distribution' Properties: DistributionConfig: Origins: - DomainName: app-load-balancer.example.com Id: Example-ALB CustomOriginConfig: OriginProtocolPolicy: https-only OriginSSLProtocols: - TLSv1.2 OriginCustomHeaders: - HeaderName: X-Custom-Header HeaderValue: random-value-1234567890 Enabled: 'true' DefaultCacheBehavior: TargetOriginId: Example-ALB ViewerProtocolPolicy: allow-all CachePolicyId: 658327ea-f89d-4fab-a63d-7e88639e58f6 PriceClass: PriceClass_All ViewerCertificate: CloudFrontDefaultCertificate: 'true'

如需詳細資訊,請參閱AWS CloudFormation 《 使用者指南》中的 OriginOriginCustomHeader 屬性。

新增自訂 HTTP 標頭 (CloudFront API)

在 CloudFront API 中,使用 Origin 中的 CustomHeaders 物件。如需詳細資訊,請參閱《Amazon CloudFront API 參考》中的 CreateDistributionUpdateDistribution,以及 SDK 或其他 API 用戶端的文件。

有一些標頭名稱不能指定為來源自訂標頭。如需詳細資訊,請參閱CloudFront 無法新增到原始伺服器請求的自訂標頭

設定 Application Load Balancer 僅轉送包含特定標頭的請求

將 CloudFront 設定為將自訂 HTTP 標頭新增至其傳送至 Application Load Balancer 的請求之後 (請參閱上一章節),您可以將負載平衡器設定為僅轉寄包含此自訂標頭的請求。您可以透過在負載平衡器的接聽程式中新增規則並修改預設規則來執行此動作。

先決條件

若要使用下列程序,您必須具有至少一個接聽程式的 Application Load Balancer。如果您尚未建立,請參閱《Application Load Balancer 使用者指南》中的建立 Application Load Balancer

下列程序會修改 HTTPS 接聽程式。您可以使用相同的程序來修改 HTTP 接聽程式。

更新 Application Load Balancer 接聽程式中的規則
  1. 新增規則。使用新增規則中的指示,進行下列修改:

    • 將規則新增至 CloudFront 分佈原始伺服器的負載平衡器。

    • 針對新增條件,選擇 Http 標頭。指定您在 CloudFront 中新增為來源自訂標頭的 HTTP 標頭名稱和值。

    • 對於新增動作,選擇轉送至。選擇要轉寄請求的目標群組。

  2. 編輯負載平衡器接聽程式中的預設規則。使用編輯規則中的指示,進行下列修改:

    • 編輯 CloudFront 分佈原始伺服器的負載平衡器預設規則。

    • 刪除預設動作,然後針對新增動作,選擇傳回固定回應

    • 回應代碼中,輸入 403

    • 回應主體中,輸入 Access denied

完成這些步驟後,您的負載平衡器接聽程式有兩個規則。一個規則轉送包含 HTTP 標頭的請求 (來自 CloudFront 的請求)。另一個規則會將固定回應傳送至所有其他請求 (不是來自 CloudFront 的請求)。

您可以將請求傳送至您的 CloudFront 發佈,並傳送一個請求至您的 Application Load Balancer,以驗證解決方案是否正常運作。對 CloudFront 的請求會傳回您的 Web 應用程式或內容,而直接傳送給 Application Load Balancer 的請求會傳回純文字訊息 Access denied403 回應。

(選用) 改善此解決方案的安全性

為了改善此解決方案的安全性,您可以將 CloudFront 發佈設定為在向 Application Load Balancer 傳送請求時始終使用 HTTPS。請記住,此解決方案僅適用於保留自訂標頭名稱和值密碼的情況下。使用 HTTPS 有助於防止竊聽者發現標頭名稱和值。我們也建議定期輪換標頭名稱和值。

針對來源請求使用 HTTPS

若要將 CloudFront 設定為針對來源請求使用 HTTPS,請將來源協定政策設定設定為僅限 HTTPS。此設定可在 CloudFront 主控台 AWS CloudFormation和 CloudFront API 中使用。如需詳細資訊,請參閱通訊協定 (僅限自訂原始伺服器)

當您設定 CloudFront 將 HTTPS 用於原始伺服器請求時,也適用下列條件:

  • 您必須設定 CloudFront,以使用原始伺服器請求政策將Host標頭轉送至原始伺服器。您可以使用 AllViewer 受管原始伺服器請求政策

  • 請確定您的 Application Load Balancer 具有 HTTPS 接聽程式 (如上一節所示)。如需詳細資訊,請參閱《Application Load Balancer 使用者指南》中的建立 HTTPS 接聽程式。使用 HTTPS 接聽程式需要您擁有符合路由至 Application Load Balancer 之網域名稱的 SSL/TLS 憑證。

  • CloudFront 的 SSL/TLS 憑證只能在 us-east-1 AWS 區域 in(ACM) 中請求 AWS Certificate Manager (或匯入)。由於 CloudFront 是全域服務,因此會自動將憑證從 us-east-1區域分佈到與您的 CloudFront 分佈相關聯的所有區域。

    • 例如,如果您在 ap-southeast-2區域中有 Application Load Balancer (ALB),則必須在 ap-southeast-2區域 (適用於在 CloudFront 和 ALB 原始伺服器之間使用 HTTPS) 和 us-east-1區域 (適用於在檢視器和 CloudFront 之間使用 HTTPS) 中設定 SSL/TLS 憑證。這兩個憑證都應該符合路由至 Application Load Balancer 的網域名稱。如需詳細資訊,請參閱AWS 區域 適用於 AWS Certificate Manager

  • 如果 Web 應用程式的最終使用者 (也稱為檢視器用戶端) 可以使用 HTTPS,您也可以將 CloudFront 設定為偏好 (甚至需要) 來自最終使用者的 HTTPS 連線。若要這樣做,請使用檢視器協定政策設定。您可以將它設定為將最終使用者從 HTTP 重新導向至 HTTPS,或拒絕使用 HTTP 的請求。此設定可在 CloudFront 主控台 AWS CloudFormation和 CloudFront API 中使用。如需詳細資訊,請參閱檢視器通訊協定政策

輪換標頭名稱和值

除了使用 HTTPS 之外,我們還建議定期輪換標頭名稱和值。執行這項操作的高階步驟如下:

  1. 設定 CloudFront 將其他自訂 HTTP 標頭新增至其傳送至 Application Load Balancer 的請求。

  2. 更新 Application Load Balancer 接聽程式規則,以轉寄包含此其他自訂 HTTP 標頭的請求。

  3. 設定 CloudFront 停止將來源自訂 HTTP 標頭新增至其傳送至 Application Load Balancer 的請求。

  4. 更新 Application Load Balancer 接聽程式規則,以停止轉寄包含來源自訂 HTTP 標頭的請求。

如需完成這些步驟的詳細資訊,請參閱前一章節。

(選用) 使用 CloudFront AWS的受管字首清單限制對原始伺服器的存取

若要進一步限制對 Application Load Balancer 的存取,您可以設定與 Application Load Balancer 相關聯的安全群組,以便在服務使用 受管字首清單時,只接受來自 CloudFront AWS的流量。這可防止不是來自 CloudFront 的流量在網路層 (第 3 層) 或傳輸層 (第 4 層) 到達 Application Load Balancer。

如需詳細資訊,請參閱使用 AWS Amazon CloudFront 部落格文章的受管字首清單限制對原始伺服器的存取