我正在使用 Amazon S3 靜態網站功能,但收到「存取遭拒」錯誤。為什麼會發生此情況?
我正在使用 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-class 和 website-redirect-location 的設定。若要在新物件中維持這些設定,請確認在複製請求中明確指定 storage-class 或 website-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 帳戶。這些設定可覆寫允許公有讀取存取的許可。

相關內容
- 已提問 4 個月前lg...
- 已提問 4 個月前lg...
- 已提問 4 個月前lg...
- 已提問 4 個月前lg...
- 已提問 3 個月前lg...
- AWS 官方已更新 5 個月前
- AWS 官方已更新 5 個月前
- AWS 官方已更新 7 個月前