為什麼使用 Amazon S3 靜態網站功能時會出現存取遭拒錯誤?
我想知道為什麼當我使用 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 的儲存貯體政策,請執行下列步驟:
- 開啟 Amazon S3 主控台。
- 選擇許可標籤。
- 選擇儲存貯體政策。
- 檢閱具有 "Action": "s3:GetObject" 或 "Action": "s3:*" 的陳述式的儲存貯體政策。
- (選用) 修改儲存貯體政策。例如,您可以移除或編輯封鎖對 S3:getObject 的公開讀取權限的陳述式。
擁有儲存貯體的 AWS 帳戶也必須擁有該物件
為使儲存貯體政策允許公開讀取物件,擁有該儲存貯體的 AWS 帳戶也必須擁有該物件。儲存貯體或物件由建立儲存貯體或物件之 AWS Identity and Access Management (IAM) 身分的帳戶所擁有。
**注意:**物件所有權要求適用於儲存貯體政策授予的公開讀取權限。它不適用於物件的存取控制清單 (ACL) 授予的公開讀取權限。
若要檢查您的 Amazon S3 儲存貯體和物件是否屬於相同的 AWS 帳戶,請執行下列步驟:
-
若要擷取儲存貯體擁有者的 S3 正規 ID,請使用下列命令:
aws s3api list-buckets --query Owner.ID
-
若要擷取物件擁有者的 S3 正規 ID,請使用下列命令:
aws s3api list-objects --bucket DOC-EXAMPLE-BUCKET --prefix index.html
**注意:**此範例顯示了單一物件。若要檢查多個物件,請使用 list 命令。
-
確認儲存貯體擁有者和物件擁有者的正規 ID 是否相符。如果正規 ID 不相符,則表示儲存貯體和物件具有不同的擁有者。
注意:您也可以使用 Amazon S3 主控台來檢查儲存貯體和物件擁有者。擁有者可以在相應的儲存貯體或物件的許可標籤中找到。 -
如果儲存貯體和物件擁有者的正規 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 帳戶。這些設定可以覆寫允許公開讀取存取限的許可。
相關內容
- 已提問 2 年前lg...
- 已提問 2 年前lg...
- 已提問 7 個月前lg...
- AWS 官方已更新 1 個月前
- AWS 官方已更新 1 年前
- AWS 官方已更新 3 個月前
- AWS 官方已更新 1 年前