Amazon Managed Service for Apache Flink(Amazon MSF)之前称为 Amazon Kinesis Data Analytics for Apache Flink。
Amazon Managed Service for Apache Flink 中的密钥管理
在 Amazon MSF 中,您可以选择使用 Amazon 托管式密钥 或自己的客户自主管理型密钥(CMK)来加密数据。Amazon Key Management Service(Amazon KMS)中的 CMK 是您自己创建、拥有和管理的加密密钥。
本页内容
Amazon MSF 中的透明加密
默认情况下,Amazon MSF 使用 Amazon 拥有的密钥(AOK)在临时(正在运行的应用程序存储)和耐久(持久应用程序存储)存储中加密您的数据。这意味着,默认情况下,所有受 Flink 检查点或快照约束的数据都将加密。AOK 是 Amazon MSF 中的默认加密方法,无需额外设置。为加密传输中数据,Amazon MSF 默认使用 TLS 和 HTTP+SSL,而不需要额外的设置或配置。
Amazon MSF 中的客户自主管理型密钥
在 Amazon MSF 中,CMK 是一项功能,您可以使用在 Amazon KMS 上创建、拥有和管理的密钥来加密应用程序的数据。
本节内容
什么是使用 CMK 加密?
在 Amazon MSF 应用程序中,受到 Flink 检查点或快照约束的数据将使用您为该应用程序定义的 CMK 进行加密。因此,您的 CMK 将加密存储在运行中应用程序存储或持久应用程序存储中的数据。以下各节描述为您的 Amazon MSF 应用程序设置 CMK 的过程。
密钥轮换策略
Amazon MSF 不管理您的 CMK 的密钥轮换策略。您负责实施自己的密钥轮换。这是因为您创建和维护 CMK。有关如何在 Amazon MSF 中将密钥轮换策略与 CMK 结合使用的信息,请参阅 密钥轮换策略。
哪些方面未使用 CMK 加密?
源和接收器
数据源和接收器的加密未由 Amazon MSF 管理。该加密由源或接收器配置或应用程序连接器配置进行管理。
加密的追溯性应用
Amazon MSF 中的 CMK 不支持以追溯方式将 CMK 应用于现有历史快照。
日志加密
目前,Amazon MSF 不支持对应用程序代码 jar 生成的日志使用 KMS CMK 进行日志加密。您需要确保日志不包含需要 CMK 加密的数据。
传输中数据加密
您不能使用 CMK 加密传输中的数据。默认情况下,Amazon MSF 使用 TLS 或 HTTP 和 SSL 加密传输中的所有数据。
支持的 KMS 密钥类型
Amazon MSF 中的 CMK 支持对称密钥。
KMS 密钥权限
Amazon MSF 中的 CMK 需要获得执行以下 KMS 操作的权限。这些是验证访问权限、创建 CMK 加密的运行应用程序存储以及将 CMK 加密的应用程序状态存储在持久应用程序存储中所必需的权限。
-
kms:DescribeKey
授予将 KMS 密钥别名解析为密钥 ARN 的权限。
-
kms:Decrypt
授予访问持久应用程序状态和预置运行中应用程序存储的权限。
-
kms:GenerateDataKey
授予存储持久应用程序状态的权限。
-
kms:GenerateDataKeyWithoutPlaintext
授予预置运行中应用程序存储的权限。
-
kms:CreateGrant
授予访问运行中应用程序存储的权限。
KMS 加密上下文和限制
Amazon MSF 中的 CMK 在访问密钥以读取或写入加密数据(即)时提供加密上下文,即 kms:EncryptionContext:aws:kinesisanalytics:arn。除了加密上下文外,还会在读取或写入持久应用程序存储时提供源上下文 aws:SourceArn 和 aws:SourceAccount。
在创建预置加密运行中应用程序存储的授权时,Amazon MSF CMK 会创建约束类型为 EncryptionContextSubset 的授权,确保通过 "kms:GrantOperations": "Decrypt" 只允许解密操作。
密钥轮换策略
Amazon MSF 不管理您的 CMK 的密钥轮换策略。您负责自己的密钥轮换,因为由您创建和维护 CMK。
在 KMS 中,您可以使用自动或手动密钥轮换来为自己的 CMK 创建新的加密材料。有关如何轮换密钥的信息,请参阅 Amazon Key Management Service 开发人员指南中的轮换 Amazon KMS keys。
在 Amazon MSF 中轮换 CMK 的密钥时,必须确保操作员(API 调用方)拥有对旧密钥和新密钥的权限。
注意
应用程序可以从快照启动,该快照在配置为使用 CMK 后以 AOK 加密。应用程序也可以从使用较早 CMK 加密的快照启动。要从快照启动应用程序,操作员(API 调用方)必须同时拥有旧密钥和新密钥的权限。
在 Amazon MSF 中,我们建议您使用 CMK 加密停止和重新启动应用程序。这样可以确保新的轮换主密钥应用于运行中应用程序存储和持久应用程序存储中的所有数据。如果您不停止并重新启动应用程序,则新的密钥材料将仅应用于持久应用程序存储。运行中应用程序存储将继续使用之前的轮换密钥材料进行加密。
如果您要更改用于 CMK 的 Amazon KMS key ARN,则应在 Amazon MSF 中使用更新应用程序。这将确保您的 Flink 应用程序作为应用 CMK 更改的 UpdateApplication 的一部分重新启动。
注意
当您提供别名或别名 ARN 时,Amazon MSF 会将该别名解析为密钥 ARN,并将密钥 ARN 存储为应用程序的已配置密钥。
最低权限密钥策略语句
有关密钥策略语句的信息,请参阅 创建 KMS 密钥策略 和 应用程序生命周期操作员(API 调用方)权限 。
示例 Amazon CloudTrail 日志条目
当 Amazon MSF 在 Amazon KMS 中使用 CMK 时,Amazon CloudTrail 会自动记录所有 Amazon KMS API 调用和相关详细信息。这些日志包含诸如 Amazon Web Services 服务发 出请求、KMS 密钥 ARN、执行的 API 操作以及不包括加密数据的时间戳之类的信息。这些日志通过显示哪些服务访问您的密钥以及何时访问,为合规性、安全监控和故障排除提供必要的审计跟踪。
示例 1:Amazon KMS 使用 Amazon MSF 中代入的角色解密 API 调用
以下 CloudTrail 日志显示 Amazon MSF 对 CMK 执行测试 kms:Decrypt 操作。Amazon MSF 在使用 CreateApplication 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 KMS 使用直接服务身份验证在 Amazon MSF 中解密 API 调用
以下 CloudTrail 日志显示 Amazon MSF 对 CMK 执行测试 kms:Decrypt 操作。Amazon MSF 通过直接的 Amazon 服务到服务身份验证(而不是带入角色)来发出此请求。以下日志包含基本详细信息,例如目标 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" }