為什麼使用 Amazon S3 靜態網站功能時會出現存取遭拒錯誤?

2 分的閱讀內容
0

我想知道為什麼當我使用 Amazon Simple Storage Service (Amazon S3) 儲存貯體來託管具有 S3 靜態網站端點的靜態網站時,我會收到存取遭拒的錯誤。

解決方法

如果您想使用 Amazon S3 託管靜態網站,但出現存取遭拒錯誤,請檢查下列需求:

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

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

以下是 S3 物件的範例 URL:

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

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

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

檢閱儲存貯體政策,並確定沒有任何拒絕陳述式阻止對 S3:getObject 動作的公開讀取權限。即使您的儲存貯體政策中有 s3:GetObject 的明確允許陳述式,請確認沒有衝突的明確拒絕陳述式。明確的拒絕陳述式將總是會覆寫明確的允許陳述式。

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

  1. 開啟 Amazon S3 主控台
  2. 選擇許可標籤。
  3. 選擇儲存貯體政策
  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 是否相符。如果正規 ID 不相符,則表示儲存貯體和物件具有不同的擁有者。
    注意:您也可以使用 Amazon S3 主控台來檢查儲存貯體和物件擁有者。擁有者可以在相應的儲存貯體或物件的許可標籤中找到。

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

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

    如果物件沒有儲存貯體擁有者完全控制 ACL 許可,請從物件擁有者的帳戶執行下列命令:

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

    如果物件具儲存貯體擁有者完全控制 ACL 許可,請從儲存貯體擁有者的帳戶執行下列命令。此命令將物件複製到自身上,以變更物件的擁有者:

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

    您也可以使用 S3 物件擁有權授與儲存貯體擁有者自動擁有權,藉此擁有由匿名使用者或其他 WS 帳戶上傳的任何物件之擁有權。

儲存貯體中的物件無法進行 AWS KMS 加密

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

**注意:**不使用 AWS KMS ,而是使用 AES-256 對物件加密

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

  • 使用 Amazon S3 主控台檢視物件的屬性。檢閱「加密」對話方塊。如果選取了 AWS KMS,則該物件已經 KMS 加密。
  • 使用 AWS Command Line Interface (AWS CLI) 執行 ]( 命令。如果該命令以 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

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

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

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

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

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

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

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

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

必須在儲存貯體上關閉 Amazon S3 封鎖公開存取

Amazon S3 封鎖公開存取設定可套用至個別儲存貯體或 AWS 帳戶。確認沒有套用任何 Amazon S3 封鎖公開存取設定套用至您的 S3 儲存貯體AWS 帳戶。這些設定可以覆寫允許公開讀取存取限的許可。

AWS 官方
AWS 官方已更新 6 個月前