本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
限制對 Amazon 簡單存儲服務來源的訪問
CloudFront 提供兩種將經過驗證的請求傳送至 Amazon S3 來源的方式:原始存取控制 (OAC) 和來源存取身分識別 (OAI)。OAC 可協助您保護來源安全,例如 Amazon S3。我們建議使用 OAC,因為其支援:
-
所有 Amazon S3 儲存貯體 AWS 區域,包括 2022 年 12 月後推出的選擇加入區域
-
使用 AWS KMS的 Amazon S3 伺服器端加密 (SSE-KMS)
-
對 Amazon S3 的動態請求 (
PUT
和DELETE
)
原始存取身分 (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。
刪除附加到 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 的動態請求 (
PUT
、POST
或DELETE
) -
2022 年 12 月後 AWS 區域 推出的新功能
如需從 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:GetObject
和 s3: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 儲存貯體中的檔案:
-
使用 Amazon S3 主控台
中 Amazon S3 物件的 Permissions (許可) 標籤。 -
PutObjectAcl在 Amazon S3 API 中使用。
當您使用 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 的其中一個區域,請注意下列事項:
-
DELETE
、GET
、HEAD
、OPTIONS
和PATCH
請求可以在沒有授權的情況下得到支援。 -
不支援
POST
請求。