限制對 Amazon Simple Storage Service 原始伺服器的存取 - Amazon CloudFront

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

限制對 Amazon Simple Storage Service 原始伺服器的存取

CloudFront 提供兩種方式,將驗證請求傳送至 Amazon S3 原始伺服器:原始存取控制(OAC) 和原始存取身分 (OAI)。OAC 可協助您保護原始伺服器,例如 for Amazon S3。我們建議使用 OAC,因為其支援:

原始存取身分 (OAI) 不適用於上述清單中的情境,或者在這些情境中需要額外的因應措施。下列主題說明如何將原始存取控制 (OAC) 與 Amazon S3 原始伺服器搭配使用。如需如何從原始存取身分 (OAI) 遷移至原始存取控制 (OAC) 的相關資訊,請參閱 從原始存取身分 (OAI) 遷移至原始存取控制 (OAC)

備註
  • 當您將 CloudFront OAC 與 Amazon S3 儲存貯體原始伺服器搭配使用時,必須將 Amazon S3 物件擁有權設定為強制執行儲存貯體擁有者,這是新 Amazon S3 儲存貯體的預設值。如果您需要 ACL,請使用儲存貯體擁有者偏好設定來維持透過 CloudFront 上傳之物件的控制權。

  • 如果您使用設定為網站端點的 Amazon S3 儲存貯體,則必須使用 CloudFront 將其設定為自訂原始伺服器。這表示您無法使用 OAC (或 OAI)。OAC 不支援使用 Lambda@Edge 進行原始伺服器重新導向。

主題

建立新的原始存取控制

完成下列主題中說明的步驟,在 CloudFront 中設定新的原始存取控制。

先決條件

在建立和設定原始存取控制 (OAC) 之前,您必須擁有具 Amazon S3 儲存貯體原始伺服器的 CloudFront 分佈。此原始伺服器必須是一般 S3 儲存貯體,而非設定為網站端點的儲存貯體。如需使用 S3 儲存貯體原始伺服器設定 CloudFront 分佈的相關資訊,請參閱 開始使用基本 CloudFront 分佈

重要

當您使用 OAC 來保護 Amazon S3 原始伺服器時,CloudFront 和 Amazon S3 之間的通訊一律透過 HTTPS 進行,但僅限於您選擇一律簽署請求時。您必須在主控台中選擇簽署請求 (建議) AWS CLI,或在 CloudFront API 或 CloudFormation always中指定 。

如果您選擇不要簽署請求不要覆寫授權標頭選項,CloudFront 會使用您在下列政策中指定的連線通訊協定:

例如,如果您選擇不要覆寫授權標頭,並想要在 CloudFront 和 Amazon S3 原始伺服器之間使用 HTTPS,請僅針對檢視器通訊協定政策使用重新導向 HTTP 至 HTTPS 或 HTTPS。

授予原始存取控制存取 S3 儲存貯體的許可

在您建立原始存取控制 (OAC) 或於 CloudFront 分佈中進行設定之前,請確定 OAC 具有存取 S3 儲存貯體原始伺服器的許可。在建立 CloudFront 分佈之後,但在將 OAC 新增至分佈組態中的 S3 原始伺服器之前,請執行此作業。

如要授予 OAC 許可來存取 S3 儲存貯體,請使用 S3 儲存貯體政策,允許 CloudFront 服務主體 (cloudfront.amazonaws.com),來存取儲存貯體。使用政策中的 Condition 元素,僅當請求代表包含 S3 原始伺服器的 CloudFront 分佈時,才允許 CloudFront 存取儲存貯體。

如需新增或修改儲存貯體政策的相關資訊,請參閱 Amazon S3 使用者指南中的使用 Amazon S3 主控台新增儲存貯體政策

下列是允許 CloudFront OAC 存取 S3 原始伺服器的 S3 儲存貯體政策範例。

範例 允許唯讀存取 CloudFront OAC 的 S3 儲存貯體政策
{ "Version": "2012-10-17", "Statement": { "Sid": "AllowCloudFrontServicePrincipalReadOnly", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<S3 bucket name>/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/<CloudFront distribution ID>" } } } }
範例 允許讀取和寫入存取 CloudFront OAC 的 S3 儲存貯體政策
{ "Version": "2012-10-17", "Statement": { "Sid": "AllowCloudFrontServicePrincipalReadWrite", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::<S3 bucket name>/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/<CloudFront distribution ID>" } } } }

SSE-KMS

如果 S3 儲存貯體原始伺服器中的物件使用伺服器端加密搭配 AWS Key Management Service (SSE-KMS) 加密,您必須確保 OAC 具有使用 AWS KMS 金鑰的許可。如要授予 OAC 使用 KMS 金鑰的許可,請將陳述式新增至 KMS 金鑰政策。如需如何修改金鑰政策的相關資訊,請參閱《AWS Key Management Service 開發人員指南》中的變更金鑰政策

下列範例顯示允許 OAC 使用 KMS 金鑰的 KMS 金鑰政策陳述式。

範例 允許 CloudFront OAC 存取 SSE-KMS 之 KMS 金鑰的 KMS 金鑰政策陳述式
{ "Sid": "AllowCloudFrontServicePrincipalSSE-KMS", "Effect": "Allow", "Principal": { "Service": [ "cloudfront.amazonaws.com" ] }, "Action": [ "kms:Decrypt", "kms:Encrypt", "kms:GenerateDataKey*" ], "Resource": "*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/<CloudFront distribution ID>" } } }

建立原始存取控制

若要建立原始存取控制 (OAC),您可以使用 AWS Management Console AWS CloudFormation、 AWS CLI、 或 CloudFront API。

Console
如要建立原始存取控制
  1. 登入 AWS Management Console ,並在 開啟 CloudFront 主控台https://console.aws.amazon.com/cloudfront/v4/home

  2. 於左側導覽窗格中,選擇 Origin access (原始存取)。

  3. 選擇 Create control setting (建立控制設定)。

  4. Create control setting (建立控制設定) 表單上,執行下列動作:

    1. Details (詳細資訊) 窗格中,輸入 Name (名稱) 和 (選用) Description (描述),以用於原始存取控制。

    2. Settings (設定) 窗格中,建議您保留預設設定 (Sign requests (recommended)) (簽署請求 (建議使用))。如需詳細資訊,請參閱原始存取控制的進階設定

  5. Origin type (原始伺服器類型) 下拉式功能表中選擇 S3。

  6. 選擇 Create (建立)。

    建立 OAC 之後,請記下 Name (名稱)。您需要於下列程序中進行使用。

如要將原始存取控制新增至分佈中的 S3 原始伺服器
  1. https://console.aws.amazon.com/cloudfront/v4/home 中開啟 CloudFront 主控台。

  2. 選擇一個您想要新增 OAC 之具 S3 原始伺服器的分佈,然後選擇 Origins (原始伺服器) 標籤。

  3. 選取您想要將 OAC 新增至的 S3 原始伺服器,然後選擇 Edit (編輯)。

  4. 針對原始伺服器存取,選擇原始伺服器存取控制設定 (建議)

  5. Origin access control (原始存取控制) 下拉式功能表中,選擇您想要使用的 OAC。

  6. 選擇 Save changes (儲存變更)。

分佈開始部署至所有 CloudFront 邊緣節點。當邊緣節點接收到新組態時,其會簽署傳送至 S3 儲存貯體原始伺服器的所有請求。

CloudFormation

若要使用 建立原始存取控制 (OAC) AWS CloudFormation,請使用 AWS::CloudFront::OriginAccessControl 資源類型。下列範例顯示 YAML 格式的 AWS CloudFormation 範本語法,用於建立原始存取控制。

Type: AWS::CloudFront::OriginAccessControl Properties: OriginAccessControlConfig: Description: An optional description for the origin access control Name: ExampleOAC OriginAccessControlOriginType: s3 SigningBehavior: always SigningProtocol: sigv4

如需詳細資訊,請參閱《AWS CloudFormation 使用者指南》中的 AWS::CloudFront::OriginAccessControl

CLI

若要使用 AWS Command Line Interface (AWS CLI) 建立原始存取控制,請使用 aws cloudfront create-origin-access-control命令。您可以使用輸入檔案來提供命令的輸入參數,而不必分別將每個個別參數指定為命令列輸入。

如要建立原始存取控制 (包含輸入檔案的 CLI)
  1. 使用下列命令建立名為 origin-access-control.yaml 的檔案。這個檔案中包含 create-origin-access-control 命令的所有輸入參數。

    aws cloudfront create-origin-access-control --generate-cli-skeleton yaml-input > origin-access-control.yaml
  2. 開啟您剛才建立的 origin-access-control.yaml 檔案。編輯檔案以新增 OAC 的名稱、說明 (選用),並將 SigningBehavior 變更為 always。接著儲存檔案。

    如需其他 OAC 設定的相關資訊,請參閱 原始存取控制的進階設定

  3. 使用下列命令,利用 origin-access-control.yaml 檔案中的輸入參數建立原始存取控制。

    aws cloudfront create-origin-access-control --cli-input-yaml file://origin-access-control.yaml

    記下命令輸出中的 Id 值,您需要其將 OAC 新增至 CloudFront 分佈中的 S3 儲存貯體原始伺服器。

如要將 OAC 附加至現有分佈 (包含輸入檔案的 CLI) 中的 S3 儲存貯體原始伺服器
  1. 使用下列命令來儲存您想要新增之 CloudFront 分佈的分佈組態。分佈必須具有 S3 儲存貯體原始伺服器。

    aws cloudfront get-distribution-config --id <CloudFront distribution ID> --output yaml > dist-config.yaml
  2. 開啟您剛才建立且命名為 dist-config.yaml 的檔案。編輯檔案,進行下列變更:

    • Origins 物件中,將 OAC 的 ID 新增至名為 OriginAccessControlId 的欄位。

    • 從名為 OriginAccessIdentity 的欄位中移除值(如果存在)。

    • ETag 欄位重新命名為 IfMatch,但不要變更欄位的值。

    完成後儲存檔案。

  3. 使用下列命令來更新分佈,以使用原始存取控制。

    aws cloudfront update-distribution --id <CloudFront distribution ID> --cli-input-yaml file://dist-config.yaml

分佈開始部署至所有 CloudFront 邊緣節點。當邊緣節點接收到新組態時,其會簽署傳送至 S3 儲存貯體原始伺服器的所有請求。

API

如要使用 CloudFront API 建立原始存取控制,請使用 CreateOriginAccessControl。如需您在此 API 呼叫中指定欄位的詳細資訊,請參閱 AWS SDK 或其他 API 用戶端的 API 參考文件。

建立原始存取控制之後,您可以使用下列其中一個 API 呼叫,將其連接至分佈中的 S3 儲存貯體原始伺服器:

對於這兩個 API 呼叫,請於原始伺服器內部的 OriginAccessControlId 欄位中提供原始存取控制 ID。如需您在這些 API 呼叫中指定之其他欄位的詳細資訊,請參閱 分佈設定參考和 AWS SDK 或其他 API 用戶端的 API 參考文件。

刪除附加至 S3 儲存貯體的 OAC 分佈

如果您需要刪除已將 OAC 連接到 S3 儲存貯體的分佈,您應該先刪除分佈,再刪除 S3 儲存貯體原始伺服器。或者,在原始網域名稱中包含 區域。如果無法這麼做,您可以在刪除之前切換到公有,從分佈中移除 OAC。如需詳細資訊,請參閱刪除 分發

從原始存取身分 (OAI) 遷移至原始存取控制 (OAC)

如要從舊式原始存取身分 (OAI) 遷移至原始存取控制 (OAC),請先更新 S3 儲存貯體原始伺服器,以允許 OAI 和 OAC 存取儲存貯體的內容。此可確保 CloudFront 在轉換期間永遠不會失去儲存貯體的存取權限。如要允許 OAI 和 OAC 存取 S3 儲存貯體,請更新儲存貯體政策,以包括兩個陳述式,每種主體各一個。

下列範例 S3 儲存貯體政策允許 OAI 和 OAC 存取 S3 原始伺服器。

範例 允許唯讀存取 OAI 和 OAC 的 S3 儲存貯體政策
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowCloudFrontServicePrincipalReadOnly", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<S3 bucket name>/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/<CloudFront distribution ID>" } } }, { "Sid": "AllowLegacyOAIReadOnly", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity <origin access identity ID>" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<S3 bucket name>/*" } ] }

更新 S3 原始伺服器的儲存貯體政策以允許存取 OAI 和 OAC 之後,您可更新發佈組態以使用 OAC 而非 OAI。如需詳細資訊,請參閱建立新的原始存取控制

完整部署分佈之後,您可移除儲存貯體政策中允許存取 OAI 的陳述式。如需詳細資訊,請參閱授予原始存取控制存取 S3 儲存貯體的許可

原始存取控制的進階設定

CloudFront 來原始存取控制功能包含僅適用於特定使用案例的進階設定。除非您對進階設定有特定需求,否則請使用建議的設定。

原始存取控制包含名為簽署行為 (在主控台中) 或 SigningBehavior(在 API、CLI 和 中) 的設定 AWS CloudFormation。此設定提供下列選項:

永遠簽署原始請求 (建議設定)

我們建議使用此設定,於主控台中名為Sign requests (recommended) (簽署請求 (建議使用)),或於 API、CLI 和 AWS CloudFormation中的 always。使用此設定時,CloudFront 一律會簽署傳送至 S3 儲存貯體原始伺服器的所有請求。

絕不簽署原始伺服器請求

此設定於主控台中命名為 Do not sign requests (請勿簽署請求),或 API、CLI 和 AWS CloudFormation中的 never。使用此設定,關閉使用此原始存取控制之所有分佈中的所有原始伺服器的原始存取控制。與從所有使用其原始伺服器和分佈中逐一移除原始存取控制相比,此可節省時間和精力。使用此設定時,CloudFront 不會簽署傳送至 S3 儲存貯體原始伺服器的任何請求。

警告

如要使用此設定,S3 儲存貯體原始伺服器必須可公開存取。如果您對無法公開存取的 S3 儲存貯體原始伺服器使用此設定,CloudFront 將無法存取該原始伺服器。S3 儲存貯體原始伺服器會將錯誤傳回 CloudFront,而 CloudFront 會將這些錯誤傳遞給檢視器。

請勿覆寫檢視器 (用戶端) Authorization 標題

此設定於主控台中命名為 Do not override authorization header (請勿覆寫授權標頭),或於 API、CLI 和 AWS CloudFormation中的 no-override。如果您想要 CloudFront 僅於對應的檢視器請求不包含 Authorization 標題時簽署原始伺服器請求,請使用此設定。利用此設定,當檢視器請求存在時,CloudFront 會傳遞來自檢視器請求的 Authorization 標題,但在檢視器請求不包含 Authorization 標題時對原始伺服器請求進行簽名 (新增其自己的 Authorization 標題)。

警告

如要從檢視器請求傳遞 Authorization 標題,您必須Authorization 標題新增至快取政策中,適用於使用與此原始存取控制相關聯之 S3 儲存貯體原始伺服器的所有快取行為。

使用原始存取身分 (舊版,不建議)

CloudFront原始存取身分 (OAI) 提供與原始存取控制 (OAC) 類似的功能,但其不適用於所有案例。這就是為什麼我們建議改用 OAC。具體而言,OAI 不支援:

  • 所有 中的 Amazon S3 儲存貯體 AWS 區域,包括選擇加入區域

  • 使用 AWS KMS的 Amazon S3 伺服器端加密 (SSE-KMS)

  • 對 Amazon S3 的動態請求 (PUTPOSTDELETE)

  • 2022 年 12 月之後 AWS 區域 推出的新功能

如需從 OAI 遷移至 OAC 的相關資訊,請參閱 從原始存取身分 (OAI) 遷移至原始存取控制 (OAC)

當您使用 CloudFront 主控台建立 OAI 或新增 OAI 至分佈時,您可以自動更新 Amazon S3 儲存貯體政策,讓 OAI 有權存取您的儲存貯體。或者,您可以選擇手動建立或更新儲存貯體政策。無論您使用哪種方法,您仍應檢閱許可以確認下列事項:

  • CloudFront OAI 可以代表透過 CloudFront 請求檔案的檢視器,來存取儲存貯體中的檔案。

  • 檢視器無法使用 Amazon S3 URL 在 CloudFront 之外存取您的檔案。

重要

如果您將 CloudFront 設定為接受和轉送 CloudFront 支援的所有 HTTP 方法,請務必為您的 CloudFront OAI 提供所需的許可。例如,如果您將 CloudFront 設定為接受並轉送使用 DELETE 方法的請求,請將儲存貯體政策設定為適當地處理 DELETE 請求,讓檢視器只能刪除您希望其刪除的檔案。

使用 Amazon S3 儲存貯體政策

您可以透過下列方法建立或更新儲存貯體政策,藉此授予 CloudFront OAI 對 Amazon S3 儲存貯體中檔案的存取權限:

  • 使用 Amazon S3 主控台中的 Amazon S3 儲存貯體的Permissions (許可) 標籤。

  • 在 Amazon S3 API 中使用 PutBucket 政策

  • 使用 CloudFront 主控台。當您將 OAI 新增到 CloudFront 主控台中的原始伺服器設定時,您可以選擇 Yes, update the bucket 政策 (是,更新儲存貯體政策),請 CloudFront 代表您更新儲存貯體政策。

如果您手動更新儲存貯體政策,請務必:

  • 在政策中指定正確的 OAI 做為 Principal

  • 授予 OAI 代表檢視器存取物件所需的許可。

如需詳細資訊,請參閱下列區段。

在儲存貯體政策中指定 OAI 做為 Principal

若要於 Amazon S3 儲存貯體政策中指定 OAI 做為 Principal,請使用包含 OAI ID 的 OAI Amazon Resource Name (ARN)。例如:

"Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity <origin access identity ID>" }

安全性原始存取身分 (舊版) 下的 CloudFront 主控台中尋找 OAI ID。或者,在 CloudFront API 中使用 ListCloudFrontOriginAccessIdentities。 CloudFront

授予權限給一個 OAI

如要授予 OAI 存取 Amazon S3 儲存貯體中物件的許可,請使用與特定 Amazon S3 API 作業相關政策中的動作。例如,s3:GetObject 動作可讓 OAI 讀取儲存貯體中的物件。如需詳細資訊,請參閱以下章節中的範例,或參閱 Amazon Simple Storage Service 使用者指南中的 Amazon S3 動作

Amazon S3 儲存貯體政策範例

下列範例顯示允許 CloudFront OAI 存取 S3 儲存貯體的 Amazon S3 儲存貯體政策。

安全性原始存取身分 (舊版) 下的 CloudFront 主控台中尋找 OAI ID。或者,在 CloudFront API 中使用 ListCloudFrontOriginAccessIdentities。 CloudFront

範例 授予 OAI 讀取存取權限的 Amazon S3 儲存貯體政策

下列範例可讓 OAI 讀取指定儲存貯體中的物件 (s3:GetObject)。

{ "Version": "2012-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity <origin access identity ID>" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<S3 bucket name>/*" } ] }
範例 授予 OAI 讀取和寫入存取權限的 Amazon S3 儲存貯體政策

下列範例可讓 OAI 讀取和寫入指定儲存貯體中的物件 (s3:GetObjects3:PutObject)。這可讓檢視器透過 CloudFront 將檔案上傳到您的 Amazon S3 儲存貯體。

{ "Version": "2012-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity <origin access identity ID>" }, "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::<S3 bucket name>/*" } ] }

使用 Amazon S3 物件 ACLs(不建議)

重要

我們建議使用 Amazon S3 儲存貯體政策 向 OAI 提供 S3 儲存貯體的存取權。您可以使用存取控制清單 (ACL),如本節中所述,但我們不建議此方法。

Amazon S3 建議設定 S3 物件擁有權已強制執行儲存貯體擁有者,這意味著儲存貯體及其中物件的 ACL 被停用。當您將此設定套用至「物件擁有權」 時,您必須使用儲存貯體政策來授與 OAI 的存取權 (請參閱上一節)。

本節僅適用於需要 ACL 的舊式使用案例。

您可透過下列方法建立或更新檔案的 ACL,藉此授予 CloudFront OAI 對 Amazon S3 儲存貯體中檔案的存取權限:

當您使用 ACL 授予對 OAI 的存取權限時,您必須使用 OAI 的 Amazon S3 正式使用者 ID 來指定 OAI。在 CloudFront 主控台中,您可以在安全性原始存取身分 (舊版) 下找到此 ID。如果您使用的是 CloudFront API,請使用 S3CanonicalUserId 元素的值,此元素是在您建立 OAI 或呼叫 CloudFront API 中的 ListCloudFrontOriginAccessIdentities 時傳回。

較新 Amazon S3 區域請求您使用簽章版本 4 進行驗證請求 (如需每個 Amazon S3 區域支援的簽章版本,請參閱《AWS 一般參考》中的 Amazon Simple Storage Service 端點和配額。) 如果您使用的是原始存取身分,且您的儲存貯體位於需要簽章版本 4 的其中一個區域,請注意下列事項:

  • DELETEGETHEADOPTIONSPATCH 請求可以在沒有授權的情況下得到支援。

  • 不支援 POST 請求。