本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
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 服务进行一致的加密。
可以将客户自主管理型密钥与以下资源结合使用:
-
状态机:标准和快速工作流程类型
-
活动
您可以通过输入密钥 ID 来指定数据密钥,St KMS e p Functions 使用该密钥来加密您的数据。
-
KMS密钥 ID — Amazon KMS 客户托管密钥的密钥标识符,其形式为密钥 ID、密钥ARN、别名或别名ARN。
使用客户自主管理型密钥创建状态机
先决条件:在使用客户托管 Amazon KMS 密钥创建状态机之前,您的用户或角色必须拥有DescribeKey
和的 Amazon KMS 权限GenerateDataKey
。
您可以在 Amazon 控制台中、通过或通过 Amazon CloudFormation 资源配置基础架构来执行以下步骤。API (CloudFormation 示例将在本指南的后面部分介绍。)
步骤 1:创建 Amazon KMS 密钥
您可以使用 Amazon KMS 控制台或 Amazon KMS APIs创建对称的客户托管密钥。
创建对称的客户托管密钥
按照《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::111122223333: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:
region
:accountId
:key/keyId
", "Condition": { "StringEquals": { "kms:EncryptionContext:SourceArn": "arn:aws:logs:region
:accountId
:*" } } } ] }
步骤 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.
region
.amazonaws.com" }, "Action": [ "kms:Encrypt*", "kms:Decrypt*", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:Describe*" ], "Resource": "*", "Condition": { "ArnEquals": { "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:region
:account-id
: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 活动资源保持不可变。您无法更新现有encryptionConfiguration
ARN活动的活动;必须创建新的活动资源。活动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:stateMachineArn
aws:states:activityArn
用于状态机或活动,值为资源 Amazon 资源名称 (ARN)。
"encryptionContext": {"aws:states:stateMachineArn": "arn:aws:states:us-east-1:123456789012:stateMachine:stateMachineName"}
"encryptionContext": {"aws:states:activityArn": "arn:aws:states:us-east-1:123456789012:activity:activityName"}
以下示例说明如何使用aws:states:stateMachineArn
上下文 Amazon KMS 密钥将执行角色的密钥限制在特定的状态机上:kms:EncryptionContext
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Allow KMS Permissions for StepFunctionsWorkflowExecutions",
"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 密钥用于特定操作,并代表该ca-central-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 权限时适用(例如CreateStateMachine
CreateActivity
、GetActivityTask
、等)。向执行角色添加 kms:ViaService
条件,可能会阻止新的执行启动或导致正在运行的执行失败。
来API电者所需的权限
要调用返回加密数据的 Step Functions API 操作,调用者需要 Amazon KMS
权限。或者,某些API操作具有仅返回元数据的选项 (METADATA_ONLY
),从而取消了对 Amazon KMS 权限的要求。有关信息,请参阅 Step Func API tions。
为了在使用客户托管密钥加密时成功完成执行,需要授予执行角色kms:GenerateDataKey
以及状态机使用的 Amazon KMS 密钥的kms:Decrypt
权限。
下表显示了您需要向 Step Function API s 调用者提供的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 Function API s 调用者提供的APIs使用活动 Amazon KMS 密钥的 Amazon KMS 权限。您可以在密钥策略或IAM策略中为角色提供权限。
APIs使用活动密 Amazon KMS 钥 | 调用方需要 |
CreateActivity | kms:DescribeKey |
GetActivityTask | kms:解密 |
何时向调用方或执行角色授予权限?
当IAM角色或用户调用 Step Functions 时API,Step Functions 服务会 Amazon KMS 代表调API用者进行调用。在这种情况下,您必须向API呼叫者授予 Amazon KMS 权限。当执行角色 Amazon KMS 直接调用时,必须授予对执行角色的 Amazon KMS 权限。
Amazon CloudFormation 用于加密配置的资源
Amazon CloudFormation Step Functions 的资源类型可以使用加密配置来配置状态机和活动资源。
默认情况下,Step Functions 提供透明的服务器端加密。两者都AWS::StepFunctions::Activity
AWS::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的别名ARN、别名、 Amazon KMS 密钥 ID 或密钥。要在其他 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
监控 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。