

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 KMS CMK 进行磁盘加密
<a name="disk-encryption-cmk"></a>

默认情况下，EMR Serverless 使用服务拥有的加密密钥对连接到工作人员的所有磁盘进行加密。您可以选择使用自己的 Amazon KMS 客户托管密钥对这些磁盘进行加密（CMKs）。这使您可以更好地控制加密密钥，包括建立和维护密钥策略以及审计密钥使用情况。

您可以在创建应用程序或提交单个作业时配置磁盘加密。在应用程序级别启用后，该应用程序上的所有作业都将继承加密设置。您还可以通过在提交作业时指定磁盘加密配置来覆盖应用程序的默认设置。

**注意**  
EMR 无服务器磁盘加密仅支持对称 KMS 密钥。不支持非对称 KMS 密钥。您必须使用中创建的对称加密 KMS 密钥。 Amazon KMS有关的更多信息 Amazon KMS，请参阅[什么是 Amazon KMS？](https://docs.amazonaws.cn/kms/latest/developerguide/overview.html)

## 使用加密上下文
<a name="disk-encryption-context"></a>

或者，EMR Serverless 使用加密上下文为加密操作提供额外的经过身份验证的数据。加密上下文是一组键值对，可以包含非机密的其他经过身份验证的数据。加密上下文以加密方式绑定到加密数据，因此解密数据需要相同的加密上下文。

在 EMR Serverless 中，您可以在配置磁盘加密时指定自定义加密上下文。此加密上下文包含在 Amazon CloudTrail 日志中，可帮助您识别和了解您的 KMS 操作。

**注意**  
请勿将敏感信息存储在加密环境中，因为这些信息以纯文本形式出现在日志中。 Amazon CloudTrail 

## 使用客户托管密钥配置磁盘加密
<a name="disk-encryption-configure"></a>

### CreateApplication
<a name="disk-encryption-create-app"></a>

要使用您自己的 KMS 密钥加密磁盘，请在创建 EMR Serverless 应用程序时添加`diskEncryptionConfiguration`参数。

```
aws emr-serverless create-application \
  --type TYPE \
  --name APPLICATION_ID \
  --release-label RELEASE_LABEL \
  --region AWS_REGION \
  --disk-encryption-configuration '{
        "encryptionKeyArn": "key-arn",
        "encryptionContext": {
            "key": "value"
        }
  }'
```

### UpdateApplication
<a name="disk-encryption-update-app"></a>

要更新 KMS 密钥 ARN and/or 加密上下文，请在更新应用程序时使用新值指定`diskEncryptionConfiguration`参数。

```
aws emr-serverless update-application \
  --name APPLICATION_ID \
  --region AWS_REGION \
  --disk-encryption-configuration '{
        "encryptionKeyArn": "key-arn",
        "encryptionContext": {
            "key": "value"
        }
  }'
```

**注意**  
要取消设置应用程序上已配置的磁盘加密，请在更新应用程序`diskEncryptionConfiguration`时传递一个空值。

### StartJobRun
<a name="disk-encryption-start-job"></a>

要使用您自己的 KMS 密钥加密磁盘，请在提交作业运行时使用`diskEncryptionConfiguration`配置。

```
--configuration-overrides '{
        "diskEncryptionConfiguration": {
            "encryptionKeyArn": "key-arn",
            "encryptionContext": {
                "key": "value"
            }
        }
    }'
```

### Public Livy 端点
<a name="disk-encryption-livy"></a>

要在通过公共 Livy 端点创建 Spark 会话时使用自己的 KMS 密钥加密磁盘，请在会话的`conf`对象中指定加密配置。

```
data = {
    "kind": "pyspark", 
    "heartbeatTimeoutInSecond": 60, 
    "conf": { 
        "emr-serverless.session.executionRoleArn": "role_arn",
        "spark.emr-serverless.disk.encryptionKeyArn": "key-arn",
        "spark.emr-serverless.disk.encryptionContext": "key1:value1,key2:value2"  # Optional
    }
}

# Send request to create a session with the Livy API endpoint
request = AWSRequest(method='POST', url=endpoint + "/sessions", data=json.dumps(data), headers=headers)
```

## 磁盘加密所需的权限
<a name="disk-encryption-permissions"></a>

### EMR 无服务器的加密密钥权限
<a name="disk-encryption-key-permissions"></a>

使用自己的加密密钥加密磁盘时，必须为`emr-serverless.amazonaws.com`主体配置以下 KMS 密钥权限：
+ `kms:GenerateDataKey`: 生成用于加密磁盘卷的数据密钥
+ `kms:Decrypt`: 在访问加密磁盘内容时解密数据密钥

```
{
    "Effect": "Allow",
    "Principal":{
        "Service": "emr-serverless.amazonaws.com"
    },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey"
    ],
    "Resource": "*",
    "Condition": {
        "StringLike": {
            "aws:SourceArn": "arn:aws:emr-serverless:region:aws-account-id:/applications/application-id"
        },
        "StringEquals": {
            "kms:EncryptionContext:applicationId": "application-id",
            "aws:SourceAccount": "aws-account-id"
        }
    }
}
```

作为安全最佳实践，建议在 KMS 密钥政策中添加 `aws:SourceArn` 条件键。IAM 全局条件键 `aws:SourceArn` 可确保 EMR Serverless 仅将 KMS 密钥用于应用程序 ARN。此外，包含`aws:SourceAccount`条件密钥可以将您的 KMS 密钥的使用限制为来自条件中指定的 Amazon 账户 ID 的请求，从而提供另一层安全保护。

作业运行时角色必须在其 IAM 策略中具有以下权限：

```
{
    "Sid": "Enable GDK and Decrypt",
    "Version": "2012-10-17",		 	 	 
    "Statement": {
        "Effect": "Allow",
        "Action": [
            "kms:GenerateDataKey",
            "kms:Decrypt"
        ],
        "Resource": "key-arn"
    }
}
```

### 所需的用户权限
<a name="disk-encryption-user-permissions"></a>

提交任务的用户必须具有使用密钥的权限。您可以在 KMS 密钥政策或 IAM 策略中为用户、组或角色指定权限。如果提交作业的用户没有 KMS 密钥权限，EMR Serverless 会拒绝提交作业运行。

#### 示例密钥政策
<a name="disk-encryption-example-key-policy"></a>

以下密钥策略提供对`kms:DescribeKey`、`kms:GenerateDataKey`和的权限`kms:Decrypt`：
+ `kms:DescribeKey`：在使用客户管理的 KMS 密钥之前验证其是否已启用和 SYMMETRIC。

```
{
    "Sid": "Enable DescribeKey",
    "Effect": "Allow",
    "Principal":{
        "AWS": "arn:aws:iam::111122223333:user/user-name"
    },
    "Action": [
        "kms:DescribeKey"
    ],
    "Resource": "*"
},
{
    "Sid": "Enable GDK and Decrypt",
    "Effect": "Allow",
    "Principal":{
        "AWS": "arn:aws:iam::111122223333:user/user-name"
    },
    "Action": [
        "kms:GenerateDataKey",
        "kms:Decrypt"
    ],
    "Resource": "*",
    "Condition": {
        "StringEquals": {
            "kms:ViaService": "emr-serverless.region.amazonaws.com",
            "kms:EncryptionContext:key": "value"
        }
    }
}
```

作为安全最佳实践，建议在 KMS 密钥政策中添加 `kms:viaService` 条件键。它将 KMS 密钥的使用限制为仅限来自 emr-serverless 的验证请求。

#### 示例 IAM 策略
<a name="disk-encryption-example-iam-policy"></a>

以下 IAM 策略提供对`kms:DescribeKey`、`kms:GenerateDataKey`和的权限`kms:Decrypt`。

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": {
        "Effect": "Allow",
        "Action": [
            "kms:DescribeKey",
            "kms:GenerateDataKey",
            "kms:Decrypt"
        ],
        "Resource": "key-arn"
    }
}
```

## 监控密钥使用情况
<a name="disk-encryption-monitoring"></a>

您可以通过以下方式监控客户托管密钥在 EMR Serverless 中的使用情况。 Amazon CloudTrail Amazon CloudTrail 将所有 API 调用捕获 Amazon KMS 为事件，包括来自 EMR 无服务器控制台、EMR Serverless API、CLI 或 SDK 的调用。 Amazon Amazon 

捕获的信息包括您指定的加密上下文，这可以帮助您识别和审计使用您的 KMS 密钥的特定 EMR Serverless 资源。例如，您可能会在中看到与以下内容类似的事件 Amazon CloudTrail。有关使用的更多信息 Amazon CloudTrail，请参阅《[Amazon CloudTrail 用户指南》](https://docs.amazonaws.cn/awscloudtrail/latest/userguide/)。

### GenerateDataKey
<a name="disk-encryption-monitoring-gdk"></a>

EMR Serverless 创建加密磁盘卷时的 GenerateDataKey 操作示例事件

```
{
    "eventVersion": "1.11",
    "userIdentity": {
        "type": "AWSService",
        "principalId": "user",
        "invokedBy": "AWS Internal"
    },
    "eventTime": "2025-07-28T21:43:51Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "GenerateDataKey",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "ipAddress",
    "userAgent": "userAgent",
    "requestParameters": {
        "encryptionContext": {
            "applicationId": "test"
        },
        "keyId": "arn:aws:kms:region:accountId:key/ffffffff-fffff-aaaaa-eeee-sample",
        "keySpec": "AES_256"
    },
    "responseElements": null,
    "additionalEventData": {
        "keyMaterialId": "145c963debe558dfb01848d2a4539da940f3478852f86cfe2f52d5df796a5a02"
    },
    "requestID": "cc9d1c5e-97c4-4a4f-ae7a-e576sample",
    "eventID": "0b0fef09-f28d-4da8-a5a1-17b74sample",
    "readOnly": true,
    "resources": [
        {
            "accountId": "account",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:region:accountId:key/ffffffff-fffff-aaaaa-eeee-sample"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "accountId",
    "eventCategory": "Management"
}
```

### Decrypt
<a name="disk-encryption-monitoring-decrypt"></a>

EMR Serverless 访问加密数据时解密操作的示例事件。

```
{
    "eventVersion": "1.11",
    "userIdentity": {
        "type": "AWSService",
        "principalId": "user",
        "invokedBy": "AWS Internal"
    },
    "eventTime": "2025-07-28T21:43:51Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "Decrypt",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "ipAddress",
    "userAgent": "userAgent",
    "requestParameters": {
        "encryptionContext": {
            "applicationId": "test"
        },
        "keyId": "arn:aws:kms:region:accountId:key/ffffffff-fffff-aaaaa-eeee-sample",
        "keySpec": "AES_256"
    },
    "responseElements": null,
    "additionalEventData": {
        "keyMaterialId": "145c963debe558dfb01848d2a4539da940f3478852f86cfe2f52d5df796a5a02"
    },
    "requestID": "cc9d1c5e-97c4-4a4f-ae7a-e576sample",
    "eventID": "0b0fef09-f28d-4da8-a5a1-17b74sample",
    "readOnly": true,
    "resources": [
        {
            "accountId": "account",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:region:accountId:key/ffffffff-fffff-aaaaa-eeee-sample"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "accountId",
    "eventCategory": "Management"
}
```

## 了解更多
<a name="disk-encryption-learn-more"></a>

以下资源提供有关静态数据加密的更多信息。
+ 有关 Amazon KMS 基本概念的更多信息，请参阅《[Amazon KMS 开发人员指南》](https://docs.amazonaws.cn/kms/latest/developerguide/)。
+ 有关安全最佳实践的更多信息 Amazon KMS，请参阅《[Amazon KMS 开发人员指南》](https://docs.amazonaws.cn/kms/latest/developerguide/best-practices.html)。