跳至內容

為什麼當我使用 Amazon S3 靜態網站託管端點時會出現「拒絕存取」錯誤?

2 分的閱讀內容
0

我使用 Amazon Simple Storage Service (Amazon S3) 儲存貯體透過 S3 靜態網站託管端點來託管靜態網站。我想對從 S3 靜態網站託管端點收到的「拒絕存取」錯誤進行疑難排解。

解決方法

注意: 如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,則請參閱對 AWS CLI 進行錯誤疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

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

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

以下是 S3 物件的範例網址:

http://doc-example-bucket.s3-website-us-east-1.amazonaws.com/index.html

如果 Web 瀏覽器或 curl 命令傳回拒絕存取錯誤,則該物件無法公開存取。若要解決此問題,請建立儲存貯體政策,允許對儲存貯體中所有物件的公開讀取存取權

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

檢查您的儲存貯體政策是否包含阻止對 s3:GetObject 動作的公開讀取存取的拒絕陳述式。即使儲存貯體政策中有一個針對 s3:GetObject 的明確允許陳述式,明確的拒絕陳述式也總是會覆寫明確的允許陳述式。

若要檢查您的儲存貯體政策,請完成以下步驟:

  1. 開啟 Amazon S3 主控台,然後選取您的儲存貯體。
  2. 選擇 Permissions (權限) 索引標籤。
  3. 檢閱具有 "Action": "s3:GetObject" 或 "Action": "s3:*" 陳述式的儲存貯體政策。
  4. 如果某個陳述式封鎖對 s3:GetObject 的公開讀取存取,請修改儲存貯體政策

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

為使儲存貯體政策允許公開讀取物件,擁有該儲存貯體的 AWS 帳戶也必須擁有該物件。建立儲存貯體或物件的 AWS Identity and Access Management (IAM) 身分的帳戶擁有該儲存貯體或物件。

**注意:**S3 物件擁有權不適用於物件的存取控制清單 (ACL) 授予的公開讀取權限。

您可以使用 Amazon S3 主控台來檢查儲存貯體和物件所有者。您可以在儲存貯體或物件權限索引標籤上找到所有者。

若要使用 AWS CLI 檢查相同帳戶是否擁有您的 Amazon S3 儲存貯體和物件,請完成下列步驟:

  1. 若要擷取儲存貯體擁有者的 S3 正規ID,請執行 list-buckets 命令:

    aws s3api list-buckets --query Owner.ID
    
  2. 若要擷取物件擁有者的 S3 正規 ID,請執行 list-objects 命令:

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

    注意: 上述命令會傳回單一物件。若要檢查多個物件,請執行 list 命令。

  3. 如果儲存貯體和物件擁有者的正規 ID 不相符,請將物件的擁有者變更為儲存貯體擁有者。從物件所有者的帳戶中,執行 get-object-acl 命令以擷取指派給物件的 ACL 權限:

    aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name
    
  4. 如果物件沒有 bucket-owner-full-control ACL 權限,則從物件所有者的帳戶執行 put-object-acl 命令:

    aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name --acl bucket-owner-full-control
    
  5. 如果物件具儲存貯體擁有者完全控制 ACL 權限,請從儲存貯體擁有者的帳戶執行下列命令:

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

    注意: 上述命令會將物件複製到其自身上,並變更物件的擁有者。

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

您不能對物件使用 AWS KMS 加密

AWS Key Management Service (KMS) 不支援匿名請求。因此,允許匿名或公開存取的 Amazon S3 儲存貯體不適用於使用 AWS KMS 加密的物件。若要從物件中刪除 AWS KMS 加密,您必須使用 Amazon S3 靜態網站端點。

注意: 不要使用 AWS KMS 加密,而是使用帶有 Amazon S3 受管金鑰的伺服器端加密來加密您的物件

若要檢查您是否在物件上使用了 KMS 加密,您可以使用 Amazon S3 主控台。在 Object overview (物件概觀) 頁面,檢查 Encryption (加密) 對話方塊中是否選擇了 AWS-KMS。您也可以執行 ead-object AWS CLI 命令。如果該命令以 aws:kms 傳回 server-side encryption,則表示該物件已進行 AWS KMS 加密。

若要使用 Amazon S3 主控台變更物件的加密設定,請參閱使用 Amazon S3 受管金鑰 (SSE-S3) 指定伺服器端加密

若要使用 AWS CLI 變更物件的加密設定,請確認物件的儲存貯體未使用預設加密。如果儲存貯體沒有預設加密,請執行下列命令將物件複製到自身,以移除物件加密:

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

警告: 當您將物件複製到自身時,Amazon S3 會移除 storage-classwebsite-redirect-location 的設定。若要在新物件中維持這些設定,請確保在複製請求中明確指定儲存類別網站重新導向位置值。

如果您在儲存貯體上啟動了版本控制,則當您變更加密時,預設加密會建立物件的新版本。

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

如果執行請求的使用者沒有 S3: ListBucket 權限,則使用者會針對遺失物件收到拒絕存取錯誤。

若要檢查儲存貯體中是否存在該物件,請執行 head-object AWS CLI 命令。

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

如果物件存在於儲存貯體中,則拒絕存取錯誤不會遮罩 404 找不到錯誤。若要解決拒絕存取錯誤,請檢查其他組態需求。

如果物件不存在於儲存貯體中,則拒絕存取錯誤將會遮罩 404 找不到錯誤。解決與遺失物件相關的問題。

注意: 從安全性角度而言,最佳做法是不啟動公用 s3:ListBucket 存取權限。公開 s3:ListBucket 存取可讓使用者查看和列出儲存貯體中的所有物件。即使使用者沒有權限下載該物件,此存取也會向使用者公開物件中繼資料詳細資訊,例如金鑰和大小。

關閉儲存貯體上的 Amazon S3 封鎖公開存取

Amazon S3 封鎖公開存取可以覆寫允許公開讀取存取的權限。確認您沒有為 S3 儲存貯體帳戶設定 Amazon S3 封鎖公開存取設定。

相關資訊

使用 Application Load Balancer、S3 和 AWS PrivateLink 託管內部 HTTPS 靜態網站