我正在使用 Amazon S3 靜態網站功能,但收到「存取遭拒」錯誤。為什麼會發生此情況?

上次更新日期:2021 年 12 月 22 日

我正在使用 Amazon Simple Storage Service (Amazon S3) 儲存貯體來託管包含 S3 靜態網站端點的靜態網站。為什麼會收到 Access Denied (存取遭拒) 錯誤?

簡短描述

如果您嘗試使用 Amazon S3 來託管靜態網站,但收到 Access Denied (存取遭拒) 錯誤,請檢查以下要求:

  • 儲存貯體中的物件必須可公有存取。
  • S3 儲存貯體政策必須允許存取 s3:GetObject 動作。
  • 擁有儲存貯體的 AWS 帳戶也必須擁有該物件。
  • AWS Key Management Service (AWS KMS) 無法對物件加密。
  • 請求的物件必須存在於 S3 儲存貯體中。
  • 儲存貯體和帳戶層級上必須停用 Amazon S3 Block Public Access。

解決方案

儲存貯體中的物件必須可公有存取

S3 靜態網站端點僅支援可公有存取的內容。若要確認 S3 儲存貯體中的物件是否可公有存取,請在 Web 瀏覽器中開啟物件的 URL。或者,您可以在 URL 上執行 cURL 命令。

以下是 S3 物件的範例 URL:

http://doc-example-bucket.s3-website-us-east-1.amazonaws.com/index.html
如果 Web 瀏覽器或 cURL 命令傳回 Access Denied (存取遭拒) 錯誤,則無法公有存取該物件。若要允許對 S3 物件的公有讀取存取權,請建立儲存貯體政策, 允許對儲存貯體中的所有物件進行公有讀取存取

S3 儲存貯體政策必須允許存取 s3:GetObject 動作

檢閱您的儲存貯體政策,並確認不存在任何拒絕語句封鎖對 s3:GetObject 動作的公有讀取存取權。即使儲存貯體政策中有 s3:GetObject 的明確允許語句,請確認沒有衝突的明確拒絕語句。明確拒絕語句將始終覆寫明確允許語句。

若要檢閱 s3:GetObject 的儲存貯體政策,請執行以下步驟:

1.    開啟 Amazon S3 主控台

2.    選擇 Permissions (許可) 標籤。

3.    選擇 Bucket Policy (儲存貯體政策)。

4.    檢閱儲存貯體政策,以了解包含 "Action": "s3:GetObject" 或 "Action": "s3:*" 的語句。

5.    (選用) 修改儲存貯體政策。 例如,您可以移除或編輯封鎖對 s3:GetObject 的公有讀取存取權的語句。

擁有儲存貯體的 AWS 帳戶也必須擁有該物件

若允許公有讀取存取物件,則擁有儲存貯體的 AWS 帳戶還必須擁有物件。儲存貯體或物件由建立儲存貯體或物件的 AWS Identity and Access Management (IAM) 身分的帳戶擁有。

注意:物件擁有權要求適用於儲存貯體政策授予的公有讀取存取權。它不適用於由物件的存取控制清單 (ACL) 授予的公有讀取存取權。

若要檢查您的 Amazon S3 儲存貯體和物件是否屬於同一 AWS 帳戶,請執行以下步驟:

1.    若要擷取儲存貯體擁有者的 S3 正式 ID,請使用以下命令:

aws s3api list-buckets --query Owner.ID

2.    若要擷取物件擁有者的 S3 規範 ID,請使用以下命令:

aws s3api list-objects --bucket DOC-EXAMPLE-BUCKET --prefix index.html

注意:此範例顯示了單一物件。若要檢查多個物件,請使用 list 命令。

3.    確認儲存貯體擁有者和物件擁有者的正式 ID 是否相符。如果不相符,則儲存貯體和物件具有不同的擁有者。

注意:您還可以使用 Amazon S3 主控台來檢查儲存貯體和物件擁有者。擁有者可在相應儲存貯體或物件的 Permissions (許可) 標籤中找到。

4.    如果儲存貯體和物件擁有者的正式 ID 不相符,請將物件的擁有者變更為儲存貯體擁有者。

從物件擁有者的帳戶中,執行以下命令,以擷取指派給物件的 ACL 許可:

aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name

如果物件未擁有 bucket-owner-full-control ACL 許可,則從物件擁有者的帳戶執行以下命令:

aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name --acl bucket-owner-full-control

如果物件擁有 bucket-owner-full-control ACL 許可,請從儲存貯體擁有者的帳戶執行以下命令。此命令透過將物件複製到自身上來變更物件的擁有者:

aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html --storage-class STANDARD

您還可以使用 S3 物件擁有權來授予儲存貯體擁有者對匿名使用者或其他 AWS 帳戶上傳的任何物件的自動擁有權。

儲存貯體中的物件不能進行 AWS KMS 加密

AWS KMS 不支援匿名請求。 因此,允許匿名或公有存取的任何 Amazon S3 儲存貯體都不適用於使用 AWS KMS 加密的物件。您必須從要使用 Amazon S3 靜態網站端點提供服務的物件中移除 KMS 加密。

注意:使用 AES-256 來加密您的物件,而不是使用 AWS KMS 加密。

您可以使用以下方法,檢查儲存貯體中的物件是否為 KMS 加密:

  • 使用 Amazon S3 主控台檢視物件的屬性。檢閱「加密」對話方塊。如果選取了 AWS-KMS,則該物件為 KMS 加密。
  • 使用 AWS Command Line Interface (AWS CLI) 執行 head-object 命令。如果命令以 aws:kms 的形式傳回 ServerSideEncryption,則該物件為 KMS 加密。

注意:如果您在執行 AWS CLI 命令時收到錯誤,請確保您使用的是最新版 AWS CLI

若要使用 Amazon S3 主控台變更物件的加密設定,請參閲指定 Amazon S3 加密

若要使用 AWS CLI 變更物件的加密設定,請確認物件的儲存貯體沒有預設加密。如果儲存貯體沒有愈合加密,則透過複製物件本身來移除物件的加密:

 

aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html --storage-class STANDARD
警告:複製物件本身即可移除 storage-classwebsite-redirect-location 的設定。若要在新物件中維持這些設定,請確認在複製請求中明確指定 storage-classwebsite-redirect-location 值。

請求的物件必須存在於 S3 儲存貯體中

如果執行請求的使用者沒有 s3:ListBucket 許可,則使用者會收到遺失物件的 Access Denied (存取遭拒) 錯誤。

您可以執行 head-object AWS CLI 命令,來檢查儲存貯體中是否存在物件。

注意︰S3 物件名稱區分大小寫。如果請求沒有有效的物件名稱,則 Amazon S3 將報告該物件遺失。

如果儲存貯體中存在物件,則Access Denied (存取遭拒) 錯誤不會遮罩 404 Not Found (404 找不到) 錯誤。確認其他組態需求,以解決 Access Denied (存取遭拒) 錯誤。

如果儲存貯體中不存在物件,則 Access Denied (存取遭拒) 錯誤會遮罩 404 Not Found (404 找不到) 錯誤。解決與遺失物件相關的問題。

注意: 啟用公有 s3:ListBucket 存取權並非安全最佳實務。啟用公有 s3:ListBucket 存取允許使用者查看並列出儲存貯體中的所有物件。即使使用者沒有下載物件的許可,此存取權會向使用者公有物件中繼資料詳細資訊 (例如,金鑰和大小)。

儲存貯體上必須停用 Amazon S3 Block Public Access

Amazon S3 Block Public Access 設定可套用至個別的儲存貯體或 AWS 帳戶。確認沒有任何 Amazon S3 區塊公有存取權設定套用於您的 S3 儲存貯體AWS 帳戶。這些設定可覆寫允許公有讀取存取的許可。


此文章是否有幫助?


您是否需要帳單或技術支援?