Step Functions 中的静态数据加密
阅读博客
阅读 Strengthening data security with a customer-managed Amazon KMS key
Amazon Step Functions 始终使用透明的服务器端加密对静态数据进行加密。默认情况下,静态数据加密可降低保护敏感数据的运营开销和复杂性。您可以构建符合严格加密合规性和法规要求的安全敏感型应用程序。
虽然您无法禁用此加密层,也不能选择其它加密类型,但您可以在创建状态机和活动资源时,通过选择客户自主管理型密钥,在 Amazon 拥有的现有加密密钥的基础上添加第二层加密。
-
客户自主管理型密钥:Step Functions 支持使用您所创建、拥有和管理的对称客户自主管理型密钥,在 Amazon 拥有的现有加密的基础上添加第二层加密。由于您可以完全控制这层加密,因此可以执行以下任务:
-
制定和维护关键策略
-
建立和维护 IAM 策略和授权
-
启用和禁用密钥策略
-
轮换加密材料
-
添加标签
-
创建密钥别名
-
安排密钥删除
有关信息,请参阅《Amazon Key Management Service 开发人员指南》中的 customer managed key。
-
可以使用客户自主管理型密钥对 Amazon Step Functions 状态机和活动的数据进行加密。可以在创建或更新状态机以及创建活动时,配置对称 Amazon KMS 密钥和数据密钥重用期。执行历史记录和状态机定义将使用应用于状态机的密钥进行加密。活动输入将使用应用于活动的密钥进行加密。
使用客户自主管理型 Amazon KMS 密钥,可以保护客户数据免遭未经授权的访问,其中包括受保护健康信息(PHI)。Step Functions 与 CloudTrail 集成,因此,您可以在 CloudTrail 控制台的事件历史记录中查看和审计最新事件。
有关 Amazon KMS 的信息,请参阅 What is 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 和 GenerateDataKey 的 Amazon KMS 权限。
可以在 Amazon 管理控制台中、通过 API 或通过 Amazon CloudFormation 资源预置基础设施来执行以下步骤。(本指南稍后将介绍 CloudFormation 示例。)
步骤 1:创建 Amazon KMS 密钥
可以使用 Amazon KMS 控制台或 Amazon KMS API 创建对称的客户自主管理型密钥。
创建对称的客户托管密钥
按照《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 Logs 集成时,必须支持 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 Logs 集成,则状态机的执行角色需要以下策略:
-
{ "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。
注意
请参阅 CloudWatch logs documentation,来详细了解如何为日志组设置对 Amazon KMS 密钥的权限。
步骤 5:创建状态机
创建密钥并设置策略后,可以使用该密钥来创建新的状态机。
创建状态机时,选择其它配置,然后选择使用客户自主管理型密钥进行加密。然后,可以选择密钥,并设置数据密钥的重用期(从 1 分钟到 15 分钟)。
(可选)可以通过设置日志级别并选择使用您的 Amazon KMS 密钥加密日志组来启用日志记录。
注意
只能在 Step Functions 控制台中对新的日志组启用加密。要了解如何将 Amazon KMS 密钥与现有日志组关联,请参阅 Associate a Amazon KMS key with a log group。
要使用客户自主管理型密钥成功启动标准工作流程和异步快速工作流程的执行,您的执行角色需要 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 密钥创建活动之前,您的用户或角色只需要具有执行 DescribeKey 的 Amazon KMS 权限。在创建活动期间,可以选择密钥并设置加密配置参数。
请注意,Step Functions 活动资源保持不可变。无法更新现有活动的活动 ARN 的 encryptionConfiguration;而必须创建新的活动资源。活动 API 端点的调用方必须拥有 kms:DescribeKey 权限,才能成功使用 Amazon KMS 密钥创建活动。
对活动任务启用客户自主管理型密钥加密后,状态机执行角色将需要对于活动密钥的 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:stateMachineArn(对于状态机)或 aws:states:activityArn(对于活动),而值为资源 Amazon 资源名称(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"}以下示例说明如何使用 kms:EncryptionContext 和 aws:states:stateMachineArn 上下文密钥,将执行角色的 Amazon KMS 密钥的使用限制为特定状态机:
-
{ "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 条件,仅当请求来自 us-east-1 区域中的 Step Functions 并代表 ExampleRole 执行时,才支持将 Amazon KMS 密钥用于特定的操作:
-
{ "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 权限时才适用(例如 CreateStateMachine、CreateActivity、GetActivityTask 等)。向执行角色添加 kms:ViaService 条件,可能会阻止新的执行启动或导致正在运行的执行失败。
API 调用方所需的权限
要调用返回加密数据的 Step Functions API 操作,调用方需要 Amazon KMS 权限。或者,某些 API 操作具有仅返回元数据的选项 (METADATA_ONLY),从而消除了对 Amazon KMS 权限的需要。有关信息,请参阅 Step Functions API。
为了在使用客户自主管理型密钥加密时成功完成执行,需要向执行角色授予对状态机使用的 Amazon KMS 密钥的 kms:GenerateDataKey 和 kms:Decrypt 权限。
下表显示,对于使用状态机的 Amazon KMS 密钥的 API,您需要向 Step Functions API 调用方提供的 Amazon KMS 权限。可以在密钥策略或 IAM 策略中为角色提供权限。
| 使用状态机的 Amazon KMS 密钥的 API | 调用方需要 |
| CreateStateMachine | kms:DescribeKey、kms:GenerateDataKey |
| UpdateStateMachine | kms:DescribeKey、kms:GenerateDataKey |
| DescribeStateMachine | kms:Decrypt |
| DescribeStateMachineForExecution | kms:Decrypt |
| StartExecution | -- |
| 开始同步执行 | kms:Decrypt |
| SendTaskSuccess | -- |
| SendTaskFailure | -- |
| StopExecution | -- |
| RedriveExecution | -- |
| DescribeExecution | kms:Decrypt |
| GetExecutionHistory | kms:Decrypt |
下表显示,对于使用活动的 Amazon KMS 密钥的 API,您需要向 Step Functions API 调用方提供的 Amazon KMS 权限。可以在密钥策略或 IAM 策略中为角色提供权限。
| 使用活动的 Amazon KMS 密钥的 API | 调用方需要 |
| CreateActivity | kms:DescribeKey |
| GetActivityTask | kms:Decrypt |
何时向调用方或执行角色授予权限?
当 IAM 角色或用户调用 Step Functions API 时,Step Functions 服务会代表 API 调用方调用 Amazon KMS。在这种情况下,您必须向 API 调用方授予 Amazon KMS 权限。当执行角色直接调用 Amazon KMS 时,必须向执行角色授予 Amazon KMS 权限。
用于加密配置的 Amazon CloudFormation 资源
Step Functions 的 Amazon CloudFormation 资源类型可以使用加密配置来预置状态机和活动资源。
默认情况下,Step Functions 提供透明的服务器端加密。AWS::StepFunctions::Activity 和 AWS::StepFunctions::StateMachine 两者均接受可选的 EncryptionConfiguration 属性,该属性可以为服务器端加密配置客户自主管理型 Amazon KMS 密钥。
先决条件:在使用客户自主管理型 Amazon KMS 密钥创建状态机之前,用户或角色必须拥有执行 DescribeKey 和 GenerateDataKey 的 Amazon KMS 权限。
对 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:加密数据密钥的对称加密 Amazon KMS 密钥的别名、别名 ARN、密钥 ID 或密钥 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 生成的日志中。
以下示例是 Decrypt、DescribeKey 和 GenerateDataKey 的 CloudTrail 事件,用于监控 Step Functions 为访问由客户自主管理型密钥加密的数据而调用的 Amazon KMS 操作:
常见问题解答
如果我的密钥在 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。