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

限制對 Application Load Balancers 的存取

對於在 Elastic Load Balancing 中由 Application Load Balancer 提供的 Web 應用程式或其他內容,CloudFront 可以快取物件並直接提供給使用者 (檢視器),以減少 Application Load Balancer 的負載。CloudFront 還可以幫助減少延遲,甚至吸收一些分散式阻斷服務 (DDoS) 攻擊。但是,如果使用者可以略過 CloudFront 並直接存取您的 Application Load Balancer,您就無法獲得這些好處。但是,您可以設定 Amazon CloudFront 和 Application Load Balancer,以防止使用者直接存取 Application Load Balancer。這讓使用者只能透過 CloudFront 存取 Application Load Balancer,確保您能夠享有使用 CloudFront 的好處。

若要防止使用者直接存取 Application Load Balancer,並僅允許透過 CloudFront 存取,請完成下列高階步驟:

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

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

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

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

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

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

重要

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

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

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

在 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. 在 Amazon EC2 主控台中開啟負載平衡器頁面

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

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

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

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

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

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

    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 的請求會傳回純文字訊息 Access denied403 回應。

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

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

針對來源請求使用 HTTPS

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

當您將 CloudFront 設定為針對來源請求使用 HTTPS 時,您需要確定您的 Application Load Balancer 具有 HTTPS 接聽程式 (如前一章節所示)。這需要您擁有與路由至 Application Load Balancer 的網域名稱相符的 SSL/TLS 憑證。如需詳細資訊,請參閱 Application Load Balancer 使用者指南中的建立 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 標頭的請求。

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