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

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

限制對 Application Load Balancers 的存取

對於在 Elastic Load Balancing 中由應用程式負載平衡器提供的 Web 應用程式或其他內容, CloudFront 可以快取物件並直接提供給使用者 (檢視者),從而減少應用程式負載平衡器的負載。 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 自訂標頭

將 Application Load Balancer 設定為僅轉寄包含特定標頭的請求

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

必要條件

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

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

更新 Application Load Balancer 接聽程式中的規則
  1. 在 Amazon EC2 主控台中開啟負載平衡器頁面

  2. 選擇作為 CloudFront 發行版本來源的負載平衡器,然後選擇「接聽程式」索引標籤。

  3. 針對您要修改的接聽程式,請選擇檢視/編輯規則

    
                        在 Amazon EC2 主控台中檢視/編輯負載平衡器的規則連結。
  4. 選擇圖示以新增規則。

    
                        將規則新增至 Amazon EC2 主控台中的負載平衡器。
  5. 選擇 Insert Rule (插入規則)

    
                        在 Amazon EC2 主控台的負載平衡器中插入規則。
  6. 對於新規則,請執行下列動作:

    1. 選擇新增條件,然後選擇 HTTP 標頭。指定您在中新增為原始自訂標頭的 HTTP 標頭名稱和值 CloudFront。

    2. 選擇新增動作,然後選擇轉寄至。選擇要轉寄請求的目標群組。

    3. 選擇儲存以建立新規則。

    
                        Amazon EC2 主控台的負載平衡器中的新規則。
  7. 選擇圖示以編輯規則。

    
                        在 Amazon EC2 主控台中編輯負載平衡器的規則。
  8. 選擇預設規則的編輯圖示。

    
                        在 Amazon EC2 主控台中編輯負載平衡器的預設規則。
  9. 針對預設規則,請執行下列動作:

    1. 刪除預設動作。

      
                                在 Amazon EC2 主控台中刪除負載平衡器的預設規則。
    2. 選擇新增動作,然後選擇傳回固定回應

    3. 回應代碼中,輸入 403

    4. 回應主體中,輸入 Access denied

    5. 選擇更新以更新預設規則。

    
                        更新 Amazon EC2 主控台中負載平衡器的預設規則。

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


                已更新 Amazon EC2 主控台中負載平衡器的規則。

您可以將要求傳送至您的 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 時,您必須確定 Application Load Balancer 具有 HTTPS 接聽程式 (如前一節所示)。這需要您擁有與路由至 Application Load Balancer 的網域名稱相符的 SSL/TLS 憑證。如需詳細資訊,請參閱應用程式負載平衡器使用者指南中的建立 HTTPS 接聽程式

如果 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 標頭的請求。

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