使用 API 管理 CMK - Managed Service for Apache Flink
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Amazon Managed Service for Apache Flink(Amazon MSF)之前称为 Amazon Kinesis Data Analytics for Apache Flink。

使用 API 管理 CMK

本主题介绍如何使用 Amazon MSF API 创建和更新 KMS CMK。要按照本主题中描述的步骤进行操作,您必须拥有管理 KMS 密钥和 Amazon MSF 应用程序的权限。本主题中的过程使用宽松的密钥策略,该策略仅用于演示和测试目的。我们不建议对生产工作负载使用这种宽松的密钥策略。在生产工作负载的现实场景中,角色、权限和工作流程是隔离的。

创建和分配 KMS 密钥

在开始之前,请创建 KMS 密钥。有关创建 KMS 密钥的信息,请参阅 Amazon Key Management Service 开发人员指南中的创建 KMS 密钥

创建 KMS 密钥策略

要在 Amazon MSF 中使用 CMK,您必须在密钥策略中添加以下服务主体:kinesisanalytics.amazonaws.cominfrastructure.kinesisanalytics.amazonaws.com。Amazon MSF 使用这些服务主体进行验证和资源访问。如果您没有包含这些服务主体,Amazon MSF 会拒绝请求。

以下 KMS 密钥策略允许 Amazon MSF 针对应用程序 MyCmkApplication 使用 CMK。该策略向 Operator 角色和 Amazon MSF 服务主体、kinesisanalytics.amazonaws.com 以及 infrastructure.kinesisanalytics.amazonaws.com 授予执行以下操作所需的权限:

  • 描述 CMK

  • 加密应用程序数据

  • 解密应用程序数据

  • 为密钥创建授权

下面的示例使用 IAM 角色。您可以使用以下示例作为模板为 KMS 密钥创建密钥策略,但请务必执行以下操作:

  • arn:aws:iam::123456789012:role/Operator 替换为 Operator 角色。在创建密钥策略之前,必须先创建 Operator 角色或用户。未能执行此操作将导致您的请求失败。

  • arn:aws:kinesisanalytics:us-east-1:123456789012:application/MyCmkApplication 替换为您应用程序的 ARN。

  • kinesisanalytics.us-east-1.amazonaws.com 替换为相应区域的服务值。

  • 123456789012 替换为 CMK 的账户 idKey 策略。

  • 添加其他策略声明,以允许密钥管理员管理 KMS 密钥。未能执行此操作将导致无法管理密钥。

以下密钥策略声明包含大量内容,因为它们旨在明确并显示每个操作所需的条件。

{ "Version":"2012-10-17", "Id": "MyMsfCmkApplicationKeyPolicy", "Statement": [ { "Sid": "AllowOperatorToDescribeKey", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:role/Operator" }, "Action": "kms:DescribeKey", "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "kinesisanalytics.us-east-1.amazonaws.com" } } }, { "Sid": "AllowOperatorToConfigureAppToUseKeyForApplicationState", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:role/Operator" }, "Action": [ "kms:Decrypt", "kms:GenerateDataKey", "kms:GenerateDataKeyWithoutPlaintext" ], "Resource": "*", "Condition": { "StringEquals": { "kms:EncryptionContext:aws:kinesisanalytics:arn": "arn:aws:kinesisanalytics:us-east-1:123456789012:application/MyCmkApplication", "kms:ViaService": "kinesisanalytics.us-east-1.amazonaws.com" } } }, { "Sid": "AllowOperatorToConfigureAppToCreateGrantForRunningState", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:role/Operator" }, "Action": "kms:CreateGrant", "Resource": "*", "Condition": { "StringEquals": { "kms:EncryptionContext:aws:kinesisanalytics:arn": "arn:aws:kinesisanalytics:us-east-1:123456789012:application/MyCmkApplication", "kms:ViaService": "kinesisanalytics.us-east-1.amazonaws.com", "kms:GrantConstraintType": "EncryptionContextSubset" }, "ForAllValues:StringEquals": { "kms:GrantOperations": "Decrypt" } } }, { "Sid": "AllowMSFServiceToDescribeKey", "Effect": "Allow", "Principal": { "Service": [ "kinesisanalytics.amazonaws.com", "infrastructure.kinesisanalytics.amazonaws.com" ] }, "Action": "kms:DescribeKey", "Resource": "*", "Condition": { "StringEquals": { "aws:SourceArn": "arn:aws:kinesisanalytics:us-east-1:123456789012:application/MyCmkApplication", "aws:SourceAccount": "123456789012" } } }, { "Sid": "AllowMSFServiceToGenerateDataKeyForDurableState", "Effect": "Allow", "Principal": { "Service": "kinesisanalytics.amazonaws.com" }, "Action": [ "kms:GenerateDataKey" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceArn": "arn:aws:kinesisanalytics:us-east-1:123456789012:application/MyCmkApplication", "kms:EncryptionContext:aws:kinesisanalytics:arn": "arn:aws:kinesisanalytics:us-east-1:123456789012:application/MyCmkApplication", "aws:SourceAccount": "123456789012" } } }, { "Sid": "AllowMSFServiceToDecryptForDurableState", "Effect": "Allow", "Principal": { "Service": "kinesisanalytics.amazonaws.com" }, "Action": [ "kms:Decrypt" ], "Resource": "*", "Condition": { "StringEquals": { "kms:EncryptionContext:aws:kinesisanalytics:arn": "arn:aws:kinesisanalytics:us-east-1:123456789012:application/MyCmkApplication" } } }, { "Sid": "AllowMSFServiceToUseKeyForRunningState", "Effect": "Allow", "Principal": { "Service": [ "infrastructure.kinesisanalytics.amazonaws.com" ] }, "Action": [ "kms:Decrypt", "kms:GenerateDataKeyWithoutPlaintext" ], "Resource": "*", "Condition": { "StringEquals": { "kms:EncryptionContext:aws:kinesisanalytics:arn": "arn:aws:kinesisanalytics:us-east-1:123456789012:application/MyCmkApplication" } } }, { "Sid": "AllowMSFServiceToCreateGrantForRunningState", "Effect": "Allow", "Principal": { "Service": [ "infrastructure.kinesisanalytics.amazonaws.com" ] }, "Action": "kms:CreateGrant", "Resource": "*", "Condition": { "StringEquals": { "kms:EncryptionContext:aws:kinesisanalytics:arn": "arn:aws:kinesisanalytics:us-east-1:123456789012:application/MyCmkApplication", "kms:GrantConstraintType": "EncryptionContextSubset" }, "ForAllValues:StringEquals": { "kms:GrantOperations": "Decrypt" } } } ] }

应用程序生命周期操作员(API 调用方)权限

以下 IAM 策略可确保应用程序生命周期操作员拥有向应用程序 MyCmkApplication 分配 KMS 密钥所需的权限。

JSON
{ "Version":"2012-10-17", "Statement": [ { "Sid": "AllowMSFAPICalls", "Effect": "Allow", "Action": "kinesisanalytics:*", "Resource": "*" }, { "Sid": "AllowPassingServiceExecutionRole", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": "arn:aws:iam::123456789012:role/MyCmkApplicationRole" }, { "Sid": "AllowDescribeKey", "Effect": "Allow", "Action": [ "kms:DescribeKey" ], "Resource": "arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab", "Condition": { "StringEquals": { "kms:ViaService": "kinesisanalytics.us-east-1.amazonaws.com" } } }, { "Sid": "AllowMyCmkApplicationKeyOperationsForDurableState", "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab", "Condition": { "StringEquals": { "kms:ViaService": "kinesisanalytics.us-east-1.amazonaws.com", "kms:EncryptionContext:aws:kinesisanalytics:arn": "arn:aws:kinesisanalytics:us-east-1:123456789012:application/MyCmkApplication" } } }, { "Sid": "AllowMyCmkApplicationKeyOperationsForRunningState", "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKeyWithoutPlaintext" ], "Resource": "arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab", "Condition": { "StringEquals": { "kms:ViaService": "kinesisanalytics.us-east-1.amazonaws.com", "kms:EncryptionContext:aws:kinesisanalytics:arn": "arn:aws:kinesisanalytics:us-east-1:123456789012:application/MyCmkApplication" } } }, { "Sid": "AllowMyCmkApplicationCreateGrantForRunningState", "Effect": "Allow", "Action": "kms:CreateGrant", "Resource": "arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab", "Condition": { "ForAllValues:StringEquals": { "kms:GrantOperations": "Decrypt" }, "StringEquals": { "kms:ViaService": "kinesisanalytics.us-east-1.amazonaws.com", "kms:EncryptionContext:aws:kinesisanalytics:arn": "arn:aws:kinesisanalytics:us-east-1:123456789012:application/MyCmkApplication", "kms:GrantConstraintType": "EncryptionContextSubset" } } } ] }

更新现有应用程序以使用 CMK

在 Amazon MSF 中,您可以将 CMK 策略应用于使用 Amazon 拥有的密钥(AOK)的现有应用程序。

默认情况下,Amazon MSF 使用 AOK 在临时(正在运行的应用程序存储)和耐久(持久应用程序存储)存储中加密您的数据。这意味着,默认情况下,所有受 Flink 检查点快照约束的数据都将使用 AOK 进行加密。使用 CMK 替换 AOK 时,新的检查点和快照将使用 CMK 进行加密。但是,历史快照仍将使用 AOK 进行加密。

更新现有应用程序以使用 CMK
  1. 使用以下配置创建 JSON 文件。

    确保将 CurrentApplicationVersionId 的值替换为应用程序的当前版本号。可以使用 DescribeApplication 获取应用程序的当前版本号。

    在此 JSON 配置中,请记住将示例值替换为实际值。

    { "ApplicationName": "MyCmkApplication", "CurrentApplicationVersionId": 1, "ApplicationConfigurationUpdate": { "ApplicationEncryptionConfigurationUpdate": { "KeyTypeUpdate": "CUSTOMER_MANAGED_KEY", "KeyIdUpdate": "arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab" } } }
  2. 保存此文件。例如,使用名称 enable-cmk.json 保存该文件。

  3. 运行 update-application Amazon CLI 命令,如以下示例所示。在此命令中,提供您在前面步骤中创建的 JSON 配置文件作为文件参数。

    aws kinesisanalyticsv2 update-application \ --cli-input-json file://enable-cmk.json

接受上述配置,使其只能在满足以下条件时更新使用 CMK 的应用程序:

  • API 调用方具有允许访问密钥的策略语句。

  • 密钥策略具有允许 API 调用方访问密钥的策略声明。

  • 密钥策略具有允许 Amazon MSF 服务主体(例如 kinesisanalytics.amazonaws.com)访问密钥的策略声明。

从 CMK 恢复为 Amazon 拥有的密钥

从 CMK 恢复为 AOK
  1. 使用以下配置创建 JSON 文件。

    在此 JSON 配置中,请记住将示例值替换为实际值。

    { "ApplicationName": "MyCmkApplication", "CurrentApplicationVersionId": 1, "ApplicationConfigurationUpdate": { "ApplicationEncryptionConfigurationUpdate": { "KeyTypeUpdate": "AWS_OWNED_KEY" } } }
  2. 保存此文件。例如,使用名称 disable-cmk.json 保存该文件。

  3. 运行 update-application Amazon CLI 命令,如以下示例所示。在此命令中,提供您在前面步骤中创建的 JSON 配置文件作为文件参数。

    aws kinesisanalyticsv2 update-application \ --cli-input-json file://disable-cmk.json