View a markdown version of this page

使用管理 CMK APIs - Managed Service for Apache Flink

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

使用管理 CMK APIs

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

创建和分配 KMS 密钥

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

创建 KMS 密钥策略

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

以下 KMS 密钥策略允许 Amazon MSF 使用应用程序的 CMK。MyCmkApplication该策略向 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用您的账户 IDKey 策略替换为 CMK。

  • 添加其他策略声明,以允许密钥管理员管理 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 策略可确保应用程序生命周期操作员拥有向应用程序分配 KMS 密钥所需的权限MyCmkApplication

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 策略应用于使用 AWS 拥有的密钥 () AOKs 的现有应用程序。

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

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

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

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

    { "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. 运行更新应用程序 AWS CLI 命令,如以下示例所示。在此命令中,提供您在前面步骤中创建的 JSON 配置文件作为文件参数。

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

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

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

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

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

从 CMK 恢复到 AWS 拥有的密钥

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

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

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

  3. 运行更新应用程序 AWS CLI 命令,如以下示例所示。在此命令中,提供您在前面步骤中创建的 JSON 配置文件作为文件参数。

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