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

上次更新日期: 2021 年 1 月 8 日

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

簡短描述

要對來自 Amazon S3 的「存取遭拒」錯誤進行疑難排解,請檢查以下內容:

  • 儲存貯體和物件擁有權
  • 儲存貯體政策或 AWS Identity and Access Management (IAM) 使用者政策
  • IAM 許可邊界
  • Amazon S3 封鎖公開存取設定
  • 存取 Amazon S3 的憑證
  • 臨時安全憑證
  • Amazon Virtual Private Cloud (Amazon VPC) 端點政策
  • Amazon S3 Access Point 政策
  • 缺少物件或物件含有特殊字元
  • AWS Key Management Service (AWS KMS) 加密
  • 在儲存貯體上啟用申請者付款
  • AWS Organizations 服務控制政策

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

解決方案

儲存貯體和物件擁有權

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

1.    執行 list-buckets AWS Command Line Interface (AWS CLI) 命令,以獲取您帳戶的 Amazon S3 正式 ID:

aws s3api list-buckets --query Owner.ID

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

2.    執行 list-objects 命令,以獲取擁有使用者無法存取的物件的帳戶的 Amazon S3 正式 ID:

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

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

3.    如果正式 ID 不相符,則您 (儲存貯體擁有者) 無法擁有該物件。物件擁有者可透過執行 put-object-acl 命令授權您完整控制物件:

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 命令,以複製物件本身。

若要將所有新物件複製到另一帳戶的儲存貯體中,請設定儲存貯體政策,即要求使用 bucket-owner-full-control ACL 上傳物件。然後,啟用 S3 物件擁有權。當使用 bucket-owner-full-control ACL 上傳物件時,這樣做會自動將物件的擁有者變更為儲存貯體擁有者。

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

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

檢閱 儲存貯體政策或關聯的IAM 使用者政策,了解任何可能錯誤拒絕存取的陳述式。檢查政策中的任何不正確的拒絕陳述式、缺失動作或不正確的間隔:

1.    檢查拒絕語句,了解基於多重要素驗證 (MFA)、加密金鑰、特定 IP 地址或特定 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": "*"
    }
  ]
}

2.    檢查儲存貯體政策或 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"
        ]
      }
    }
  ]
}

3.    檢查儲存貯體政策或 IAM 使用者政策中是否存在任何額外的空格。例如,下列 IAM 政策在 Amazon 資源名稱 (ARN) 中含有額外空格 arn:aws:s3::: DOC-EXAMPLE-BUCKET/*。由於存在空格,ARN 被誤評估為 arn:aws:s3:::%20DOC-EXAMPLE-BUCKET/*。這意味著,IAM 使用者對正確的物件沒有許可。

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

IAM 許可邊界

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

Amazon S3 封鎖公開存取設定

如果您的使用者收到公開讀取請求的「存取遭拒」錯誤,而該請求本應是允許的,則請檢查儲存貯體的 Amazon S3 封鎖公開存取設定。這些設定可覆寫允許公開讀取存取的許可。Amazon S3 Block Public Access 可套用至個別的儲存貯體或 AWS 帳戶。

存取 Amazon S3 的憑證

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

對於 AWS CLI,執行設定 命令,以檢查設定的憑證:

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 欄位,以獲取任意 policy policyArns 參數。確認相關政策或政策 ARN 已授予必要的 Amazon S3 許可。

例如,CloudTrail 日誌的以下程式碼片段說明,臨時憑證包括可向 DOC-EXAMPLE-BUCKET 授予 s3:GetObject 許可的內嵌工作階段政策:

"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 端點政策

如果使用者使用透過 VPC端點路由的 EC2 執行個體存取您的儲存貯體,則請檢查 VPC 端點政策。確保 VPC 端點政策包括存取 S3 儲存貯體和物件的正確許可。

例如,以下 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 Access Point 政策

如果您使用 Amazon S3 Access Point 管理儲存貯體的存取,則請檢閱Access Point 的 IAM 政策。確認政策授予了正確的許可。

缺少物件或物件含有特殊字元

檢查儲存貯體中是否存在請求的物件。另請注意,具有特殊字元 (例如空格) 的物件需要特殊處理才能擷取物件。否則,請求將無法找到物件,並且 Amazon S3 會假設該物件不存在。因此,如果您沒有適當的 s3:ListBucket 許可,您將收到「存取遭拒」錯誤 (而非「404 找不到」錯誤)。

執行 head-object AWS CLI 命令,以檢查儲存貯體中是否存取物件:

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

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

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

AWS KMS 加密

如果 IAM 使用者無法存取該使用者擁有完整許可的物件,則檢查該物件是否由 AWS KMS 加密。您可使用 Amazon S3 主控台來檢視物件的屬性,其中包括物件的加密資訊。

如果物件是 KMS 加密,則請確保 KMS 金鑰政策授予 IAM 使用者以下操作的許可:

"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
]

如果 IAM 使用者與 AWS KMS 金鑰授予不同的帳戶,則還必須在 IAM 政策上授予這些許可。

在儲存貯體上啟用申請者付款

如果您的儲存貯體啟用了 Requester Pays (申請者付款),則其他帳戶的使用者在傳送請求至儲存貯體時,必須指明 request-payer 參數。否則,這些使用者會收到「存取遭拒」錯誤。若要檢查是否已啟用 Requester Pays (申請者付款),您可以使用 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 功能的詳細資訊,請參閱在組織中啟用所有功能


此文章是否有幫助?


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