使用原始存取身分 (OAI) 限制對 Amazon S3 內容的存取 - Amazon CloudFront

使用原始存取身分 (OAI) 限制對 Amazon S3 內容的存取

若要限制存取您從 Amazon S3 儲存貯體提供的內容,請依照下列步驟執行:

  1. 建立名為原始伺服器存取身份 (OAI) 的特殊 CloudFront 使用者,並將其與您的分佈建立關聯。

  2. 設定您的 S3 儲存貯體許可,以便 CloudFront 使用 OAI 存取儲存貯體中的檔案,並將其提供給您的使用者。確保使用者無法使用 S3 儲存貯體的直接 URL 存取該處的檔案。

執行這些步驟之後,使用者只能透過 CloudFront 存取您的檔案,而不能直接從 S3 儲存貯體存取。

注意

如果您使用 CloudFront 簽署的 URL 或簽署的 Cookie 來限制存取檔案,則只需使用檔案的直接 Amazon S3 URL,不需要讓檢視者檢視檔案。相反的,您想要使用的 CloudFront URL,讓他們只存取檔案,以達保護之目的。若需有關使用簽署的 URL 和簽署的 Cookie 詳細資訊,請參閱 使用已簽署的 URL 和已簽署的 Cookie 提供私有內容

本主題說明如何設定 OAI 並授予許可以維護對 S3 檔案的安全存取。

重要

如果您使用設定為網站端點的 Amazon S3 儲存貯體,則必須使用 CloudFront 將其設定為自訂原始伺服器。您無法使用本主題所述的原始存取身分識別功能。不過,您可以透過設定自訂標頭和您的原始伺服器,以限制對自訂原始伺服器上的內容進行存取。如需詳細資訊,請參閱 在自訂原始伺服器上限制存取檔案

OAI 設定概觀

當您先設定 Amazon S3 儲存貯體做為 CloudFront 分佈的原始伺服器,您會授予每個人讀取儲存貯體中檔案的許可。這可讓任何人透過 CloudFront 或使用 Amazon S3 URL 存取您的檔案。CloudFront 不會公開 Amazon S3 URL,但如果您的應用程式直接從 Amazon S3 提供任何檔案,或者有人提供 Amazon S3 中特定檔案的直接連結,則您的使用者可能會擁有這些 URL。

如果您使用 CloudFront 簽署的 URL 或簽署的 Cookie 來限制對 Amazon S3 儲存貯體中的檔案的存取,您可能還想阻止使用者使用 Amazon S3 URL 存取您的 Amazon S3 檔案。如果使用者直接在 Amazon S3 中存取您的檔案,則會略過 CloudFront 已簽署 URL 或已簽署 Cookie 所提供的控制。這包括控制使用者無法再存取您內容的日期和時間,以及控制可以使用哪些 IP 地址來存取內容。此外,如果使用者同時透過 CloudFront 和使用 Amazon S3 URL 直接存取檔案,則 CloudFront 存取日誌不太有用,因為它們不完整。

為了確保使用者只使用 CloudFront URL 存取您的檔案,不管 URL 是否已簽名,請執行以下操作:

  1. 建立原始伺服器存取身份,這是一個特殊 CloudFront 使用者,並將原始伺服器存取身份與您的分佈關聯。您將原始伺服器存取身份與原始伺服器關聯,因此您可以保護所有的或部分的 Amazon S3 內容。您還可以在建立分佈時建立原始存取身分,並將其新增到您的分佈中。如需詳細資訊,請參閱 建立 CloudFront OAI 並將其新增至您的分佈

  2. 變更您的 Amazon S3 儲存貯體或儲存貯體中的檔案的許可,以便只有原始存取身分具有讀取許可。當檢視者透過 CloudFront 存取 Amazon S3 檔案時,CloudFront 原始存取身分會代表其取得檔案。如果檢視者使用 Amazon S3 URL 直接請求檔案,則它們將被拒絕存取。原始存取身分具有許可來存取 Amazon S3 儲存貯體中的檔案,檢視者則不具有許可。如需詳細資訊,請參閱 授予 OAI 讀取 Amazon S3 儲存貯體中檔案的許可

建立 CloudFront OAI 並將其新增至您的分佈

一個 AWS 帳戶可以擁有最多 100 個 CloudFront 原始伺服器存取身分 (OAI)。但是,您可以視需要將任意數量的 OAI 新增到分佈中,因此一個 OAI 通常就足夠了。

如果在建立分佈時,您沒有建立 OAI,並將該身份新增到分佈中,則您現在可以使用 CloudFront 主控台或 CloudFront API,來建立和新增原始存取身份:

建立 OAI 並將其新增到您的分佈中

如果您在建立分佈時,沒有建立 OAI,請執行下列動作。

使用 CloudFront 主控台建立 CloudFront OAI

  1. 登入 AWS Management Console 並開啟位於 https://console.aws.amazon.com/cloudfront/v3/home 的 CloudFront 主控台。

  2. 選擇具有 S3 原始伺服器的分佈 ID。

  3. 選擇 Origins (原始伺服器) 索引標籤。

  4. 選取 Amazon S3 原始伺服器,然後選擇 Edit (編輯)

  5. 對於 S3 儲存貯體存取權,選擇 Yes use OAI (是,使用 OAI)

  6. 如果您已經擁有想要使用的 OAI,請從下拉式清單中選取此 OAI。如果您已經有 OAI,我們建議您重複使用它來簡化維護。

    如果想要建立 OAI,請選擇 Create new OAI (建立新 OAI)。如有需要,您可以使用自訂名稱取代自動產生的 OAI 名稱。

  7. 如果您希望 CloudFront 自動更新 Amazon S3 儲存貯體政策以允許對 OAI 的讀取權限,請選擇 Yes, update the bucket policy (是,更新儲存貯體政策)

    重要

    如果您選擇 Yes, update the bucket policy (是,更新儲存貯體政策),CloudFront 會更新儲存貯體的許可,授予許可給指定的 OAI,以讀取儲存貯體中的檔案。不過, CloudFront 並不會移除現有的許可。如果使用者目前擁有許可,來使用 Amazon S3 URL 存取您儲存貯體中的檔案,在 CloudFront 更新您的儲存貯體許可之後,這些使用者仍會擁有該許可。若要檢視或移除現有的儲存貯體的許可,請使用 Amazon S3 所提供的方法。

    如果您想要手動更新 Amazon S3 儲存貯體上的許可,請選擇 No, I will update the bucket policy (否,我將更新儲存貯體政策)。如需詳細資訊,請參閱 授予 OAI 讀取 Amazon S3 儲存貯體中檔案的許可

  8. 請在頁面底部選擇 Save changes (儲存變更)。

  9. 如果您有多個 Amazon S3 原始伺服器,請重複這些步驟來為每部原始伺服器新增 OAI。

使用 CloudFront API 建立 OAI

如果您已經有原始存取身分,並且想要重複使用,而不是建立另一個帳戶,請跳到 使用 CloudFront API 將 OAI 新增到您的分佈中

若要使用 CloudFront API 建立 CloudFront OAI,請使用 CreateCloudFrontOriginAccessIdentity API 動作。回應包含用於新 OAI 的 IdS3CanonicalUserId。請記下這些值,因為您會在以後的程序中使用它們。如需詳細資訊,請參閱 Amazon CloudFront API 參考中的 CreateCloudFrontOriginAccessIdentity

使用 CloudFront API 將 OAI 新增到您的分佈中

您可以使用 CloudFront API,將 CloudFront OAI 新增到現有的分佈,或建立包含 OAI 的新分佈。在任何一種情況下,包含 OriginAccessIdentity 元素。這個元素包含在建立 OAI 時傳回的 Id API 動作的 CreateCloudFrontOriginAccessIdentity 元素值。您可以新增 OriginAccessIdentity 元素到一或多個原始伺服器。

請參閱 Amazon CloudFront API 參考中的下列主題:

授予 OAI 讀取 Amazon S3 儲存貯體中檔案的許可

當您使用 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儲存貯體的許可標籤。

  • 在 Amazon S3 API 中使用 PutBucketPolicy

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

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

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

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

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

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

若要在 Amazon S3 儲存貯體原則中指定 OAI 作為 Principal,請使用包含 OAI ID 的 Amazon 資源名稱 (ARN)。例如:

"Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EH1HDMB1FH2TC" }

若要使用上述範例,請使用 OAI 的 ID 來取代 EH1HDMB1FH2TC。若要尋找 OAI 的 ID,請參閱 CloudFront 主控台中的原始存取身分頁面,或使用 CloudFront API 中 ListCloudFrontOriginAccessIdentities

授予權限給一個 OAI

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

Amazon S3 儲存貯體政策範例

下列範例顯示授予 CloudFront OAI 存取權限的 Amazon S3 儲存貯體原則。若要使用這些範例:

範例 授予 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 EH1HDMB1FH2TC" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" } ] }

範例 授予 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 EH1HDMB1FH2TC" }, "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" } ] }

使用 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 主控台中原始存取身分頁面上的 Amazon S3 標準使用者 ID 的值。如果您使用的是 CloudFront API,請使用 S3CanonicalUserId 元素的值,此元素是在您建立 OAI 或呼叫 CloudFront API 中的 ListCloudFrontOriginAccessIdentities 時所傳回。

在僅支援簽章版本 4 身份驗證的 Amazon S3 區域中使用 OAI

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

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

  • 如果您要將 PUT 請求提交給 CloudFront,以上傳檔案到 Amazon S3 儲存貯體,則您必須在請求中加入 x-amz-content-sha256 標頭。該標頭的值必須包含請求主體的 SHA-256 雜湊。如需詳細資訊,請參閱 Amazon Simple Storage Service API 參考一般請求標頭頁面上有關 x-amz-content-sha256 標頭的說明文件。

  • POST不支援 請求。