
您好,我有一個問題,我在我的網域中接收了 AccessDenied
我將我的網站上傳到 AWS S3 Bucket,公開並建立靜態頁面,但是當我透過 domain.com/mypage 造訪時,我收到 AccessDenied。
從 aws mydomain.s3.amazonaws.com/mypage 工作正常。
我的網域DNS是這樣設定的
;; ANSWER SECTION:
mydomain.com. 2101 IN CNAME mydomain.s3.amazonaws.com.
mydomain.s3.amazonaws.com. 41342 IN CNAME s3-1-w.amazonaws.com.
s3-1-w.amazonaws.com. 219 IN CNAME s3-w.us-east-1.amazonaws.com.
s3-w.us-east-1.amazonaws.com. 3 IN A 52.217.69.36
有什麼建議可以解決這個問題嗎?
答案1
這是來自亞馬遜支援文檔:
簡短的介紹:
若要排查存取被拒絕錯誤,請確定您的指派的來源網域是 S3 網站端點還是 S3 REST API 端點。請依照以下步驟確定端點類型:
- 開啟 CloudFront 控制台。
- 選擇您的 CloudFront 分配,然後選擇分配設定。
- 選擇“來源”和“來源組”標籤。
- 選擇“來源”和“來源組”標籤。
查看「來源域名」和「路徑」下的域名,然後根據域名的格式決定終端節點類型。
REST API 端點使用以下格式:
DOC-EXAMPLE-BUCKET.s3.amazonaws.com
筆記:確保遵循 Amazon S3 儲存桶的命名規則。
網站端點使用以下格式:
DOC-EXAMPLE-BUCKET.s3-website-us-east-1.amazonaws.com
筆記:根據 AWS 區域,終端節點格式可能使用短劃線格式 (s3-website-Region) 或點格式 (s3-website.Region)。
如果您的指派使用 REST API 端點,請參閱我使用 S3 REST API 端點作為 CloudFront 指派的來源。為什麼我會收到 403 訪問被拒絕錯誤?
如果您的指派使用網站端點,請驗證以下要求以避免存取被拒絕錯誤:
- 儲存桶中的物件必須可公開存取。
- 儲存桶中的物件無法透過 AWS Key Management Service (AWS KMS) 加密。
- 儲存桶策略必須允許存取 s3:GetObject。
- 如果儲存桶策略授予公共讀取存取權限,則擁有該儲存桶的 AWS 帳戶也必須擁有該物件。 5.請求的物件必須存在於桶中。
- 必須在儲存桶上停用 Amazon S3 阻止公共存取。
- 如果啟用了請求者付款,則請求必須包含請求付款者參數。
- 如果您使用 Referer 標頭來限制從 CloudFront 到 S3 來源的訪問,請查看自訂標頭。
筆記:如果您不想允許公開(匿名的) 存取您的 S3 對象,然後變更您的配置以使用 S3 REST API 端點作為您的分發的來源。然後,配置您的指派和 S3 儲存桶以使用來源存取身分 (OAI) 限制存取。如需說明,請參閱如何使用 CloudFront 為 Amazon S3 上託管的靜態網站提供服務?
解決
儲存桶中的物件必須可公開存取
使用網站端點的分發僅支援可公開存取的內容。若要確定 S3 儲存桶中的物件是否可公開訪問,請在 Web 瀏覽器中開啟該物件的 URL。或者,您可以對 URL 執行curl 命令。
以下是 S3 物件的範例 URL:
http://DOC-EXAMPLE-BUCKET.s3-website-us-east-1.amazonaws.com/index.html
如果 Web 瀏覽器或curl 指令傳回存取被拒絕錯誤,則該物件不可公開存取。
透過以下方式之一允許對物件的公共讀取存取:
- 建立儲存桶策略,允許對儲存桶中的所有物件進行公共讀取存取。
- 使用 Amazon S3 控制台允許對該物件進行公共讀取存取。
- 儲存桶中的物件無法進行 AWS KMS 加密
- CloudFront 發行版不支援 AWS KMS 加密的物件。您必須從要使用該發行版提供服務的 S3 物件中刪除 KMS 加密。
筆記:不要使用 AWS KMS 加密,而是使用 AES-256 來加密您的物件。
使用以下方法之一檢查儲存桶中的物件是否經過 KMS 加密:
使用 Amazon S3 主控台查看物件的屬性。查看“加密”對話框。如果選擇 AWS-KMS,則物件是 KMS 加密的。使用 AWS 命令列介面 (AWS CLI) 執行 head-object 命令。如果該指令傳回 ServerSideEncryption 作為 aws:kms,則該物件是 KMS 加密的。注意:如果您在執行 AWS CLI 命令時收到錯誤,請確保您使用的是最新版本的 AWS CLI。若要使用 Amazon S3 控制台變更物件的加密設置,請參閱如何為 S3 物件新增加密?
使用以下命令更改物件的加密設定AWS CLI,首先驗證物件的儲存桶沒有預設加密。如果儲存桶沒有預設加密,則執行以下命令,透過將物件複製到自身來刪除物件的加密:
aws s3 cp s3://DOC-EXAMPLE-BUCKET/index.html s3://DOC-EXAMPLE-BUCKET/index.html
警告:複製物件本身會刪除儲存類別和
網站重定向位置的設定。若要在新物件中維護這些設置,請務必在複製請求中明確指定儲存類別或網站重定向位置值。儲存桶策略必須允許存取 s3:GetObject 要使用具有 S3 網站終端節點的分配,您的儲存桶策略不得包含阻止對 s3:GetObject 操作的公共讀取存取的拒絕語句。
即使您的儲存桶策略中有 s3:GetObject 的明確允許語句,也要確認不存在衝突的明確拒絕語句。明確拒絕語句總是會覆寫明確允許語句。
請依照以下步驟查看 s3:GetObject 的儲存桶策略:
從 Amazon S3 控制台開啟您的 S3 儲存桶。
選擇“權限”選項卡。
選擇儲存桶策略。
查看儲存桶策略中是否有包含「Action」:「s3:GetObject」或「Action」:「s3:*」的語句。
以下範例策略包含用於公共存取 s3:GetObject 的明確允許語句。但是,s3:GetObject 還有一個明確拒絕語句,該語句會阻止訪問,除非請求來自特定的 Amazon Virtual Private Cloud (Amazon VPC)。
{ "Version": "2008-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": "Allow-OAI-Access-To-Bucket", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity EAF5XXXXXXXXX" }, "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:GetObject 的公共讀取存取的語句。
筆記:CloudFront 會在錯誤快取最小 TTL 中指定的時間內快取存取被拒絕錯誤的結果。預設值為一分鐘。從儲存桶策略中刪除拒絕語句後,您可以對分配運行失效以從快取中刪除物件。
如果儲存桶策略授予公共讀取存取權限,則擁有該儲存桶的AWS 帳戶也必須擁有該物件。對象。儲存桶或物件由建立該儲存桶或物件的 AWS Identity and Access Management (IAM) 身分的帳戶擁有。
筆記:物件所有權要求適用於儲存桶策略授予的公共讀取存取權限。它不適用於物件的存取控制清單 (ACL) 授予的公共讀取存取權限。
請依照以下步驟檢查儲存桶和物件是否具有相同的擁有者:
- 執行下列 AWS CLI 命令以取得儲存桶擁有者的 S3 規範 ID:
aws s3api list-buckets --query Owner.ID
- 執行以下命令以取得物件擁有者的 S3 規範 ID:
注意:此範例顯示單一對象,但您可以使用 list 指令檢查多個對象。
aws s3api list-objects --bucket DOC-EXAMPLE-BUCKET --prefix index.html
- 如果規範 ID 不匹配,則儲存桶和物件具有不同的擁有者。
注意:您也可以使用 Amazon S3 控制台檢查儲存桶和物件擁有者。擁有者可在對應儲存桶或物件的「權限」標籤中找到。
請依照下列步驟將物件的擁有者變更為儲存桶擁有者:
- 從物件擁有者的帳戶中,執行以下命令以檢索指派給該物件的 ACL 權限:
aws s3api get-object-acl --bucket DOC-EXAMPLE-BUCKET --key object-name
- 如果物件具有儲存桶擁有者完全控制 ACL 權限,則跳至步驟 #3。如果物件沒有 Bucket-owner-full-control 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
請求的物件必須存在於桶中如果使用者沒有 s3:ListBucket 權限,則使用者會收到缺少物件的「存取被拒絕」錯誤,而不是「404 找不到」錯誤。執行 head-object AWS CLI 指令來檢查儲存桶中是否存在物件。
筆記:確認傳送至 CloudFront 的物件請求與 S3 物件名稱完全相符。 S3 物件名稱區分大小寫。如果請求沒有正確的物件名稱,則 Amazon S3 會做出回應,就像物件遺失一樣。若要確定 CloudFront 正在從 Amazon S3 請求哪個對象,請使用伺服器存取日誌記錄。
如果該物件存在於儲存桶中,則不會出現拒絕存取錯誤 屏蔽 404 Not Found 錯誤。驗證其他配置要求以解決存取被拒絕錯誤。
如果該物件不在儲存桶中,則拒絕存取錯誤為 屏蔽 404 Not Found 錯誤。解決與丟失物件相關的問題。
筆記:啟用公用 s3:ListBucket 存取權並不是安全最佳實務。啟用公共 s3:ListBucket 存取權限可讓使用者查看並列出儲存桶中的所有物件。即使使用者沒有下載物件的權限,這也會向使用者公開物件元資料詳細資料(例如金鑰和大小)。
必須在儲存桶上停用 Amazon S3 阻止公共訪問確認沒有任何 Amazon S3 阻止公共存取設定應用於該儲存桶。這些設定可以覆蓋允許公共讀取存取的權限。 Amazon S3 阻止公共存取設定可以套用至單一儲存桶或 AWS 帳戶。
如果啟用了 Requester Pays,則請求必須包含 request-payer 參數。其他帳戶的使用者向儲存桶發送請求時,必須指定 request-payer 參數。否則,這些用戶會收到拒絕存取錯誤。
如果您使用 Referer 標頭來限制從 CloudFront 存取您的 S3 來源,請檢查自訂標頭 如果您使用 Referer 標頭限制從 CloudFront 存取您的 S3 網站終端節點來源,請檢查金鑰值或令牌集關於S3 儲存桶策略。然後,確認秘密值或令牌與 CloudFront 源自於定義標頭上的值相符。
如果您在儲存桶策略中使用明確拒絕語句,請確認還有一個允許語句根據 Referer 標頭授予存取權限。您不能僅使用明確拒絕語句來授予存取權限。
例如,當請求包含字串時,以下儲存桶策略授予對 S3 來源的存取權限 "aws: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"} } } ] }
對於此範例儲存桶策略,CloudFront 源自於定義標頭必須是:
- 標頭: 推薦人
- 價值:MY_SECRET_TOKEN_CONFIGURED_ON_CLOUDFRONT_ORIGIN_CUSTOM_HEADER
筆記: 範例儲存桶策略授予對儲存桶的公共(匿名)存取權限,因為主體是通配符值 ("Principal":"*")。但是,由於條件語句的原因,只有當請求包含 Referer 標頭且標頭值與儲存桶策略中的值相符時,才會授予對 S3 來源的存取權限。