如何對來自 Amazon S3 的「403 存取遭拒」錯誤進行疑難排解?

上次更新日期:2022 年 5 月 13 日

我的使用者正嘗試存取 Amazon Simple Storage Service (Amazon S3) 儲存貯體中的物件,但 Amazon S3 傳回「403 存取遭拒」錯誤。如何對此錯誤進行疑難配接?

解決方案

使用 AWS Systems Manager Automation 文件

在 AWS Systems Manager 上使用 AWSSupport-TroubleshootS3PublicRead 自動化文件。此自動化文件可幫助您診斷從您指定的公開 S3 儲存貯體讀取物件的問題。

檢查儲存貯體和物件擁有權

對於 GetObjectHeadObject 請求的 AccessDenied 錯誤,請檢查物件是否也由儲存貯體擁有者所擁有。此外,請驗證儲存貯體擁有者具有讀取或完全控制存取控制清單 (ACL) 許可

確認擁有物件的帳戶

依預設,上傳 S3 物件的 AWS 帳戶即為其擁有者。即使該儲存貯體為另一帳戶所有,亦是如此。如果其他帳戶可以將物件上傳到您的儲存貯體,則驗證哪個帳戶擁有您的使用者無法存取的物件。

注意:如果您在執行 AWS CLI 命令時收到錯誤,請確保您使用的是最新版 AWS CLI

1.    執行 list-buckets AWS Command Line Interface (AWS CLI) 命令,以透過查詢擁有者 ID 取得帳戶的 Amazon S3 正式 ID。

aws s3api list-buckets --query "Owner.ID"

2.    執行 list-objects 命令,以取得擁有使用者無法存取物件之帳戶的 Amazon S3 標準 ID。將 DOC-EXAMPLE-BUCKET 取代為您的儲存貯體名稱,並將 exampleprefix 取代為您的字首值。

aws s3api list-objects --bucket DOC-EXAMPLE-BUCKET --prefix exampleprefix

秘訣:使用 list-objects 命令檢查數個物件。

3.    如果正式 ID 不相符,則您不擁有該物件。物件擁有者可透過執行 put-object-acl 命令,授予物件的完全控制權。將 DOC-EXAMPLE-BUCKET 取代為包含物件的儲存貯體名稱。將 exampleobject.jpg 取代為您的金鑰名稱。

aws s3api put-object-acl --bucket DOC-EXAMPLE-BUCKET --key exampleobject.jpg --acl bucket-owner-full-control

4.    物件擁有者將物件的 ACL 變更為 bucket-owner-full-control 後,儲存貯體擁有者即可存取物件。不過,僅 ACL 變更無法變更物件的擁有權。若要將物件擁有者變更為儲存貯體的帳戶,請從儲存貯體的帳戶執行 cp 命令,以將物件複製到本身。

將所有新物件複製到另一個帳戶中的儲存貯體

1.    設定儲存貯體政策,要求使用 bucket-owner-full-control ACL 上傳物件

2.    在 AWS 管理主控台中啟用及設定 S3 物件擁有權為儲存貯體擁有者偏好

當物件與 bucket-owner-full-control ACL 一起上傳時,物件的擁有者接著會自動更新為儲存貯體擁有者。

建立具有儲存貯體許可的 IAM 角色

針對持續的跨帳戶許可,請在您的帳戶中建立具有儲存貯體許可的 IAM 角色。然後,授予另一個 AWS 帳戶擔任 IAM 角色的許可。如需詳細資訊,請參閱教學:使用 IAM 角色將存取權委派至 AWS 帳戶

檢查儲存貯體政策或 IAM 使用者政策

檢閱儲存貯體政策或關聯的 IAM 使用者政策,以了解可能會拒絕存取的任何陳述式。驗證對儲存貯體的請求是否滿足儲存貯體政策或 IAM 政策中的任何條件。檢查政策中的任何不正確的拒絕陳述式、缺失動作或不正確的間隔。

拒絕陳述式條件

根據以下項目,檢查拒絕陳述式中是否有阻止存取的條件:

  • 多重要素驗證 (MFA)
  • 加密金鑰
  • 特定 IP 地址
  • 特定 VPC 或 VPC 端點
  • 特定 IAM 使用者或角色

注意:如果您需要 MFA 且使用者透過 AWS CLI 傳送請求,那麼請確定使用者將 AWS CLI 設定為使用 MFA

例如,在下列儲存貯體政策中,Statement1 允許公開存取從 DOC-EXAMPLE-BUCKET 下載物件 (s3:GetObject)。不過,Statement2 明確拒絕每個人從 DOC-EXAMPLE-BUCKET 存取下載物件,除非請求來自 VPC 端點 vpce-1a2b3c4d。在本範例中,拒絕陳述式的優先順序較高。這意味著,嘗試從 vpce-1a2b3c4d 外部下載物件的使用者將被拒絕存取。

{
  "Id": "Policy1234567890123",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Statement1",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
      "Principal": "*"
    },
    {
      "Sid": "Statement2",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Deny",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
      "Condition": {
        "StringNotEquals": {
          "aws:SourceVpce": "vpce-1a2b3c4d"
        }
      },
      "Principal": "*"
    }
  ]
}

儲存貯體政策或 IAM 政策

檢查儲存貯體政策或 IAM 政策是否允許使用者需要的 Amazon S3 動作。例如,下列儲存貯體政策不包括對 s3:PutObjectAcl 動作的許可。如果 IAM 使用者嘗試修改物件的存取控制清單 (ACL),則使用者會收到「存取遭拒」錯誤。

{
  "Id": "Policy1234567890123",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1234567890123",
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*",
      "Principal": {
        "AWS": [
          "arn:aws:iam::111122223333:user/Dave"
        ]
      }
    }
  ]
}

其他政策錯誤

檢查儲存貯體政策或 IAM 使用者政策中是否存在任何額外的空格或不正確的 ARN。

例如,如果 IAM 政策在 Amazon Resource Name (ARN) 中含有額外空格,如下所示:arn:aws:s3::: DOC-EXAMPLE-BUCKET/*。在這種情況下,ARN 被錯誤地評估為 arn:aws:s3:::%20DOC-EXAMPLE-BUCKET/,並給予 IAM 使用者存取被拒絕的錯誤。

確認 IAM 許可邊界允許存取 Amazon S3

檢閱嘗試存取儲存貯體的 IAM 身分上設定的 IAM 許可邊界。確認 IAM 許可邊界允許存取 Amazon S3。

檢查儲存貯體的 Amazon S3 區塊公開存取設定

如果您在允許的公開讀取請求上收到「存取遭拒」錯誤,請檢查儲存貯體的 Amazon S3 封鎖公用存取設定。

檢閱帳戶和儲存貯體層級的 S3 封鎖公開存取設定。這些設定可覆寫允許公開讀取存取的許可。Amazon S3 Block Public Access 可套用至個別的儲存貯體或 AWS 帳戶。

檢閱使用者憑證

檢閱使用者為存取 Amazon S3 設定的憑證。AWS 開發套件和 AWS CLI 必須設定為使用 IAM 使用者或角色的憑證,以存取您的儲存貯體。

針對 AWS CLI,執行 configure 命令來檢查設定的憑證︰

aws configure list

如果使用者透過 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體存取儲存貯體,那麼請確認執行個體使用的是正確的角色。連線至執行個體,然後執行 get-caller-identity 命令:

aws sts get-caller-identity

檢閱臨時安全憑證

如果使用者從使用 AWS Security Token Service (AWS STS) 授予的臨時安全憑證收到「存取遭拒」錯誤,則檢閱關聯的工作階段政策。當管理員使用 AssumeRole API 呼叫或 assume-role 命令建立臨時安全性憑證時,他們可以傳遞工作階段特定政策。

若要尋找與 Amazon S3 的「存取遭拒」錯誤關聯工作階段政策,請在 AWS CloudTrail 事件歷史記錄中尋找 AssumeRole 事件。確保在與存取 Amazon S3 的失敗請求相同的時間範圍內查找 AssumeRole 事件。然後,檢閱相關 CloudTrail 日誌中的 requestParameters 欄位,以獲取任意 policypolicyArns 參數。確認關聯的政策或政策 ARN 授予必要的 Amazon S3 許可。

例如,下列 CloudTrail 日誌片段顯示臨時憑證包含內嵌工作階段政策,則會授予 s3:GetObject 許可給 DOC-EXAMPLE-BUCKET

"requestParameters": {
        "roleArn": "arn:aws:iam::123412341234:role/S3AdminAccess",
        "roleSessionName": "s3rolesession",
        "policy": "{\n    \"Version\": \"2012-10-17\",\n    \"Statement\": [\n  {\n  \"Effect\": \"Allow\",\n           
         \"Action\": [\n   \"s3:GetObject\"\n ],\n    \"Resource\": [\n \"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*\"\n  ]\n   }  }\n    ]\n}\n"
    }

確認 Amazon VPC 端點政策包含存取 S3 儲存貯體和物件的正確許可

如果使用者透過 VPC 端點路由的 EC2 執行個體存取儲存貯體,請檢查 VPC 端點政策

例如,下列 VPC 端點政策僅允許存取 DOC-EXAMPLE-BUCKET。透過此 VPC 端點傳送請求的使用者無法存取任何其他儲存貯體。

{
  "Id": "Policy1234567890123",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1234567890123",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET",
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
      ],
      "Principal": "*"
    }
  ]
}

檢閱您的 Amazon S3 存取點的 IAM 政策

如果您使用 Amazon S3 存取點來管理您的儲存貯體存取權,請檢閱存取點的 IAM 政策

只有在基礎儲存貯體政策也允許相同存取時,在存取點政策中授予的許可才有效。確認儲存貯體政策和存取點政策授予正確的許可。

確認物件非缺失物件或不包含特殊字元

檢查儲存貯體中是否存在請求的物件。否則,請求將無法找到物件,並且 Amazon S3 會假設該物件不存在。如果您沒有適當的 s3:ListBucket 許可,則會收到「存取遭拒」錯誤 (而不是「404 找不到」錯誤)。

具有特殊字元 (如空格) 的物件需要特殊處理以擷取物件。

執行 head-object AWS CLI 命令來檢查儲存貯體中是否存在物件。將 DOC-EXAMPLE-BUCKET 取代為您要檢查的儲存貯體名稱。

aws s3api head-object --bucket DOC-EXAMPLE-BUCKET --key exampleobject.jpg

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

如果儲存貯體中沒有物件,則「存取遭拒」錯誤會遮罩「404 找不到」錯誤。解決與缺失物件相關的問題。

檢查 AWS KMS 加密組態

請注意下列有關 AWS KMS (SSE-KMS) 加密的事項:

  • 如果 IAM 使用者無法存取該使用者擁有完整許可的物件,則檢查該物件是否由 SSE-KMS 加密。您可以使用 Amazon S3 主控台來檢視物件的屬性,其中包括物件的伺服器端加密資訊。
  • 如果物件已加密 SSE-KMS,請確定 KMS 金鑰政策授予 IAM 使用者使用金鑰所需的最低許可。例如,如果 IAM 使用者僅使用金鑰來下載 S3 物件,則 IAM 使用者必須具有 kms:Decrypt 的許可。如需詳細資訊,請參閱允許存取 AWS 帳戶並啟用 IAM 政策
  • 如果 IAM 身分和金鑰位於同一個帳戶中,則應使用金鑰政策授予 kms:Decrypt 許可。金鑰政策必須參照與 IAM 政策相同的 IAM 身分。
  • 如果 IAM 使用者與 AWS KMS 金鑰授予不同的帳戶,則還必須在 IAM 政策上授予這些許可。例如,若要下載 SSE-KMS 加密物件,必須在金鑰政策和 IAM 政策中指定 kms:Decrypt 許可。如需 IAM 使用者與 KMS 金鑰之間跨帳戶存取的詳細資訊,請參閱允許其他帳戶中的使用者使用 KMS 金鑰

確認由使用者指定 request-payer 參數 (如果您使用的是申請者付款)

如果您的儲存貯體已啟動申請者付款,則其他帳戶的使用者在將請求傳送至您的儲存貯體時,必須指定 request-payer 參數。若要檢查是否啟用申請者付款,請使用 Amazon S3 主控台來檢視儲存貯體的屬性

下列範例 AWS CLI 命令包含使用申請者付款存取跨帳戶儲存貯體的正確參數:

aws s3 cp exampleobject.jpg s3://DOC-EXAMPLE-BUCKET/exampleobject.jpg --request-payer requester

檢查 AWS Organizations 服務控制政策

如果您正在使用 AWS Organizations,則請查閱服務控制政策,以確保允許存取 Amazon S3。服務控制政策會指定受影響帳户的最大許可。例如,以下政策明確拒絕存取 Amazon S3,並且導致出現「存取遭拒」錯誤:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "s3:*",
      "Resource": "*"
    }
  ]
}

如需 AWS Organizations 功能的詳細資訊,請參閱啟用組織中的所有功能


此文章是否有幫助?


您是否需要帳單或技術支援?