為什麼跨帳戶使用者在嘗試存取由自訂 AWS KMS 金鑰加密的 S3 物件時會遇到「拒絕存取」錯誤?

2 分的閱讀內容
0

我的 Amazon Simple Storage Service (Amazon S3) 儲存貯體使用自訂 AWS Key Management Service (KMS) 金鑰加密。當來自其他 AWS 帳戶的使用者嘗試存取儲存貯體中的物件時,他們遇到「拒絕存取」錯誤。我該如何解決這個問題?

簡短描述

若要將帳戶 A 中 AWS KMS 加密儲存貯體的存取權授予帳戶 B 中的使用者,您必須具備下列權限:

  • 帳戶 A 中的儲存貯體政策必須授予對帳戶 B 的存取權。
  • 帳戶 A 中的 AWS KMS 金鑰政策必須向帳戶 B 中的使用者授予存取權。
  • 帳戶 B 中的 AWS Identity and Access Management (IAM) 政策必須向使用者授予對儲存貯體以及帳戶 A 中 AWS KMS 金鑰的存取權。

若要疑難排解「拒絕存取」錯誤,請確認這些權限設定正確。

**警告:**AWS 受管 AWS KMS 金鑰政策無法修改,因為它們是唯讀的。不過,您可以隨時檢視 AWS 受管 KMS 金鑰政策和客戶受管 KMS 金鑰政策。由於無法更新 AWS 受管 KMS 金鑰政策,因此也無法針對這些金鑰政策授予跨帳戶權限。此外,其他 AWS 帳戶無法存取使用 AWS 受管 KMS 金鑰加密的物件。對於客戶受管 KMS 金鑰政策,您只能從建立該政策的 AWS 帳戶變更金鑰政策

如果指定自己的 AWS KMS 金鑰 (客戶受管 KMS 金鑰),則必須使用完全合格的 AWS KMS 金鑰 ARN 進行儲存貯體加密設定。使用 AWS KMS 金鑰別名時,AWS KMS 只會在擁有帳戶 (帳戶 A) 的儲存貯體內解析金鑰。

使用:

"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"

不使用:

arn:aws:kms:us-west-2:111122223333:alias/<alias-name>

解決方法

帳戶 A 中的儲存貯體政策必須向帳戶 B 中的使用者授予存取權

在帳戶 A 中,檢閱儲存貯體政策並確認存在允許從帳戶 B 的帳戶 ID 存取的陳述式。

例如,此儲存貯體政策允許 s3:GetObject 存取帳戶 ID 111122223333

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

帳戶 A 中的 AWS KMS 金鑰政策必須向帳戶 B 中的使用者授予存取權

AWS KMS 金鑰政策必須向帳戶 B 中的使用者授予執行 kms:Decrypt 動作的權限。例如,若要僅向一個 IAM 使用者或角色授予金鑰存取權,金鑰政策陳述式如下所示:

{
  "Sid": "Allow use of the key",
  "Effect": "Allow",
  "Principal": {
    "AWS": [
      "arn:aws:iam::111122223333:role/role_name"
    ]
  },
  "Action": [
    "kms:Decrypt"
  ],
  "Resource": "*"
}

在帳戶 A 中,使用 AWS 管理主控台政策檢視檢閱金鑰政策。在金鑰政策中,找到 "Sid": "Allow use of the key"。然後,確認帳戶 B 中的使用者在該陳述式中列為主體。

如果您沒有看到陳述式 "Sid": "Allow use of the key",則切換至使用主控台預設檢視來檢視金鑰政策。然後,將帳戶 B 的帳戶 ID 新增為可存取金鑰的外部帳戶。

帳戶 B 中的 IAM 使用者政策必須向使用者授予對儲存貯體和帳戶 A 中 AWS KMS 金鑰的存取權

從帳戶 B 執行下列步驟:

1.    開啟 IAM 主控台

2.    開啟與帳戶 B 中使用者相關聯的 IAM 使用者或角色。

3.    檢閱套用至 IAM 使用者或角色的權限政策清單。

4.    確認有套用的政策可授予對儲存貯體和 AWS KMS 金鑰的存取權。

**注意:**如果帳戶 B 中的 IAM 使用者或角色已經具有管理員存取權,則您不需要授予對金鑰的存取權。

下列範例政策向帳戶 B 中的 IAM 使用者授予對物件和 AWS KMS 金鑰 (用於解密儲存貯體中的物件) 的存取權:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ExampleStmt1",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
    },
    {
      "Sid": "ExampleStmt2",
      "Action": [
        "kms:Decrypt"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:kms:us-west-2:444455556666:key/1234abcd-12ab-34cd-56ef-1234567890ab"
    }
  ]
}

注意:

  • 帳戶 A 中的儲存貯體政策必須授予對帳戶 B 的存取權。
  • 帳戶 A 中的 AWS KMS 金鑰必須與帳戶 A 中的儲存貯體位於相同區域。
  • 帳戶 A 中的 AWS KMS 金鑰政策必須向帳戶 B 中的使用者授予存取權。
  • 帳戶 B 中的 IAM 政策必須向使用者授予對儲存貯體和帳戶 A 中 AWS KMS 金鑰的存取權。

如需如何新增或更正 IAM 使用者權限的詳細資訊,請參閱變更 IAM 使用者的權限


相關資訊

AWS Policy Generator

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