為什麼即使我的儲存貯體政策授予另一個 AWS 帳戶完整存取權,但該帳戶的 IAM 使用者仍會收到「存取遭拒」錯誤?

3 分的閱讀內容
0

我的 Amazon Simple Storage Service (Amazon S3) 儲存貯體政策授予另一個 AWS 帳戶完整存取權。但是,當該帳戶的 AWS Identity and Access Management (IAM) 使用者嘗試存取我的儲存貯體時,他們會收到「存取遭拒」錯誤。

簡短說明

如果您的儲存貯體政策已授予其他帳戶存取權,則跨帳戶使用者可能會因下列原因收到「存取遭拒」錯誤:

  • 該使用者的 IAM 政策未授予儲存貯體的存取權。
  • 物件已透過 AWS Key Management Service (KMS) 加密,而使用者無權存取 AWS KMS key。
  • 儲存貯體政策或 IAM 政策中的拒絕陳述式阻擋使用者的存取。
  • Amazon Virtual Private Cloud (Amazon VPC) 端點政策阻擋對儲存貯體的存取。
  • AWS Organizations 服務控制政策阻擋對儲存貯體的存取。
  • 該物件不屬於擁有儲存貯體的 AWS 帳戶。
  • 您已為儲存貯體啟用 Requester Pays (請求者付費)。
  • 您已傳遞阻擋存取儲存貯體的工作階段政策

解決方法

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請確認您使用的是最新版本

使用者的 IAM 政策未授予儲存貯體的存取權

對於跨帳户存取權,請確保您在帳戶 A 中的 IAM 政策和帳戶 B 中的儲存貯體政策中授予儲存貯體存取權。

請依照下列步驟檢查帳戶 A 中的使用者 IAM 政策:

  1. 開啟 IAM 主控台

  2. 在主控台中,開啟無法存取儲存貯體的 IAM 使用者或角色。

3.    在 IAM 使用者或角色的 Permissions (許可) 索引標籤中,展開每項政策以查看其 JSON 政策文件。

  1. 在 JSON 政策文件中,尋找具有該儲存貯體名稱的政策。然後,確認這些政策是否允許在儲存貯體上執行正確的 S3 動作。

  2. 如果 IAM 使用者或角色未授予儲存貯體的存取權,請新增授予正確許可的政策。例如,下列 IAM 政策授予從 DOC-EXAMPLE-BUCKET下載物件 (s3:GetObject) 的使用者存取權:

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

物件已透過 AWS KMS 加密,而使用者無權存取 AWS KMS key

如果 IAM 政策 (帳戶 A) 和儲存貯體政策 (帳戶 B) 都授予跨帳戶存取權,請使用 AWS KMS 檢查儲存貯體是否 default encryption (預設加密)。或者,檢查物件屬性是否有 AWS KMS 加密。如果物件由 AWS KMS key 加密,則使用者還必須擁有使用金鑰的許可。

若要授予 IAM 使用者在使用 KMS 金鑰加密時下載和上傳至儲存貯體的權限,請依照下列步驟執行:

  1. 編輯 KMS 金鑰政策,新增類似於下列內容的陳述式:

注意:輸入 IAM 使用者的 Amazon Resource Name (ARN) 作為主體

{
  "Sid": "ExampleStmt",
  "Action": [
    "kms:Decrypt",
    "kms:GenerateDataKey"
  ],
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:user/Jane"
  },
  "Resource": "*"
}
  1. 如果 KMS 金鑰屬於與 IAM 使用者相同的帳戶,則不需要更新金鑰政策。如果 KMS 金鑰屬於與 IAM 使用者不同的帳戶,則您還必須更新 IAM 使用者的許可。新增類似下列內容的 IAM 政策陳述句:

注意:輸入 KMS 金鑰的 ARN 作為資源

{
  "Sid": "KMSAccess",
  "Action": [
    "kms:Decrypt",
    "kms:GenerateDataKey"
  ],
  "Effect": "Allow",
  "Resource": "arn:aws:kms:example-region-1:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd"
}

儲存貯體政策或 IAM 政策中的拒絕陳述式阻擋使用者的存取

檢查儲存貯體政策和使用者的 IAM 政策,找出任何明確拒絕使用者存取儲存貯體的陳述式。

請依照下列步驟檢查儲存貯體政策:

  1. 開啟 Amazon S3 控制台

  2. 從儲存貯體清單中,開啟包含您要檢查的儲存貯體政策的儲存貯體。

  3. 選擇 Permissions (許可) 索引標籤。

  4. 選擇 Bucket policy(儲存貯體政策)。

  5. 尋找包含 **"Effect": "Deny"**的陳述式。

  6. 修改儲存貯體政策以編輯或移除任何拒絕使用者存取儲存貯體的 **"Effect": "Deny"**陳述式。

請依照下列步驟檢查使用者的 IAM 政策:

  1. 開啟 IAM 主控台

  2. 在主控台中,開啟無法存取儲存貯體的 IAM 使用者或角色。

3.    在 IAM 使用者或角色的 Permissions (許可) 索引標籤中,展開每項政策以查看 JSON 政策文件。

  1. 在 JSON 政策文件中,使用包含 **"Effect": "Deny"**的陳述式。

  2. 修改使用者的 IAM 許可政策以編輯或移除 **"Effect": "Deny"**陳述式,這些陳述式不正確地拒絕使用者存取儲存貯體。

VPC 端點策略阻擋對儲存貯體的存取

如果使用者使用路由至 VPC 端點的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體存取儲存貯體,請檢查 VPC 端點政策。確認 VPC 端點政策是否包含存取 S3 儲存貯體的正確許可。

例如,以下 VPC 端點政策允許存取 DOC-EXAMPLE-BUCKET

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

**警告:**元素 "Principal": "*" 授予每個人使用 VPC 端點存取儲存貯體的權限。請務必根據您的使用案例,限制 Principal (主體) 值的範圍。

AWS Organizations 服務控制政策阻擋對儲存貯體的存取

如果使用者的帳戶已啟用 AWS Organizations,請檢查服務控制政策,以確保允許存取 Amazon S3。例如,下列政策明確拒絕存取 Amazon S3,造成「存取遭拒」錯誤:

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

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

物件不屬於擁有儲存貯體的 AWS 帳戶

預設情況下,S3 物件由上傳該物件的 AWS 帳戶擁有。即使儲存貯體由另一個帳戶擁有,也是如此。當物件由不同帳戶擁有時,儲存貯體的許可不會自動套用至該物件。

若要解決物件所有權的「存取遭拒」錯誤,請嘗試下列解決方法:

$ aws s3api put-object-acl --bucket examplebucket --key keyname --acl bucket-owner-full-control

**注意:**若要存取物件,物件擁有者必須明確授予儲存貯體擁有者存取權。因此,請使用物件擁有者帳戶來執行這些命令。

您已為儲存貯體啟用請求者付費

如果您已為儲存貯體啟用 Requester Pays (請求者付費),則其他帳戶的使用者在向您的儲存貯體傳送請求時,必須指定 request-payer 參數。否則,這些使用者會收到「存取遭拒」錯誤。

若要解決此錯誤,請執行下列操作:

  • 對於 DELETE、GET、HEAD、POST 和 PUT 請求,請在標頭中包含 x-amz-request-payer : requester
  • 對於已簽署網址,請在請求中包含 x-amz-request-payer=requester
  • 對於 AWS CLI 命令,請包含 --request-payer 參數。範例:
$ aws s3 cp exampleobject.jpg s3://DOC-EXAMPLE-BUCKET/exampleobject.jpg --request-payer requester

您已傳遞阻擋存取儲存貯體的工作階段政策

工作階段原則是內嵌政策,您可以在角色擔任期間在工作階段內快速建立和傳遞。您可以傳遞工作階段政策,以進一步限制角色工作階段的許可範圍。工作階段政策是進階政策,您可以在以程式設計方式為角色或聯合身分使用者建立暫存工作階段時作為參數傳遞。工作階段的有效許可是角色的身分型政策與工作階段政策的交集。因此,請確認您傳遞的工作階段政策不會阻擋 S3 儲存貯體的存取。

相關資訊

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

為什麼跨帳戶使用者在嘗試存取由自訂 AWS KMS key 加密的儲存貯體時,會遇到「存取遭拒」錯誤?

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