限制對 Amazon 簡單存儲服務來源的訪問 - Amazon CloudFront

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

限制對 Amazon 簡單存儲服務來源的訪問

CloudFront 提供兩種將經過驗證的請求傳送至 Amazon S3 來源的方式:原始存取控制 (OAC) 和來源存取身分識別 (OAI)。OAC 可協助您保護來源安全,例如 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 來保護 S3 儲存貯體來源時, CloudFront 與 Amazon S3 之間的通訊一會透過 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 金鑰原則陳述式
{ "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. 選擇建立

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

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

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

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

  4. 對於 Origin 存取權限,請選擇 Origin 存取控制設定 (建議使用)

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

  6. 選擇儲存變更

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

CloudFormation

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

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::OriginAccess控制〉。

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. 使用下列命令來儲存您要新增 OAC 的 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 不支援:

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

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

  • 您的 CloudFront OAI 可以代表透 CloudFront過要求檔案的檢視者存取值區中的檔案。

  • 檢視者無法使用 Amazon S3 網址在外部存取您的檔案 CloudFront。

重要

如果您設定 CloudFront 為接受和轉寄所有 CloudFront 支援的 HTTP 方法,請務必將所需的權限授與 CloudFront OAI。例如,如果您設定為 CloudFront 接受和轉寄使用該DELETE方法的要求,請將儲存貯體原則設定為適當地處理要DELETE求,以便檢視者只能刪除您想要的檔案。

使用 Amazon S3 存儲桶政策

您可以透過下列方式建立或更新儲存貯體政策,讓 CloudFront OAI 存取權存取 Amazon S3 儲存貯體中的檔案:

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

  • PutBucketPolicy在 Amazon S3 API 中使用。

  • 使用 CloudFront 主控台。當您在 CloudFront 主控台中將 OAI 新增至原始設定時,可以選擇 [是,更新值區政策],告知 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中使用。

授予權限給一個 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中使用。

範例 授予 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)。這可讓檢視者透過將檔案上傳到您的 Amazon S3 儲存貯體 CloudFront。

{ "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 物件 ACL (不建議使用)

重要

我們建議使用 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,請使用建立 OAI 時傳回的S3CanonicalUserId元素值,或在 CloudFront API ListCloudFrontOriginAccessIdentities中呼叫。

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

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

  • 不支援 POST 請求。