針對 Amazon S3 中的拒絕存取 (403 禁止) 錯誤進行疑難排解 - Amazon Simple Storage Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

針對 Amazon S3 中的拒絕存取 (403 禁止) 錯誤進行疑難排解

下列主題涵蓋 Amazon S3 中拒絕存取 (403 禁止) 錯誤的最常見原因。

注意

如果您嘗試對許可問題進行故障診斷,請從儲存貯體政策和 IAM 政策一節開始,且務必遵循檢查許可的秘訣中的指引。

儲存貯體政策與 IAM 政策

儲存貯體層級操作

如果沒有適當的儲存貯體政策,則儲存貯體會隱含地允許來自儲存貯體擁有帳戶中任何 AWS Identity and Access Management (IAM) 身分的請求。儲存貯體也會隱含地拒絕來自任何其他帳戶中任何其他 IAM 身分的請求,以及匿名 (未簽署) 請求。不過,如果沒有適當的 IAM 使用者政策,則會隱含地拒絕請求者 (除非他們是根使用者) 提出任何請求。如需評估邏輯的詳細資訊,請參閱《IAM 使用者指南》中的判斷允許還是拒絕帳戶內的請求

物件層級操作

如果物件是儲存貯體擁有帳戶所擁有,則儲存貯體政策和 IAM 使用者政策的運作方式與物件層級操作的運作方式相同,因為它們都適用於物件層級操作。例如,如果沒有適當的儲存貯體政策,則儲存貯體會隱含地允許來自儲存貯體擁有帳戶中任何 IAM 身分的物件請求。儲存貯體也會隱含地拒絕來自任何其他帳戶中任何其他 IAM 身分的物件請求,以及匿名 (未簽署) 請求。不過,如果沒有適當的 IAM 使用者政策,則會隱含地拒絕請求者 (除非他們是根使用者) 提出任何物件請求。

如果物件是由外部帳戶擁有,則只能透過物件存取控制清單 (ACL) 授予物件的存取權。儲存貯體政策和 IAM 使用者政策仍可用來拒絕物件請求。

因此,若要確保您的儲存貯體政策或 IAM 使用者政策不會造成「拒絕存取」(403 禁止) 錯誤,請確定符合下列需求:

  • 對於同一帳戶存取,在儲存貯體政策或 IAM 使用者政策中,對您嘗試授予其許可的請求者不得有明確的 Deny 陳述式。如果您只想要使用儲存貯體政策和 IAM 使用者政策授予許可,則其中一項政策中至少須有一個明確的 Allow 陳述式。

  • 對於跨帳戶存取權,在儲存貯體政策或 IAM 使用者政策中,對您嘗試授予其許可的請求者不得有明確的 Deny 陳述式。如果您只想要使用儲存貯體政策和 IAM 使用者政策來授予跨帳戶許可,則請求者的儲存貯體政策和 IAM 使用者政策都必須包含明確的 Allow 陳述式。

注意

儲存貯體政策中的 Allow 陳述式僅適用於同一儲存貯體擁有帳戶所擁有的物件。不過,儲存貯體政策中的 Deny 陳述式會套用至所有物件,不論物件擁有權為何。

檢視或編輯儲存貯體政策
注意

若要檢視或編輯儲存貯體政策,您必須具備 s3:GetBucketPolicy 許可。

  1. 登入 AWS Management Console,並開啟位於 https://console.aws.amazon.com/s3/ 的 Amazon S3 主控台。

  2. 在左側導覽窗格中,選擇 Buckets (儲存貯體)。

  3. 儲存貯體清單中,選擇要檢視或建立其儲存貯體政策的儲存貯體名稱。

  4. 選擇許可索引標籤標籤。

  5. Bucket policy (儲存貯體政策) 下方,選擇 Edit (編輯)Edit bucket policy (編輯儲存貯體政策) 頁面隨即出現。

若要使用 AWS Command Line Interface (AWS CLI) 檢閱或編輯儲存貯體政策,請使用 get-bucket-policy 命令。

注意

如果您由於儲存貯體政策不正確而遭到鎖定,請使用根使用者憑證登入 AWS Management Console。若要重新取得儲存貯體的存取權,請務必使用根使用者憑證刪除儲存貯體政策。

檢查許可的秘訣

若要檢查請求者是否具有適當的許可來執行 Amazon S3 操作,請嘗試以下動作:

Amazon S3 ACL 設定

檢查 ACL 設定時,請先檢閱物件擁有權設定,以檢查儲存貯體上是否已啟用 ACL。請注意,ACL 許可只能用來授予許可,而且無法用來拒絕請求。ACL 也無法用來將存取權授予儲存貯體政策或 IAM 使用者政策中明確拒絕的請求者。

「物件擁有權」會設定為套用儲存貯體擁有者強制執行。

如果已啟用儲存貯體擁有者強制執行設定,則 ACL 設定不太可能造成「拒絕存取 (403 禁止)」錯誤,因為此設定會停用所有套用至儲存貯體和物件的 ACL。儲存貯體擁有者強制執行是 Amazon S3 儲存貯體的預設 (和建議) 設定。

「物件擁有權」設定會設定為儲存貯體擁有者偏好或物件寫入者

ACL 許可仍適用於儲存貯體擁有者偏好設定或物件寫入者設定。有兩種 ACL:儲存貯體 ACL 和物件 ACL。如需這兩種 ACL 類型之間的差異,請參閱 ACL 許可與存取政策許可的對應

根據遭拒請求的動作,檢查儲存貯體或物件的 ACL 許可

  • 如果 Amazon S3 拒絕了LISTPUT 物件、GetBucketAclPutBucketAcl 請求,請檢閱儲存貯體的 ACL 許可

    注意

    您無法使用儲存貯體 ACL 設定授予 GET 物件許可。

  • 如果 Amazon S3 拒絕了 S3 物件上的 GET 請求,或 PutObjectAcl 請求,請檢閱物件的 ACL 許可

    重要

    如果擁有物件的帳戶與擁有儲存貯體的帳戶不同,則儲存貯體政策不會控制物件的存取。

針對跨帳戶物件擁有權期間來自 GET 物件請求的「拒絕存取 (403 禁止)」錯誤進行疑難排解

檢閱儲存貯體的物件擁有權設定,以判斷物件擁有者。如果您有權存取物件 ACL,也可以檢查物件擁有者的帳戶。(若要檢視物件擁有者的帳戶,請檢閱 Amazon S3 主控台中的物件 ACL 設定。) 或者,您也可以提出 GetObjectAcl 請求以尋找物件擁有者的正式 ID,以驗證物件擁有者帳戶。根據預設,ACL 會將 GET 請求的明確允許許可授予物件擁有者的帳戶。

在確認了物件擁有者與儲存貯體擁有者不同之後,請根據您的使用案例和存取層級,選擇下列其中一種方法來協助解決「拒絕存取 (403 禁止)」錯誤:

  • 停用 ACL (建議) - 此方法將套用至所有物件,並可由儲存貯體擁有者執行。此方法會自動給與儲存貯體擁有者擁有權,並讓其完全控制儲存貯體中的每個物件。實作此方法之前,請檢查停用 ACL 的先決條件。如需如何將儲存貯體設定為儲存貯體擁有者強制執行 (建議) 模式的相關資訊,請參閱在現有儲存貯體上設定物件擁有權

    重要

    若要避免發生「拒絕存取 (403 禁止)」錯誤,請務必先將 ACL 許可遷移至儲存貯體政策,然後再停用 ACL。如需詳細資訊,請參閱從 ACL 許可遷移的儲存貯體政策範例

  • 將物件擁有者變更為儲存貯體擁有者 - 此方法可套用至個別物件,但只有物件擁有者 (或具有適當許可的使用者) 才能變更物件的擁有權。可能需要支付額外的 PUT 費用。(如需詳細資訊,請參閱 Amazon S3 定價。) 此方法授予儲存貯體擁有者物件的完整擁有權,允許儲存貯體擁有者透過儲存貯體政策控制物件的存取。

    若要變更物件的擁有權,請執行下列其中一個動作:

    • 您 (儲存貯體擁有者) 可將物件複製回儲存貯體。

    • 您可以將儲存貯體的「物件擁有權」設定變更為儲存貯體擁有者偏好。如果停用版本控制,則會覆寫儲存貯體中的物件。如果啟用了版本控制,則相同物件的重複版本將會出現在儲存貯體中,而儲存貯體擁有者可以將生命週期規則設定為過期。如需如何變更「物件擁有權」設定的指示,請參閱 設定現有儲存貯體的「物件擁有權」

      注意

      當您將「物件擁有權」設定更新為儲存貯體擁有者偏好時,此設定只會套用至上載至儲存貯體的新物件。

    • 您可以使用 bucket-owner-full-control 標準物件 ACL 讓物件擁有者重新上傳物件。

    注意

    對於跨帳戶上傳,您也可以在儲存貯體政策中要求 bucket-owner-full-control 標準物件 ACL。如需儲存貯體政策範例,請參閱授予跨帳戶許可,以在確保儲存貯體擁有者具有完全控制時上傳物件

  • 將物件寫入者保留為物件擁有者 - 此方法不會變更物件擁有者,但可讓您個別授予物件的存取權。若要授予物件的存取權,您必須具有該物件的 PutObjectAcl 許可。然後,若要修正「拒絕存取 (403 禁止)」錯誤,請將請求者新增為被授予者,以存取物件 ACL 中的物件。如需詳細資訊,請參閱 設定 ACL

S3 封鎖公開存取設定

如果失敗的請求涉及公開存取或公開政策,請檢查帳戶、儲存貯體或 S3 存取點上的 S3 封鎖公開存取設定。從 2023 年 4 月起,新儲存貯體的所有封鎖公開存取設定預設為啟用。如需 Amazon S3 如何定義「公開」的詳細資訊,請參閱 「公有」的意義

設定為 TRUE 時,「封鎖公開存取」設定會作為明確拒絕政策,覆寫 ACL、儲存貯體政策和 IAM 使用者政策所允許的許可。若要判斷您的「封鎖公開存取」設定是否拒絕您的請求,請檢閱下列案例:

  • 如果指定的存取控制清單 (ACL) 為公有,則 BlockPublicAcls 設定會拒絕您的 PutBucketAclPutObjectACL 呼叫。

  • 如果請求包含公有 ACL,則 BlockPublicAcls 設定會拒絕您的 PutObject 呼叫。

  • 如果 BlockPublicAcls 設定套用至帳戶,且請求包含公有 ACL,則任何包含公有 ACL 的 CreateBucket 呼叫都會失敗。

  • 如果請求的許可僅由公有 ACL 授予,則 IgnorePublicAcls 設定會拒絕該請求。

  • 如果指定的儲存貯體政策允許公開存取,則 BlockPublicPolicy 設定會拒絕您的 PutBucketPolicy 呼叫。

  • 如果將 BlockPublicPolicy 設定套用至存取點,則指定公有政策且透過存取點進行的所有 PutAccessPointPolicyPutBucketPolicy 呼叫都會失敗。

  • 如果存取點或儲存貯體具有公有政策,則 RestrictPublicBuckets 設定會拒絕除 AWS 服務 主體以外的所有跨帳戶呼叫。此設定也會拒絕所有匿名 (或未簽署) 呼叫。

若要檢閱和更新您的「封鎖公開存取」設定組態,請參閱 為您的 S3 儲存貯體設定封鎖公開存取

Amazon S3 加密設定

Amazon S3 支援儲存貯體上的伺服器端加密。伺服器端加密是指接收資料的應用程式或服務在目的地將資料加密。Amazon S3 會在將物件層級的資料寫入 AWS 資料中心的磁碟時加密資料,並在您存取資料時解密資料。

依預設,Amazon S3 現在將伺服器端加密與 Amazon S3 受管金鑰 (SSE-S3) 套用為 Amazon S3 中每個儲存貯體的基本加密層級。Amazon S3 也可讓您在上傳物件時指定伺服器端加密方法。

檢閱儲存貯體的伺服器端加密狀態和加密設定
  1. 登入 AWS Management Console,並開啟位於 https://console.aws.amazon.com/s3/ 的 Amazon S3 主控台。

  2. 在左側導覽窗格中,選擇 Buckets (儲存貯體)。

  3. 儲存貯體清單中,選擇要檢查其加密設定的儲存貯體。

  4. 選擇屬性索引標籤。

  5. 向下捲動至預設加密區段,然後檢視加密類型設定。

若要使用 AWS CLI 檢查您的加密設定,請使用 get-bucket-encryption 命令。

檢查物件的加密狀態
  1. 登入 AWS Management Console,並開啟位於 https://console.aws.amazon.com/s3/ 的 Amazon S3 主控台。

  2. 在左側導覽窗格中,選擇 Buckets (儲存貯體)。

  3. 儲存貯體清單中,選擇包含該物件的儲存貯體名稱。

  4. 物件清單中,選擇您想要新增或變更其加密的物件名稱。

    物件的詳細資訊頁面隨即出現。

  5. 向下捲動至伺服器端加密設定區段,以檢視物件的伺服器端加密設定。

若要使用 AWS CLI 檢查您的物件加密狀態,請使用 head-object 命令。

加密和許可需求

Amazon S3 支援三種類型的伺服器端加密:

  • 使用 Amazon S3 受管金鑰 (SSE-S3) 的伺服器端加密

  • 以 AWS Key Management Service (AWS KMS) 金鑰 (SSE-KMS) 為伺服器端加密。

  • 使用客戶提供金鑰 (SSE-C) 的伺服器端加密

根據您的加密設定,確定符合下列許可需求:

  • SSE-S3 - 不需要額外的許可。

  • SSE-KMS (搭配客戶受管金鑰) - 若要上傳物件,需要 AWS KMS key 上的 kms:GenerateDataKey 權限。若要下載物件並執行物件的分段上傳,需要 KMS 金鑰上的 kms:Decrypt 許可。

  • SSE-KMS (搭配 AWS 受管金鑰) - 請求者必須來自擁有 aws/s3 KMS 金鑰的相同帳戶。請求者亦須具有正確的 Amazon S3 許可才能存取物件。

  • SSE-C (搭配客戶提供的金鑰) - 不需要其他許可。您可以設定儲存貯體政策,針對儲存貯體中的物件使用客戶提供的加密金鑰來要求和限制伺服器端加密

如果物件使用客戶受管金鑰加密,請確定 KMS 金鑰政策允許您執行 kms:GenerateDataKeykms:Decrypt 動作。如需檢查 KMS 金鑰政策的指示,請參閱《AWS Key Management Service 開發人員指南》中的檢視金鑰政策

S3 物件鎖定設定

如果您的儲存貯體已啟用 S3 物件鎖定,且物件受到保留期法務保存的保護,則在您嘗試刪除物件時,Amazon S3 會傳回「拒絕存取 (403 禁止)」錯誤。

檢查儲存貯體是否已啟用物件鎖定
  1. 登入 AWS Management Console,並開啟位於 https://console.aws.amazon.com/s3/ 的 Amazon S3 主控台。

  2. 在左側導覽窗格中,選擇 Buckets (儲存貯體)。

  3. 儲存貯體清單中,選擇您要檢閱的儲存貯體名稱。

  4. 選擇屬性索引標籤。

  5. 向下捲動至物件鎖定區段。確認物件鎖定設定為已啟用已停用

若要判斷物件是否受到保留期或法務保存保護,請檢視物件的鎖定資訊

如果物件受到保留期或法務保存保護,請檢查下列情況:

  • 如果物件版本受到合規保留模式保護,則沒有任何方式可將其永久刪除。來自任何請求者 (包括根使用者) 的永久 DELETE 請求都會導致「拒絕存取 (403 禁止)」錯誤。此外,請注意,當您針對受合規保留模式保護的物件提交 DELETE 請求時,Amazon S3 會為該物件建立刪除標記

  • 如果物件版本受控管保留模式保護,且您具有 s3:BypassGovernanceRetention 許可,您可以略過保護並永久刪除版本。如需詳細資訊,請參閱繞過控管模式

  • 如果物件版本受法務保存保護,則永久 DELETE 請求可能會導致「拒絕存取 (403 禁止)」錯誤。若要永久刪除物件版本,您必須移除物件版本上的法務保存。若要移除法務保存,您必須具有 s3:PutObjectLegalHold 許可。如需移除法務保存的詳細資訊,請參閱 設定 S3 物件鎖定

VPC 端點政策

如果您使用虛擬私有雲端 (VPC) 端點來存取 Amazon S3,請確定 VPC 端點政策不會封鎖您存取 Amazon S3 資源。依預設,VPC 端點政策允許所有對 Amazon S3 的請求。您也可以設定 VPC 端點政策來限制特定請求。如需如何檢查 VPC 端點政策的詳細資訊,請參閱《AWS PrivateLink 指南》中的使用端點政策控制對 VPC 端點的存取

AWS Organizations 政策:

如果您的 AWS 帳戶 屬於組織,AWS Organizations 政策可能會封鎖您存取 Amazon S3 資源。依預設,AWS Organizations 政策不會封鎖任何對 Amazon S3 的請求。不過,請確定您的 AWS Organizations 政策尚未設定為封鎖 S3 儲存貯體的存取。如需如何檢查 AWS Organizations 政策的指示,請參閱《AWS Organizations 使用者指南》中的列出所有政策

存取點設定

如果您在透過 Amazon S3 存取點提出請求時收到「拒絕存取 (403 禁止)」錯誤,則可能需要檢查下列事項:

  • 存取點的組態

  • 用於存取點的 IAM 使用者政策

  • 用來管理或設定跨帳戶存取點的儲存貯體政策

存取點組態與政策
  • 建立存取點時,您可以選擇將網際網路VPC 指定為網路原點。如果網路原點設定為僅限 VPC,Amazon S3 將拒絕對非來自指定 VPC 的存取點所發出的任何請求。若要檢查存取點的網路原點,請參閱 建立受限於 Virtual Private Cloud 的存取點

  • 使用存取點,您也可以設定自訂的「封鎖公開存取」設定,其運作方式與儲存貯體或帳戶層級的「封鎖公開存取」設定類似。若要檢查您的自訂「封鎖公開存取」設定,請參閱 管理存取點的公開存取

  • 若要使用存取點對 Amazon S3 提出成功的請求,請確保請求者具有必要的 IAM 許可。如需詳細資訊,請參閱 配置使用存取點的 IAM 原則

  • 如果請求涉及跨帳戶存取點,請確定儲存貯體擁有者已更新儲存貯體政策,以授權來自存取點的請求。如需詳細資訊,請參閱 授予跨帳戶存取點的許可

如果檢查本主題中的所有項目後,「拒絕存取 (403 禁止)」錯誤仍然存在,請擷取您的 Amazon S3 請求 ID,並聯絡 AWS Support 以取得其他指引。