為什麼當我使用 Amazon S3 網站端點作為 CloudFront 發行版的來源時,我會收到「403 存取遭拒」錯誤?
我使用 Amazon Simple Storage Service (Amazon S3) 儲存貯體作為 Amazon CloudFront 發行版的來源。我想對「403 存取遭拒」錯誤進行疑難排解。
解決方法
若要對使用 Amazon S3 網站端點作為來源的 CloudFront 發行版進行疑難排解,請完成下列工作。
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請參閱AWS CLI 錯誤疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
檢閱儲存貯體中物件的加密
AWS Key Management Service (KMS) 不支援匿名請求。允許匿名或公開存取的 Amazon S3 儲存貯體不會將此存取權套用至使用 AWS KMS 加密的物件。從您要提供的 S3 物件中移除 AWS KMS 加密。不使用 AWS KMS ,而是使用 AES-256 對物件加密。
確定物件是否已進行 AWS KMS 加密
若要檢查儲存貯體中的物件是否已進行 AWS KMS 加密,請完成下列工作:
在 Amazon S3 主控台中檢視物件的屬性。如果在加密對話方塊中選取了 AWS-KMS,則該物件已進行 AWS KMS 加密。
或者,執行 AWS CLI 以執行 head-object 命令。如果該命令以 aws:kms 傳回 ServerSideEncryption,則表示該物件已進行 AWS KMS 加密。
變更物件的加密設定
若要使用 Amazon S3 主控台變更物件的加密設定,請參閱使用 AWS KMS (SSE-KMS) 指定伺服器端加密。
若要使用 AWS CLI 變更物件的加密設定,請確認物件的儲存貯體未使用 AWS KMS 作為預設加密。如果儲存貯體以 AWS KMS 作為預設加密,請將加密變更為 SSE-S3。
如果儲存貯體沒有預設加密,請執行下列命令將物件複製到自身並移除物件加密:
aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html
注意: 將 DOC-EXAMPLE-BUCKET 取代為您的儲存貯體名稱。將物件複製到自身時,動作會移除 storage-class 和 website-redirect-location 的設定。若要在新物件中保持這些設定,請在複製請求中明確指定這些值。
檢閱您的儲存貯體政策
您的儲存貯體政策不能有用於封鎖公開讀取 s3:GetObject 動作的拒絕陳述式。
如果對 s3:GetObject 具有明確允許陳述式,請確保沒有與該陳述式衝突的明確拒絕陳述式。明確的拒絕陳述式總是會覆寫明確的允許陳述式。
若要檢閱 s3:GetObject 的儲存貯體政策,請完成下列步驟:
- 開啟 Amazon S3 主控台,然後瀏覽至您的 S3 儲存貯體。
- 選擇許可標籤。
- 選擇儲存貯體政策。
- 檢閱具有 "Action": "s3:GetObject" 或 "Action": "s3:*" 的陳述式的儲存貯體政策。
- 修改儲存貯體政策以移除或編輯封鎖公開讀取 s3:GetObject 的陳述式。
例如,下列政策包含公開存取 s3:GetObject 的明確允許陳述式。但是,它還包含 s3:GetObject 的明確拒絕陳述式,除非請求來自特定的 Amazon Virtual Private Cloud (Amazon VPC)。修改此政策以允許 s3:GetObject 動作:
{ "Version": "2012-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": "Allow-OAI-Access-To-Bucket", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EAF5#########" }, "Action": "s3:GetObject", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ] }, { "Sid": "Allow-Public-Access-To-Bucket", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ] }, { "Sid": "Access-to-specific-VPCE-only", "Effect": "Deny", "Principal": "*", "Action": "s3:GetObject", "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ], "Condition": { "StringNotEquals": { "aws:sourceVpce": "vpce-1a2b3c4d" } } } ] }
下列政策是允許唯讀公開存取 S3 網站端點的 Amazon S3 儲存貯體政策的範例:
{ "Version": "2012-10-17", "Statement": { "Sid": "AllowPublicReadOnly", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" } }
檢閱儲存貯體和物件所有權
為使儲存貯體政策允許公開讀取物件,擁有該儲存貯體的 AWS 帳戶也必須擁有該物件。
**注意:**物件所有權要求適用於儲存貯體政策授予的公開讀取權限。它不適用於物件的存取控制清單 (ACL) 授予的公開讀取權限。
確認儲存貯體和物件具有相同的所有者
注意:您可以使用 Amazon S3 主控台來檢查儲存貯體和物件所有者。您可以在儲存貯體或物件許可標籤上找到所有者。
若要使用 AWS CLI 檢查儲存貯體和物件所有者,請執行下列命令:
執行 list-buckets 命令以獲取儲存貯體所有者的 S3 標準 ID:
aws s3api list-buckets --query Owner.ID
執行 list-objects 命令以取得物件所有者的 S3 標準 ID:
aws s3api list-objects --bucket DOC-EXAMPLE-BUCKET --prefix index.html
**注意:**上述範例命令的輸出顯示單一物件,但您可以使用 list-objects 命令來檢查多個物件。如果標準 ID 不相符,則表示儲存貯體和物件具有不同的所有者。
更新物件所有權
儲存貯體所有者可以使用 S3 物件所有權管理物件的所有權。依預設,所有新 S3 儲存貯體都會開啟 S3 物件所有權設定。若要更新現有儲存貯體,請參閱在現有儲存貯體上設定物件所有權。
儲存貯體所有者最佳實務是在所有儲存貯體上使用 S3 物件所有權設定。此外,透過 AWS Identity and Access Management (IAM) 角色和儲存貯體政策來管理權限也是最佳實務。
若要移除儲存貯體的 ACL 並取得儲存貯體中所有物件的所有權,請執行 put-bucket-ownership-controls 命令:
aws s3api put-bucket-ownership-controls --bucket example-bucket --ownership-controls 'Rules=[{ObjectOwnership=BucketOwnerEnforced}]'
如果您不想關閉 S3 儲存貯體上的 ACL,請將物件的所有者變更為儲存貯體所有者。
請完成下列步驟:
-
從物件所有者的帳戶中,執行 get-object-acl 命令以擷取指派給物件的 ACL 權限:
aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name注意: 如果物件具有 bucket-owner-full-control ACL 權限,請跳至步驟 3。
-
如果物件沒有 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 -
從儲存貯體所有者的帳戶中,執行下列命令,將物件複製到自身並變更物件的所有者:
aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html**注意:**將 DOC-EXAMPLE-BUCKET 取代為您的儲存貯體的名稱。將 DOC-EXAMPLE-BUCKET 取代為您的儲存貯體的名稱。
檢閱儲存貯體的封鎖公開存取設定
確定沒有 Amazon S3 封鎖公開存取設定套用至儲存貯體或帳戶。這些設定可以覆寫允許公開讀取存取限的許可。Amazon S3 封鎖公開存取設定可套用至個別儲存貯體或 AWS 帳戶。
確認儲存貯體中的物件可公開存取
使用網站端點的發行版僅支援可公開存取的內容。為確定 S3 儲存貯體中的物件是否可公開存取,請在網頁瀏覽器中開啟 S3 網站端點的物件 URL。或者,在 URL 上執行 curl 命令。
範例:
http://DOC-EXAMPLE-BUCKET.s3-website-us-east-1.amazonaws.com/index.html
如果 Web 瀏覽器或 curl 命令傳回存取遭拒錯誤,則該物件無法公開存取。
若要允許公開讀取存取權,請完成下列其中一項工作:
- 建立儲存貯體政策,允許對儲存貯體中所有物件的公開讀取存取權。
- 使用 Amazon S3 主控台允許對物件的公開讀取存取權。
檢閱「請求者付款」選項
如果請求者付款已開啟,請關閉該選項。請求者付款儲存貯體不允許透過網站端點存取。
檢閱您的自訂標頭
如果您使用 referer 標頭來限制從 CloudFront 存取 S3 網站端點來源,請檢查您的儲存貯體政策。確認在 S3 儲存貯體政策上設定的密碼值或權杖是否與 CloudFront 原始自訂標頭上的值相符。
若要在儲存貯體政策中使用明確的拒絕陳述式,則必須具有根據 referer 標頭授予存取權的允許陳述式。不能只使用明確的拒絕陳述式授予存取權。
例如,如果請求包含字串 "aws:Referer":"MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER",下列儲存貯體政策會授予對 S3 原點的存取權
CloudFront 原始自訂標頭必須具有下列組態:
- 標頭:referer
- 值: MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER
儲存貯體政策範例:
{ "Version":"2012-10-17", "Id":"http referer policy example", "Statement":[ { "Sid":"Allow get requests originating from my CloudFront with referer header", "Effect":"Allow", "Principal":"*", "Action":"s3:GetObject", "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*", "Condition":{ "StringLike":{"aws:Referer":"MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER"} } } ] }
**注意:**由於 Principal 是萬用字元值 ("Principal":"*"),因此範例儲存貯體政策會授予對該儲存貯體的公開 (匿名) 存取權。由於條件陳述式,請求必須包含 referer 標頭,且標頭值必須與儲存貯體政策中的值相符。如果條件陳述式未滿足,則無法存取 S3 原點。
檢閱組織的管理帳戶
使用 AWS Organizations 中組織的管理帳戶來檢查拒絕服務控制政策 (SCP)。檢閱附加到組織根目錄、組織單位 (OU) 或直接連接帳戶的 s3:GetObject 動作的拒絕政策。
相關資訊
為什麼當我使用 S3 REST API 端點作為 CloudFront 發行版的來源時,我會收到「403 存取遭拒」錯誤?
- 語言
- 中文 (繁體)

相關內容
- 已提問 1 年前
- 已提問 2 年前
