本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Step Functions 中的静态数据加密
阅读博客
在 “使用客户管理的密钥加强数据安全” 中阅读有关客户管理Amazon KMS的
Amazon Step Functions始终使用透明的服务器端加密对静态数据进行加密。默认情况下,静态数据加密可降低保护敏感数据的运营开销和复杂性。您可以构建符合严格加密合规性和法规要求的安全敏感型应用程序。
尽管您无法禁用此加密层或选择其他加密类型,但您可以在创建状态机和活动资源时选择客户管理的密钥,从而在现有Amazon拥有的加密密钥上添加第二层加密:
-
客户托管密钥 — Step Functions 支持使用您创建、拥有和管理的对称客户托管密钥,以便在现有Amazon拥有的加密基础上添加第二层加密。由于您可以完全控制这层加密,因此可以执行以下任务:
-
制定和维护关键策略
-
建立和维护 IAM 策略和授权
-
启用和禁用密钥策略
-
轮换加密材料
-
添加标签
-
创建密钥别名
-
安排密钥删除
有关信息,请参阅《Amazon Key Management Service 开发人员指南》中的 customer managed key。
-
您可以使用客户管理的Amazon Step Functions状态机和活动密钥对数据进行加密。在创建或更新状态机以及创建 Act ivit y 时,您可以配置对称Amazon KMS密钥和数据密钥的重复使用周期。执行历史记录和状态机定义将使用应用于状态机的密钥进行加密。活动输入将使用应用于活动的密钥进行加密。
使用客户托管Amazon KMS密钥,您可以保护包括受保护健康信息 (PHI) 在内的客户数据免遭未经授权的访问。Step Functions 与集成 CloudTrail,因此您可以在 CloudTrail 控制台中查看和审核事件历史记录中的最新事件。
有关信息Amazon KMS,请参阅什么是Amazon Key Management Service?
注意
Step Functions 使用Amazon自有密钥自动启用静态加密,不收取任何费用。但是,使用客户管理的密钥需要Amazon KMS付费。有关定价的信息,请参阅 Amazon Key Management Service 定价
使用客户自主管理型密钥进行加密
Step Functions 使用您的客户托管Amazon KMS密钥解密负载数据,然后将其传递给其他服务以执行任务。数据在传输过程中使用传输层安全性协议(TLS)进行加密。
当从集成服务返回数据时,Step Functions 会使用您的客户托管Amazon KMS密钥对数据进行加密。您可以使用相同的密钥对许多Amazon服务进行一致的加密。
可以将客户自主管理型密钥与以下资源结合使用:
-
状态机:标准和快速工作流程类型
-
活动
可以通过输入 KMS 密钥 ID 来指定数据密钥,Step Functions 使用该密钥来加密您的数据。
-
KMS 密钥 ID — Amazon KMS 客户托管密钥的密钥标识符,其形式为密钥 ID、密钥 ARN、别名或别名 ARN。
使用客户自主管理型密钥创建状态机
先决条件:在使用客户托管Amazon KMS密钥创建状态机之前,您的用户或角色必须拥有DescribeKey和的Amazon KMS权限GenerateDataKey。
您可以在Amazon控制台中、通过 API 或通过Amazon CloudFormation资源配置基础设施来执行以下步骤。 (CloudFormation 示例将在本指南的后面部分介绍。)
步骤 1:创建Amazon KMS密钥
您可以使用Amazon KMS控制台或Amazon KMSAPIs创建对称的客户托管密钥。
创建对称的客户托管密钥
按照《Amazon Key Management Service 开发人员指南》中创建对称的客户托管密钥的步骤进行操作。
注意
可选:创建密钥时,可以选择密钥管理员。选定的用户或角色将被授予管理密钥的权限,例如通过 API 启用或禁用密钥。也可以选择密钥用户。这些用户或角色将被授予在加密操作中使用Amazon KMS密钥的能力。
步骤 2:设置Amazon KMS密钥策略
密钥政策控制对客户托管密钥的访问。每个客户托管式密钥必须只有一个密钥策略,其中包含确定谁可以使用密钥以及如何使用密钥的声明。创建客户托管式密钥时,可以指定密钥策略。有关信息,请参阅《Amazon Key Management Service 开发人员指南》中的 Managing access to customer managed keys。
以下是控制台中的Amazon KMS密钥策略示例,不包括密钥管理员或密钥用户:
-
{ "Version":"2012-10-17", "Id": "key-consolepolicy-1", "Statement": [ { "Sid": "Enable IAM User Permissions for the key", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:root" }, "Action": "kms:*", "Resource": "*" } ] }
有关 specifying permissions in a policy 和 troubleshooting key access 的更多信息,请参阅《Amazon Key Management Service 开发人员指南》。
步骤 3:添加密钥策略以加密 CloudWatch 日志
Step Functions 与集成在一起, CloudWatch 用于记录和监控。当您使用自己的 KMS 密钥为状态机启用服务器端加密并启用 CloudWatch 日志集成时,必须delivery.logs.amazonaws.com允许根据Amazon KMS密钥策略执行kms:Decrypt操作:
{ "Sid": "Enable log service delivery for integrations", "Effect": "Allow", "Principal": { "Service": "delivery.logs.amazonaws.com" }, "Action": "kms:Decrypt", "Resource": "*" }
如果您使用Amazon KMS密钥启用状态机加密,并且状态机启用了 CloudWatch 日志集成,则状态机的执行角色需要以下策略:
-
{ "Version":"2012-10-17", "Statement": [ { "Sid": "AllowKMSPermissionForCloudWatchLogGroup", "Effect": "Allow", "Action": "kms:GenerateDataKey", "Resource": "arn:aws:kms:us-east-1:123456789012:key/keyId", "Condition": { "StringEquals": { "kms:EncryptionContext:SourceArn": "arn:aws:logs:us-east-1:123456789012:*" } } } ] }
步骤 4:加密 CloudWatch 日志组(可选)
您可以使用自己的密Amazon KMS钥对日志组中的 CloudWatch 日志启用加密。为此,您还必须向该Amazon KMS密钥添加以下策略。
注意
您可以选择相同或不同的Amazon KMS密钥来加密日志和状态机定义。
-
{ "Id": "key-consolepolicy-logging", "Version":"2012-10-17", "Statement": [ { "Sid": "Enable log service for a single log group", "Effect": "Allow", "Principal": { "Service": "logs.us-east-1.amazonaws.com" }, "Action": [ "kms:Encrypt*", "kms:Decrypt*", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:Describe*" ], "Resource": "*", "Condition": { "ArnEquals": { "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:us-east-1:123456789012:log-group:LOG_GROUP_NAME" } } } ] }
注意
该Condition部分将Amazon KMS密钥限制为单个日志组 ARN。
步骤 5:创建状态机
创建密钥并设置策略后,可以使用该密钥来创建新的状态机。
创建状态机时,选择其它配置,然后选择使用客户自主管理型密钥进行加密。然后,可以选择密钥,并设置数据密钥的重用期(从 1 分钟到 15 分钟)。
或者,您可以通过设置日志级别并选择使用您的密Amazon KMS钥加密日志组来启用日志记录。
注意
只能在 Step Functions 控制台中对新的日志组启用加密。要了解如何将Amazon KMS密钥与现有日志组关联,请参阅将Amazon KMS密钥与日志组关联。
要使用客户自主管理型密钥成功启动标准工作流程和异步快速工作流程的执行,您的执行角色需要 kms:Decrypt 和 kms:GenerateDataKey 权限。同步快速执行的执行角色需要 kms:Decrypt。当您在控制台中创建状态机并选择创建新角色时,这些权限将自动包含在内。
以下是示例执行角色策略:
-
{ "Version":"2012-10-17", "Statement": [ { "Sid": "AllowKMSPermissionsForStepFunctionsWorkflowExecutions", "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": [ "arn:aws:kms:us-east-1:123456789012:key/keyId" ], "Condition": { "StringEquals": { "kms:EncryptionContext:aws:states:stateMachineArn": [ "arn:aws:states:us-east-1:123456789012:stateMachine:stateMachineName" ] } } } ] }
步骤 6:调用用您的Amazon KMS密钥加密的状态机
可以像往常一样调用加密的状态机,而数据将使用客户自主管理型密钥进行加密。
使用客户自主管理型密钥创建活动
使用客户自主管理型密钥创建 Step Functions 活动与使用客户自主管理型密钥创建状态机类似。在使用客户托管Amazon KMS密钥创建活动之前,您的用户或角色只需要Amazon KMS权限DescribeKey。在创建活动期间,可以选择密钥并设置加密配置参数。
请注意,Step Functions 活动资源保持不可变。无法更新现有活动的活动 ARN 的 encryptionConfiguration;而必须创建新的活动资源。Activity API 端点的调用者必须拥有成功使用Amazon KMS密钥创建活动的kms:DescribeKey权限。
对活动任务启用客户自主管理型密钥加密后,状态机执行角色将需要对于活动密钥的 kms:GenerateDataKey 和 kms:Decrypt 权限。如果您是从 Step Functions 控制台创建此状态机,则自动角色创建功能将添加这些权限。
-
{ "Version":"2012-10-17", "Statement": [ { "Sid": "AllowKMSPermissionsForStepFunctionsActivities", "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": [ "arn:aws:kms:us-east-1:123456789012:key/keyId" ], "Condition": { "StringEquals": { "kms:EncryptionContext:aws:states:activityArn": [ "arn:aws:states:us-east-1:123456789012:activity:activityName" ] } } } ] }
用条件缩小Amazon KMS权限策略的范围
可以使用密钥策略和 IAM 策略中的加密上下文 作为 conditions,来控制对于对称客户自主管理型密钥的访问权限。要将Amazon KMS密钥的使用限制为代表特定角色从 Step Functions 发出的请求,您可以使用kms:ViaService条件。
使用加密上下文限定范围
加密上下文是一组可选的键值对,包含有关数据的其他上下文信息。
Amazon KMS使用加密上下文作为其他经过身份验证的数据来支持经过身份验证的加密。当您在加密数据的请求中包含加密上下文时,会将加密上下文Amazon KMS绑定到加密数据。要解密数据,您必须在请求中包含相同的加密上下文。
Step Functions 提供了Amazon KMS加密操作中的加密上下文,其中密钥aws:states:stateMachineArnaws:states:activityArn用于状态机或活动,值为资源亚马逊资源名称 (ARN)。
"encryptionContext": {"aws:states:stateMachineArn": "arn:aws:states:region:account-id:stateMachine:stateMachineName"}"encryptionContext": {"aws:states:activityArn": "arn:aws:states:region:account-id:activity:activityName"}以下示例说明如何使用aws:states:stateMachineArn上下文Amazon KMS密钥将执行角色的密钥限制在特定的状态机上:kms:EncryptionContext
-
{ "Version":"2012-10-17", "Statement": [ { "Sid": "AllowKeyManagement", "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": [ "arn:aws:kms:us-east-1:123456789012:key/keyId" ], "Condition": { "StringEquals": { "kms:EncryptionContext:aws:states:stateMachineArn": "arn:aws:states:us-east-1:123456789012:stateMachine:stateMachineName" } } } ] }
用范围界定 kms: ViaService
kms:ViaService条件密钥将密Amazon Key Management Service钥的使用限制为来自指定Amazon服务的请求。
以下示例策略使用kms:ViaService条件,仅当请求来自该区域的 Step Functions 时,才允许将Amazon KMS密钥用于特定操作,并代表该us-east-1区域的 Step Functions: ExampleRole
-
{ "Version":"2012-10-17", "Statement": [ { "Sid": "Allow access for Key Administrators in a region", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:role/ExampleRole" }, "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "*", "Condition": { "StringEquals": { "kms:ViaService": "states.us-east-1.amazonaws.com" } } } ] }
注意
该kms:ViaService条件仅在 API 调用者需要Amazon KMS权限时才适用(例如CreateStateMachineCreateActivityGetActivityTask、、等)。向执行角色添加 kms:ViaService 条件,可能会阻止新的执行启动或导致正在运行的执行失败。
API 调用方所需的权限
要调用返回加密数据的 Step Functions API 操作,调用方需要 Amazon KMS 权限。或者,某些 API 操作具有仅返回元数据的选项 (METADATA_ONLY),从而取消了对Amazon KMS权限的要求。有关信息,请参阅 Step Functions API。
为了在使用客户托管密钥加密时成功完成执行,需要授予执行角色kms:GenerateDataKey以及状态机使用的Amazon KMS密钥的kms:Decrypt权限。
下表显示了您需要向 Step Functions API 调用者提供的 APIs 使用状态机Amazon KMS密钥的Amazon KMS权限。可以在密钥策略或 IAM 策略中为角色提供权限。
| APIs 使用状态机的密Amazon KMS钥 | 调用方需要 |
| CreateStateMachine | kms:DescribeKey, kms:GenerateDataKey |
| UpdateStateMachine | kms:DescribeKey, kms:GenerateDataKey |
| DescribeStateMachine | kms:解密 |
| DescribeStateMachineForExecution | kms:解密 |
| StartExecution | -- |
| StartSyncExecution | kms:解密 |
| SendTaskSuccess | -- |
| SendTaskFailure | -- |
| StopExecution | -- |
| RedriveExecution | -- |
| DescribeExecution | kms:解密 |
| GetExecutionHistory | kms:解密 |
下表显示了您需要向 Step Functions API 调用者提供的 APIs 使用活动Amazon KMS密钥的Amazon KMS权限。可以在密钥策略或 IAM 策略中为角色提供权限。
| APIs 使用活动密Amazon KMS钥 | 调用方需要 |
| CreateActivity | kms:DescribeKey |
| GetActivityTask | kms:解密 |
何时向调用方或执行角色授予权限?
当 IAM 角色或用户调用 Step Functions API 时,Step Function Amazon KMS s 服务会代表 API 调用者进行调用。在这种情况下,您必须向 API 调用者授予Amazon KMS权限。当执行角色Amazon KMS直接调用时,您必须授予该执行角色的Amazon KMS权限。
Amazon CloudFormation用于加密配置的资源
Amazon CloudFormationStep Functions 的资源类型可以使用加密配置来配置状态机和活动资源。
默认情况下,Step Functions 提供透明的服务器端加密。两者都AWS::StepFunctions::ActivityAWS::StepFunctions::StateMachine接受一个可选EncryptionConfiguration属性,该属性可以为服务器端加密配置客户托管Amazon KMS密钥。
先决条件:在使用客户托管Amazon KMS密钥创建状态机之前,您的用户或角色必须拥有DescribeKey和的Amazon KMS权限GenerateDataKey。
更新到 StateMachine 需要不中断。对活动资源的更新要求:替换。
要在Amazon CloudFormation模板中声明EncryptionConfiguration属性,请使用以下语法:
JSON
{ "KmsKeyId" : String, "KmsDataKeyReusePeriodSeconds" : Integer, "Type" : String }
YAML
KmsKeyId: String KmsDataKeyReusePeriodSeconds: Integer Type: String
属性
-
Type:状态机或活动的加密选项。允许的值:
CUSTOMER_MANAGED_KMS_KEY|AWS_OWNED_KEY -
KmsKeyId-加密数据密钥的对称加密密钥的别名、别名 ARN、密钥 ID 或Amazon KMS密钥 ARN。要在其他Amazon账户中指定Amazon KMS密钥,客户必须使用密钥 ARN 或别名 ARN。有关信息 kmsKeyId,请参阅Amazon KMS文档KeyId中的。
-
KmsDataKeyReusePeriodSeconds-SFN 重复使用数据密钥的最长持续时间。期限到期后,Step Functions 将调用
GenerateDataKey。只有当 Type 为CUSTOMER_MANAGED_KMS_KEY时,才能设置此设置。值的范围可以介于 60-900 秒之间。默认为 300 秒。
Amazon CloudFormation例子
示例: StateMachine 使用客户托管密钥
AWSTemplateFormatVersion: '2010-09-09' Description: An example template for a Step Functions State Machine. Resources: MyStateMachine: Type: AWS::StepFunctions::StateMachine Properties: StateMachineName: HelloWorld-StateMachine Definition: StartAt: PassState States: PassState: Type: Pass End: true RoleArn: !Sub "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/example" EncryptionConfiguration: KmsKeyId: !Ref MyKmsKey KmsDataKeyReusePeriodSeconds: 100 Type: CUSTOMER_MANAGED_KMS_KEY MyKmsKey: Type: AWS::KMS::Key Properties: Description: Symmetric KMS key used for encryption/decryption
示例:使用客户自主管理型密钥的活动
AWSTemplateFormatVersion: '2010-09-09' Description: An example template for a Step Functions Activity. Resources: Activity: Type: AWS::StepFunctions::Activity Properties: Name: ActivityWithKmsEncryption EncryptionConfiguration: KmsKeyId: !Ref MyKmsKey KmsDataKeyReusePeriodSeconds: 100 Type: CUSTOMER_MANAGED_KMS_KEY MyKmsKey: Type: AWS::KMS::Key Properties: Description: Symmetric KMS key used for encryption/decryption
更新活动的加密要求创建新资源
活动配置是不可变的,并且资源名称必须唯一。要设置客户自主管理型密钥来进行加密,必须创建新活动。如果您尝试在 CFN 模板中更改现有活动的配置,则将收到 ActivityAlreadyExists 异常。
要更新活动以包含客户自主管理型密钥,请在 CFN 模板中设置一个新的活动名称。以下示例显示了使用客户自主管理型密钥配置创建新活动的示例:
现有活动定义
AWSTemplateFormatVersion: '2010-09-09'
Description: An example template for a new Step Functions Activity.
Resources:
Activity:
Type: AWS::StepFunctions::Activity
Properties:
Name: ActivityName
EncryptionConfiguration:
Type: AWS_OWNED_KEY
新活动定义
AWSTemplateFormatVersion: '2010-09-09' Description: An example template for a Step Functions Activity. Resources: Activity: Type: AWS::StepFunctions::Activity Properties: Name: ActivityWithKmsEncryption EncryptionConfiguration: KmsKeyId: !Ref MyKmsKey KmsDataKeyReusePeriodSeconds: 100 Type: CUSTOMER_MANAGED_KMS_KEY MyKmsKey: Type: AWS::KMS::Key Properties: Description: Symmetric KMS key used for encryption/decryption
监控加密密钥使用情况
当您使用Amazon KMS客户托管密钥加密您的 Step Functions 资源时,您可以使用 CloudTrail来跟踪 Step Functions 发送到的请求Amazon KMS。
您还可以在审核记录和日志中使用加密上下文来确定客户托管密钥的使用情况。加密上下文也会显示在 Amazon CloudTrail 生成的日志中。
以下示例是DecryptDescribeKey、和GenerateDataKey监控 Step Functions 为访问由客户托管密钥加密的数据而调用的Amazon KMS操作 CloudTrail 的事件:
FAQs
如果我的密钥在 Amazon KMS 中标记为待删除或已被删除,会发生什么?
如果密钥在中被删除或标记为删除Amazon KMS,则任何相关的运行执行都将失败。在您移除或更改与工作流程关联的密钥之前,无法开始新的执行。删除Amazon KMS密钥后,与工作流程执行相关的所有加密数据都将保持加密状态,无法再解密,从而使数据无法恢复。
如果Amazon KMS密钥在中被禁用会Amazon KMS怎样?
如果在中禁用了Amazon KMS密钥Amazon KMS,则任何相关的运行执行都将失败。无法启动新的执行。在重新启用该禁用密Amazon KMS钥之前,您无法再解密使用该禁用密钥加密的数据。
发送到的执行状态变更事件会怎 EventBridge样?
使用您的客户托管Amazon KMS密钥加密的工作流程的执行状态更改事件将不包括执行输入、输出、错误和原因。
了解详情
有关静态数据加密的信息,请参阅《Amazon Key Management Service 开发人员指南》中的 Amazon Key Management Service concepts 和 security best practices for Amazon Key Management Service。