限制對應用程式負載平衡器的存取 - Amazon CloudFront

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

限制對應用程式負載平衡器的存取

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

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

但是,如果使用者可以直接略過 CloudFront 並存取您的 Application Load Balancer,您將無法獲得這些好處。但是您可以設定 Amazon CloudFront 和 Application Load Balancer,以防止使用者直接存取應用程式負載平衡器。這讓使用者只能透過以下方式存取 Application Load Balancer CloudFront,確保您獲得使用的好處 CloudFront。

若要防止使用者直接存取應用程式負載平衡器並僅允許透過存取 CloudFront,請完成下列高階步驟:

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

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

  3. (選用) 需要 HTTPS 來改善此解決方案的安全性。

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

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

您可以設定 CloudFront 為將自訂 HTTP 標頭新增至傳送至原始伺服器的要求 (在本例中為 Application Load Balancer)。

重要

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

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

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

在 CloudFront 主控台中,使用 Origin 設定中的 Origin 自訂標題定。輸入標頭名稱及其,如下列範例所示。

注意

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

CloudFront主控台中的「原始自訂標頭」欄位。

當您為現有發行版建立或編輯原點時,以及建立新 CloudFront 發佈時,您可以編輯 Origin 自訂標題設定。如需詳細資訊,請參閱 更新分佈建立分發

新增自訂 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 使用指南》中的原點OriginCustomHeader性質。

若要新增自訂 HTTP 標頭 (CloudFront API)

在 CloudFront API 中,使用裡面的CustomHeaders對象Origin。如需詳細資訊,請參閱 CreateDistributionAmazon CloudFront API 參考UpdateDistribution中的和,以及您的開發套件或其他 API 用戶端的說明文件。

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

將應用程式負載平衡器設定為僅轉寄包含特定標頭的要求

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

必要條件

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

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

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

    • 將規則新增至負載平衡器,該平衡器為您的 CloudFront 發佈的原點。

    • 在「新增條件」中,選擇「HTTP 標頭」。指定您在中新增為原始自訂標頭的 HTTP 標頭名稱和值 CloudFront。

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

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

    • 編輯負載平衡器的預設規則,該規則是您 CloudFront 發佈的原點。

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

    • 回應代碼中,輸入 403

    • 回應主體中,輸入 Access denied

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

您可以將要求傳送至您的 CloudFront 散發,並傳送至您的 Application Load Balancer,以驗證解決方案是否有效。傳 CloudFront 回 Web 應用程式或內容的要求,而直接傳送至 Application Load Balancer 的要求會傳回含純文字訊息的回403Access denied

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

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

針對來源請求使用 HTTPS

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

當您設定 CloudFront 為針對原始要求使用 HTTPS 時,下列條件也適用:

  • 您必須設定 CloudFront 使用原始要求原則將Host標頭轉寄至原始位置。您可以使用AllViewer 受管理的來源請求策略

  • 請確定您的 Application Load Balancer 具有 HTTPS 接聽程式 (如前一節所示)。如需詳細資訊,請參閱應用程式負載平衡器使用者指南中的建立 HTTPS 接聽程式。使用 HTTPS 接聽程式時,您必須擁有與路由到 Application Load Balancer 的網域名稱相符的 SSL/TLS 憑證。

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

    • 例如,如果您在區域中有 Application Load Balancer (ALB),則必須同時在ap-southeast-2區域 (用於在和 ALB 來源之間使用 HTTPS) 和ap-southeast-2區域 (用於在檢視器 CloudFront 和之間使用 HTTPS) 中us-east-1設定 SSL/TLS 憑證。 CloudFront這兩個憑證都應與路由到應 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 標頭的請求。

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

(選擇性) 透過使用 AWS-managed 前置詞清單來限制對原點的存取 CloudFront

若要進一步限制對 Application Load Balancer 的存取,您可以設定與 Application Load Balancer 相關聯的安全性群組,以便僅接受服務使用 AWS-managed 前置詞清單 CloudFront 時來自的流量。如此可防止非源 CloudFront 自網路層 (第 3 層) 或傳輸層 (第 4 層) 的流量到達您的 Application Load Balancer。

如需詳細資訊,請參閱使用 Amazon CloudFront 部落格文章的 AWS-managed 前置詞清單限制對您來源的存取。