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

3 分的閱讀內容
0

我正在使用 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 帳戶。這些設定可覆寫允許公有讀取存取的許可。


AWS 官方
AWS 官方已更新 2 年前