如何解決 AWS Glue 中 AWS KMS 密文存取遭拒的 400 錯誤?

3 分的閱讀內容
0

我在執行 AWS Glue 爬蟲程式或 AWS Glue ETL 任務時收到 400 錯誤。

簡短描述

使用 AWS Glue 時,當您嘗試存取 Amazon Simple Service Solution (Amazon S3) 儲存貯體等 AWS 資源時,可能會收到此錯誤:

"The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access." (密文是指不存在、此區域不存在或者您不允許存取的客戶主金鑰。)

當您使用 AWS Glue 任務或爬蟲程式存取任何採用 AWS Key Management Service (KMS) key 加密的 AWS 服務時,您會收到此錯誤。錯誤最有可能會因下列其中一項原因而出現:

  • 嘗試存取加密金鑰的主體沒有所需的 AWS KMS 許可
  • AWS KMS key 不存在或在特定 AWS 區域中不存在

解決方案

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

檢查您的 AWS Glue 角色政策是否具有所需的許可

首先,檢查您使用的 AWS Glue 角色政策是否具有存取資源 AWS KMS key 所需的許可。

例如,假設您有一個稱為 AWSGlue-MyGlueCustomRole 的 AWS Glue 角色。此角色正在存取採用 AWS KMS key arn:aws:kms:us-east-1:XXXXXXXX9645:key/64d3e826-1a87-4cbc-95b8-fb386730a07 加密的 S3 儲存貯體。除了其他許可外,AWS Glue 角色政策還必須具有下列內容:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:Encrypt",
                "kms:GenerateDataKey"
            ],
            "Resource": "arn:aws:kms:us-east-1:XXXXXXXX9645:key/64d3e826-1a87-4cbc-95b8-fb386730a07"
        }
    ]
}

檢查您的 AWS KMS key 政策是否允許 AWS Glue 角色

AWS KMS key 政策必須允許 AWS Glue 角色作為其允許的實體的一部分。

使用上一個範例,AWS KMS key arn:aws:kms:us-east-1:XXXXXXXX9645:key/64d3e826-1a87-4cbc-95b8-fb386730a07 政策必須已連接下列許可:

{
    "Sid": "Allow use of the key",
    "Effect": "Allow",
    "Principal": {
        "AWS": [
            "arn:aws:iam::XXXXXXXX9645:role/AWSGlue-MyGlueCustomRole "
        ]
    },
    "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
    ],
    "Resource": "*"
}

確定 AWS KMS key 與您的 AWS Glue 任務位於同一區域

若要檢查 AWS KMS key 所在的區域,請依照下列步驟執行:

1.    開啟 AWS KMS 主控台

2.    選擇您遇到錯誤的區域。

3.    在導覽窗格中,選擇 AWS managed keys (AWS 受管金鑰) 或 Customer managed keys (客戶管理的金鑰)。然後,搜尋您正在使用的 AWS KMS key。您也可以使用 AWS CLI 搜尋 AWS KMS key。如果該金鑰在該區域中不存在,則以下命令會傳回 NotFoundException 錯誤:

aws kms describe-key --key-id <Key-ID> --region <region-name>

注意:請務必將此範例中的 <Key-ID><region-name> 替換為使用您正在使用的區域的金鑰 ID 和名稱。

4.    檢查 AWS CloudTrail API 呼叫 kms:Decryptkms:Encrypt,看看您是否發現任何故障。或者,您可以使用 kms.amazonaws.com 作為事件來源,以便檢視所有事件日誌。

跨帳戶範例

如果 AWS Glue 角色和 AWS KMS key 位於不同的帳戶,請使用客戶管理的金鑰,而非 AWS 受管金鑰。只有在原則來自相同帳戶時,才能使用 AWS KMS key。您無法修改 AWS 受管金鑰的金鑰政策。當您在第二個帳戶中存取 AWS KMS key 時,請確定來源與目的地都存在許可。

假設您想要允許帳戶 Y 中的 AWS Identity and Access Management (IAM) 使用者 X 使用帳戶 Z 中的 AWS KMS key。在此情況下,IAM 政策必須具有所需的 AWS KMS 動作。AWS KMS key 政策必須允許相同的動作。如需詳細資訊,請參閱允許其他帳戶中的使用者使用 AWS KMS key

以下是從跨帳戶存取 AWS KMS key 時會發生的最常見問題。

如果錯誤訊息是由服務控制政策 (SCP) 引起的,請檢查您帳戶上所有套用的 SCP。這可協助您識別會限制 kms:Decrypt 動作的 SCP。更新影響的 SCP,然後再嘗試您的動作。如需詳細資訊,請參閱列出連接到根、OU 或帳戶的政策更新 SCP。請參閱此錯誤的以下範例:

User: arn:aws:iam::XXXXXXXX9645:user/KMSDemO is not authorized to perform: kms:Decrypt on resource: arn:aws:kms:us-east-1:XXXXXXXX9645:key/64d3e826-1a87-4cbc-95b8-fb386730a07 with an explicit deny in a service control policy"

如果 IAM 實體連接了許可界限,則界限會設定實體擁有的最大許可。檢查 IAM 主體上的許可界限,以確定允許所需的 AWS KMS 解密動作。然後,再嘗試此動作。請參閱此錯誤的以下範例:

User: arn:aws:iam::XXXXXXXX9645:user/KMSDemO is not authorized to perform: kms:Decrypt on resource: arn:aws:kms:us-east-1:XXXXXXXX9645:key/64d3e826-1a87-4cbc-95b8-fb386730a07 because no permissions boundary allows the kms:Decrypt action"

如果您使用 VPC 端點連接到 AWS KMS,則請檢查套用的 VPC 端點政策。確定政策中允許的 kms:Decrypt 動作。請參閱此錯誤的以下範例:

User: arn:aws:iam::XXXXXXXX9645:user/KMSDemO is not authorized to perform: kms:Decrypt on resource: arn:aws:kms:us-east-1:XXXXXXXX9645:key/64d3e826-1a87-4cbc-95b8-fb386730a07 because no VPC endpoint policy allows the kms:Decrypt action"

相關資訊

在 AWS Glue 中設定加密

AWS KMS 中的金鑰政策

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