

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

# Amazon Managed Service for Apache Flink 中的密钥管理
<a name="key-management-flink"></a>

在 Amazon MSF 中，您可以选择使用 [AWS 托管式密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html) 或自己的[客户自主管理型密钥（CMK）](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-mgn-key)来加密数据。 AWS Key Management Service (AWS KMS) 中的 CMK 是您自己创建、拥有和管理的加密密钥。

**Topics**
+ [Amazon MSF 中的透明加密](#transparent-encryption-flink)
+ [Amazon MSF 中的客户自主管理型密钥](#cmk-flink)
+ [在 Amazon MSF 中使用客户自主管理型密钥](use-cmk-flink.md)
+ [使用管理 CMK AWS 管理控制台](manage-cmk-console.md)
+ [使用 API 管理 CMK](manage-cmk-api.md)

## Amazon MSF 中的透明加密
<a name="transparent-encryption-flink"></a>

默认情况下，Amazon MSF 使用 AWS 拥有的密钥 (AOK) 在临时存储（运行应用程序存储）和耐用（耐用应用程序存储）存储空间中加密您的数据。这意味着，默认情况下，所有受 Flink [检查点](how-fault.md)或[快照](how-snapshots.md)约束的数据都将加密。AOK 是 Amazon MSF 中的默认加密方法，无需额外设置。为加密传输中数据，Amazon MSF 默认使用 TLS 和 HTTP\+SSL，而不需要额外的设置或配置。

## Amazon MSF 中的客户自主管理型密钥
<a name="cmk-flink"></a>

在 Amazon MSF 中，CMK 是一项功能，您可以使用在 AWS KMS上创建、拥有和管理的密钥来加密应用程序的数据。

**Topics**
+ [什么是使用 CMK 加密？](#what-is-encrypted-cmk)
+ [哪些方面未使用 CMK 加密？](#what-is-not-encrypted-cmk)
+ [支持的 KMS 密钥类型](#supported-kms-key-types)
+ [KMS 密钥权限](#kms-key-permissions)
+ [KMS 加密上下文和限制](#kms-encryption-context-constraints)
+ [密钥轮换策略](#kms-key-rotation-policy)
+ [Least-privileged 关键政策声明](#kms-least-privilege-policy-examples)
+ [AWS CloudTrail 日志条目示例](#kms-cloudtrail-log-entries)

### 什么是使用 CMK 加密？
<a name="what-is-encrypted-cmk"></a>

在 Amazon MSF 应用程序中，受到 Flink 检查点或快照约束的数据将使用您为该应用程序定义的 CMK 进行加密。因此，您的 CMK 将加密存储在运行中应用程序存储或持久应用程序存储中的数据。[以下各节](manage-cmk-api.md)描述为您的 Amazon MSF 应用程序设置 CMK 的过程。

**密钥轮换策略**  
Amazon MSF 不管理您的 CMK 的密钥轮换策略。您负责实施自己的密钥轮换。这是因为您创建和维护 CMK。有关如何在 Amazon MSF 中将密钥轮换策略与 CMK 结合使用的信息，请参阅 [密钥轮换策略](#kms-key-rotation-policy)。

### 哪些方面未使用 CMK 加密？
<a name="what-is-not-encrypted-cmk"></a>

**源和接收器**  
数据源和接收器的加密未由 Amazon MSF 管理。该加密由源或接收器配置或应用程序连接器配置进行管理。

**加密的追溯性应用**  
Amazon MSF 中的 CMK 不支持以追溯方式将 CMK 应用于现有历史快照。

**日志加密**  
目前，Amazon MSF 不支持对应用程序代码 jar 生成的日志使用 KMS CMK 进行日志加密。您需要确保日志不包含需要 CMK 加密的数据。

**传输中数据加密**  
您不能使用 CMK 加密传输中的数据。默认情况下，Amazon MSF 使用 TLS 或 HTTP 和 SSL 加密传输中的所有数据。

### 支持的 KMS 密钥类型
<a name="supported-kms-key-types"></a>

Amazon MSF 中的 CMK 支持[对称密钥](https://docs.aws.amazon.com/kms/latest/developerguide/symm-asymm-choose-key-spec.html#symmetric-cmks)。

### KMS 密钥权限
<a name="kms-key-permissions"></a>

Amazon MSF 中的 CMK 需要获得执行以下 KMS 操作的权限。这些是验证访问权限、创建 CMK 加密的运行应用程序存储以及将 CMK 加密的应用程序状态存储在持久应用程序存储中所必需的权限。
+ 

**[kms: DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)**  
授予将 KMS 密钥别名解析为密钥 ARN 的权限。
+ 

**[kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)**  
授予访问持久应用程序状态和预置运行中应用程序存储的权限。
+ 

**[kms: GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)**  
授予存储持久应用程序状态的权限。
+ 

**[kms: GenerateDataKeyWithoutPlaintext](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html)**  
授予预置运行中应用程序存储的权限。
+ 

**[kms: CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html)**  
授予访问运行中应用程序存储的权限。

### KMS 加密上下文和限制
<a name="kms-encryption-context-constraints"></a>

Amazon MSF 中的 CMK 在访问密钥以读取或写入加密数据（即）时提供加密上下文，即 `kms:EncryptionContext:aws:kinesisanalytics:arn`。除了加密上下文外，还会在读取或写入持久应用程序存储时提供源上下文 a [ws[: SourceArn SourceAccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount)](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 和 aws:。

在创建配置加密运行应用程序存储空间的授权时，Amazon MSF CMK 会创建具有约束类型的授权，[EncryptionContextSubset](https://docs.aws.amazon.com/kms/latest/developerguide/create-grant-overview.html#grant-constraints)确保只允许[解密](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)操作通过。`"kms:GrantOperations": "Decrypt"`

### 密钥轮换策略
<a name="kms-key-rotation-policy"></a>

Amazon MSF 不管理您的 CMK 的密钥轮换策略。您负责自己的密钥轮换，因为由您创建和维护 CMK。

在 KMS 中，您可以使用自动或手动密钥轮换来为自己的 CMK 创建新的加密材料。有关如何轮换密钥的信息，请参阅 *AWS Key Management Service 开发人员指南*中的[轮换 AWS KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html)。

在 Amazon MSF 中轮换 CMK 的密钥时，必须确保操作员（API 调用方）拥有对旧密钥和新密钥的权限。

**注意**  
应用程序可以从快照启动，该快照在配置为使用 CMK 后以 AOK 加密。应用程序也可以从使用较早 CMK 加密的快照启动。要从快照启动应用程序，操作员（API 调用方）必须同时拥有旧密钥和新密钥的权限。

在 Amazon MSF 中，我们建议您使用 CMK 加密停止和重新启动应用程序。这样可以确保新的轮换主密钥应用于运行中应用程序存储和持久应用程序存储中的所有数据。如果您不停止并重新启动应用程序，则新的密钥材料将仅应用于持久应用程序存储。运行中应用程序存储将继续使用之前的轮换密钥材料进行加密。

如果您要更改用于 CMK 的 AWS KMS key ARN，则应在 [UpdateApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_UpdateApplication.html)Amazon MSF 中使用。这将确保您的 Flink 应用程序作为应用 CMK 更改的 `UpdateApplication` 的一部分重新启动。

**注意**  
当您提供别名或别名 ARN 时，Amazon MSF 会将该别名解析为密钥 ARN，并将密钥 ARN 存储为应用程序的已配置密钥。

### Least-privileged 关键政策声明
<a name="kms-least-privilege-policy-examples"></a>

有关密钥策略语句的信息，请参阅 [创建 KMS 密钥策略](manage-cmk-api.md#create-cmk-kms-key-policy) 和 [应用程序生命周期操作员（API 调用方）权限](manage-cmk-api.md#create-cmk-kms-api-caller-permissions)。

### AWS CloudTrail 日志条目示例
<a name="kms-cloudtrail-log-entries"></a>

当 Amazon MSF 在中使用 CMK 时 AWS KMS， AWS CloudTrail 会自动记录所有 AWS KMS API 调用和相关详情。这些日志包含诸如 AWS 服务 发出请求、KMS 密钥 ARN、执行的 API 操作以及不包括加密数据的时间戳之类的信息。这些日志通过显示哪些服务访问您的密钥以及何时访问，为合规性、安全监控和故障排除提供必要的审计跟踪。

**示例 1：使用亚马逊 MSF 中的代入角色 AWS KMS 解密 API 调用**  
以下 CloudTrail 日志显示 Amazon MSF 对 CMK 执行测试 [kms: Decryp](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) t 操作。Amazon MSF 在使用 [CreateApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_CreateApplication.html)API 时使用**Operator**角色发出此请求。以下日志包含基本细节，例如目标 KMS 密钥 ARN、关联的 Amazon MSF 应用程序 ({{MyCmkApplication}}) 和操作的时间戳。

```
{
    "eventVersion": "1.11",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "REDACTED",
        "arn": "arn:aws:sts::{{123456789012}}:assumed-role/Operator/{{CmkTestingSession}}",
        "accountId": "{{123456789012}}",
        "accessKeyId": "REDACTED",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "REDACTED",
                "arn": "arn:aws:iam::{{123456789012}}:role/Operator",
                "accountId": "{{123456789012}}",
                "userName": "Operator"
            },
            "attributes": {
                "creationDate": "2025-08-07T13:29:28Z",
                "mfaAuthenticated": "false"
            }
        },
        "invokedBy": "kinesisanalytics.amazonaws.com"
    },
    "eventTime": "2025-08-07T13:45:45Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "Decrypt",
    "awsRegion": "{{us-east-1}}",
    "sourceIPAddress": "kinesisanalytics.amazonaws.com",
    "userAgent": "kinesisanalytics.amazonaws.com",
    "errorCode": "DryRunOperationException",
    "errorMessage": "The request would have succeeded, but the DryRun option is set.",
    "requestParameters": {
        "encryptionContext": {
            "aws:kinesisanalytics:arn": "arn:aws:kinesisanalytics:{{us-east-1}}:{{123456789012}}:application/{{MyCmkApplication}}"
        },
        "keyId": "arn:aws:kms:{{us-east-1}}:{{123456789012}}:key/{{1234abcd-12ab-34cd-56ef-1234567890ab}}",
        "encryptionAlgorithm": "SYMMETRIC_DEFAULT",
        "dryRun": true
    },
    "responseElements": null,
    "additionalEventData": {
        "keyMaterialId": "REDACTED"
    },
    "requestID": "56764d19-1eb1-48f1-8044-594aa7dd05c4",
    "eventID": "1371b402-f1dc-4c47-8f3a-1004e4803c5a",
    "readOnly": true,
    "resources": [
        {
            "accountId": "{{123456789012}}",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:{{us-east-1}}:{{123456789012}}:key/{{1234abcd-12ab-34cd-56ef-1234567890ab}}"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "{{123456789012}}",
    "eventCategory": "Management"
}
```

**示例 2：使用直接服务身份验证在 Amazon MSF 中 AWS KMS 解密 API 调用**  
以下 CloudTrail 日志显示 Amazon MSF 对 CMK 执行测试 [kms: Decryp](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) t 操作。Amazon MSF 通过直接的 AWS 服务到服务身份验证而不是扮演角色来发出此请求。以下日志包含基本细节，例如目标 KMS 密钥 ARN、关联的 Amazon MSF 应用程序 ({{MyCmkApplication}}) 以及该操作的共享事件 ID。

```
{
    "eventVersion": "1.11",
    "userIdentity": {
        "type": "AWSService",
        "invokedBy": "kinesisanalytics.amazonaws.com"
    },
    "eventTime": "2025-08-07T13:45:45Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "Decrypt",
    "awsRegion": "{{us-east-1}}",
    "sourceIPAddress": "kinesisanalytics.amazonaws.com",
    "userAgent": "kinesisanalytics.amazonaws.com",
    "errorCode": "DryRunOperationException",
    "errorMessage": "The request would have succeeded, but the DryRun option is set.",
    "requestParameters": {
        "encryptionAlgorithm": "SYMMETRIC_DEFAULT",
        "keyId": "arn:aws:kms:{{us-east-1}}:{{123456789012}}:key/{{1234abcd-12ab-34cd-56ef-1234567890ab}}",
        "encryptionContext": {
            "aws:kinesisanalytics:arn": "arn:aws:kinesisanalytics:{{us-east-1}}:{{123456789012}}:application/{{MyCmkApplication}}"
        },
        "dryRun": true
    },
    "responseElements": null,
    "additionalEventData": {
        "keyMaterialId": "REDACTED"
    },
    "requestID": "5fe45ada-7519-4608-be2f-5a9b8ddd62b2",
    "eventID": "6206b08f-ce04-3011-9ec2-55951d357b2c",
    "readOnly": true,
    "resources": [
        {
            "accountId": "{{123456789012}}",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:{{us-east-1}}:{{123456789012}}:key/{{1234abcd-12ab-34cd-56ef-1234567890ab}}"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "Application-account-ID",
    "sharedEventID": "acbe4a39-ced9-4f53-9f3c-21ef7e89dc37",
    "eventCategory": "Management"
}
```