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

4 分的閱讀內容
1

我的使用者正在嘗試存取 Amazon Simple Storage Service (Amazon S3) 儲存貯體中的物件,但 Amazon S3 傳回 403「存取遭拒」錯誤。

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,則請參閱對 AWS CLI 進行錯誤疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

使用 AWS Systems Manager Automation 文件

若要協助您判斷從指定公用 S3 儲存貯體讀取物件時的問題,請使用 AWS Systems Manager 上的 AWSSupport-TroubleshootS3PublicRead 自動化文件。

檢查您的儲存貯體和物件所有權設定

對於來自 GetObjectHeadObject 請求的 AccessDenied錯誤,請檢查物件和儲存貯體是否由相同擁有者所有。此外,請檢查儲存貯體擁有者具有讀取或完全控制存取控制清單 (ACL) 權限

**注意:**建立新儲存貯體時,預設會關閉 ACL。最佳做法是使用 AWS Identity and Access Management (IAM) 政策 (而非 ACL) 來控制對 S3 資源的存取。

確認擁有物件的帳戶

擁有儲存物件之儲存貯體的 AWS 帳戶預設也會擁有物件。如果其他帳戶可以將物件上傳至您的儲存貯體,請確認您的使用者無法存取之物件的權限。

若要檢查儲存貯體和物件是否具有相同的擁有者,請完成下列步驟:

  1. 執行 list-buckets AWS CLI 命令,以取得帳戶的 Amazon S3 正式 ID:

    aws s3api list-buckets --query "Owner.ID"
  2. 執行 list-objects 命令以取得帳戶 (擁有使用者無法存取之物件) 的 Amazon S3 正式 ID:

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

    **注意:**將 DOC-EXAMPLE-BUCKET 取代為您的儲存貯體名稱,並將 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

    **注意:**將 DOC-EXAMPLE-BUCKET 取代為包含物件的儲存貯體名稱,並將 exampleobject.jpg 取代為金鑰名稱。

  4. 在物件擁有者將物件的 ACL 變更為 bucket-owner-full-control 後,儲存貯體擁有者就可以存取物件。若同時要將物件擁有者變更為儲存貯體的帳戶,請從儲存貯體的帳戶執行 cp 命令,將物件複製到自身上。

建立具有儲存貯體權限的 IAM 角色

如果 IAM 角色和儲存貯體擁有者屬於相同的帳戶,則 IAM 角色或儲存貯體必須具有權限。您不需要針對 IAM 角色和儲存貯體的權限。

若要在不同帳戶之間新增權限,請在您的帳戶中建立具有儲存貯體權限的 IAM 角色。然後,授予另一個帳戶擔任該 IAM 角色的權限。如需詳細資訊,請參閱 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 動作的權限:

{  
  "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 使用者嘗試修改物件的 ACL,則使用者會收到**「存取遭拒」**錯誤。

其他政策錯誤

檢查儲存貯體政策或 IAM 使用者政策中是否有額外的空格、ARN 錯誤或其他錯字錯誤。

如果 IAM 政策在 ARN 中有額外的空格,則 ARN 會遭到錯誤評估,並且使用者會收到**「存取遭拒」**錯誤。例如,在 ARN 中具有額外空格的 IAM 策略:arn:aws:s3::: DOC-EXAMPLE-BUCKET/* 會被評估為 arn:aws:s3:::%20DOC-EXAMPLE-BUCKET/

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

確認在 IAM 實體上設定的 IAM 許可界線允許存取 Amazon S3。

檢查儲存貯體的 Amazon S3 封鎖公開存取設定

如果您在允許的公開讀取請求中收到**「存取遭拒」**錯誤,請檢查該帳戶和儲存貯體上儲存貯體的 Amazon S3 封鎖公開存取設定。 這些設定可以覆寫允許公開讀取存取權的權限。

檢閱使用者憑證

檢閱您的使用者設定為存取 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 命令建立臨時安全性憑證時,管理員可以傳遞工作階段專屬的政策。

若要尋找相關聯的工作階段政策,請在與失敗存取要求相同時間範圍內的 AWS CloudTrail 事件歷史記錄中尋找 AssumeRole 事件。然後,檢閱 CloudTrail 日誌中的 requestParameters 欄位,以尋找 policypolicyArns 參數。確認相關聯政策或政策 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 資源的正確權限

如果您的使用者使用透過 Amazon Virtual Private Cloud (Amazon 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 命令,檢查是物件否位於儲存貯體內:

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

**注意:**將 DOC-EXAMPLE-BUCKET 取代為您的儲存貯體名稱。

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

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

檢查 AWS KMS 加密組態

如果 IAM 使用者擁有對物件的完整權限,但仍無法存取物件,請檢查該物件是否具有 AWS Key Management Service (KMS) 加密 (SSE-KMS)。您可以使用 Amazon S3 主控台來檢視物件的屬性,並檢查物件的 SSE-KMS 資訊。

如果物件是使用客戶自管金鑰加密,則 KMS 金鑰政策必須允許您執行 kms:GenerateDataKeykms:Decrypt 動作。如需詳細資訊,請參閱允許存取 AWS 帳戶並啟用 IAM 政策

如果 IAM 使用者屬於與 AWS KMS key 不同的帳戶,請修改 IAM 政策以授與 Kms:Decrypt 權限。例如,若要下載 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 SCP

如果您使用 AWS Organizations,請檢查服務控制政策 (SCP) 以確保允許存取 Amazon S3。SCP 會指定受影響帳戶的權限上限。例如,下列 SCP 明確拒絕存取 Amazon S3,並造成**「存取遭拒」**錯誤:

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

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

相關資訊

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

取得 AWS Support 的 Amazon S3 請求 ID

AWS 官方
AWS 官方已更新 4 個月前