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

4 分的閱讀內容
1

我的使用者正在嘗試存取 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-object 命令來檢查多個物件。

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.    啟用 S3 物件擁有權並將其設定為 AWS 管理主控台中的偏好的儲存貯體擁有者

在物件與 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)。但是,除非要求來自 VPC 端點 vpce-1a2b3c4d,否則 Statement2 明確拒絕所有從 DOC-EXAMPLE-BUCKET 下載物件的存取權。在這種情況下,拒絕陳述式會優先處理。這表示嘗試從 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 封鎖公開存取可套用至個別儲存貯體或 AWS 帳戶。

檢閱使用者憑證

檢閱您的使用者已設定為存取 Amazon S3 的憑證。AWS SDK 和 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 事件。然後,檢閱任何 policypolicyArns 參數相關 CloudTrail 日誌中的 requestParameters 欄位。確認關聯政策或政策 ARN 授予必要的 Amazon S3 許可。

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

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

確認 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 參數。若要檢查「申請者付款」是否已啟用,請使用 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 功能的詳細資訊,請參閱啟用組織中的所有功能

相關資訊

對 Amazon S3 進行疑難排解

取得 Amazon S3 的 AWS Support 請求 ID

AWS 官方
AWS 官方已更新 2 年前