

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

# 安全性 Amazon Step Functions
<a name="security"></a>

云安全 Amazon 是重中之重。作为 Amazon 客户，您可以受益于专为满足大多数安全敏感型组织的要求而构建的数据中心和网络架构。

安全是双方共同承担 Amazon 的责任。[责任共担模式](https://www.amazonaws.cn/compliance/shared-responsibility-model/)将其描述为云*的* 安全性和云*中* 的安全性：
+ **云安全** — Amazon 负责保护在 Amazon 云中运行 Amazon 服务的基础架构。 Amazon 还为您提供可以安全使用的服务。作为 [Amazon 合规性计划](https://www.amazonaws.cn/compliance/programs/)的一部分，第三方审核人员将定期测试和验证安全性的有效性。要了解适用的合规计划 Amazon Step Functions，请参阅[按合规计划划分的范围内的Amazon 服务](https://www.amazonaws.cn/compliance/services-in-scope/)。
+ **云中的安全性**：您的责任由您使用的 Amazon 服务决定。您还需要对其他因素负责，包括您的数据的敏感性、您公司的要求以及适用的法律法规。

此文档有助于了解如何在使用 Step Functions 时应用责任共担模式。以下主题说明如何配置 Step Functions 来满足安全性和合规性目标。您还将学习如何使用其他 Amazon 服务来帮助您监控和保护您的 Step Functions 资源。

Step Functions 使用 IAM 来控制对其他 Amazon 服务和资源的访问。有关 IAM 工作原理的概述，请参阅《IAM 用户指南》[https://docs.amazonaws.cn/IAM/latest/UserGuide/introduction_access-management.html](https://docs.amazonaws.cn/IAM/latest/UserGuide/introduction_access-management.html)中的*访问管理概述*。有关安全凭证的概述，请参阅 *Amazon Web Services 一般参考* 中的 [Amazon 安全凭证](https://docs.amazonaws.cn/general/latest/gr/aws-security-credentials.html)。

## Step Functions 的合规性验证
<a name="compliance"></a>

 Amazon Step Functions 作为多个合规计划的一部分，第三方审计师对安全性和 Amazon 合规性进行评估。其中包括 SOC、PCI、FedRAMP、HIPAA 及其他。

有关特定合规计划范围内的 Amazon 服务列表，请参阅按合规计划划分的[划分的范围内的服务](https://www.amazonaws.cn/compliance/services-in-scope/)。有关一般信息，请参阅[合规计划](https://www.amazonaws.cn/compliance/programs/)。

您可以使用下载第三方审计报告 Amazon Artifact。有关更多信息，请参阅中的 “[下载报告” Amazon Artifact](https://docs.amazonaws.cn/artifact/latest/ug/downloading-documents.html)。

您在使用 Step Functions 时的合规责任取决于数据的敏感度、贵公司的合规目标以及适用的法律和法规。 Amazon 提供了以下资源来帮助实现合规性：
+ [安全与合规性快速入门指南](https://www.amazonaws.cn/quickstart/?awsf.quickstart-homepage-filter=categories%23security-identity-compliance)[安全与合规性快速入门指南](https://www.amazonaws.cn/quickstart/?awsf.quickstart-homepage-filter=categories%23security-identity-compliance) — 这些部署指南讨论了架构注意事项，并提供了在上部署以安全性和合规性为重点的基准环境的步骤。 Amazon
+ 在 A@@ [mazon Web Services 上构建 HIPAA 安全与合规性](https://docs.amazonaws.cn/whitepapers/latest/architecting-hipaa-security-and-compliance-on-aws/aws-step-functions.html) — 本白皮书描述了各公司如何使用 Amazon 来创建符合 HIPAA 标准的应用程序。
+ [合规资源](https://www.amazonaws.cn/compliance/resources/) — 此工作簿和指南集可能适用于您所在的行业和所在地区。
+ [使用*Amazon Config 开发人员指南*中的规则评估资源](https://docs.amazonaws.cn/config/latest/developerguide/evaluate-config.html) — 该 Amazon Config 服务评估您的资源配置在多大程度上符合内部实践、行业准则和法规。
+ [Amazon Security Hub CSPM](https://docs.amazonaws.cn/securityhub/latest/userguide/what-is-securityhub.html)— 此 Amazon 服务可全面了解您的安全状态 Amazon ，帮助您检查是否符合安全行业标准和最佳实践。

## Step Functions 中的故障恢复能力
<a name="disaster-recovery-resiliency"></a>

 Amazon 全球基础设施是围绕 Amazon 区域和可用区构建的。 Amazon 区域提供多个物理隔离和隔离的可用区，这些可用区通过低延迟、高吞吐量和高度冗余的网络相连。利用可用区，您可以设计和操作在可用区之间无中断地自动实现失效转移的应用程序和数据库。与传统的单个或多个数据中心基础设施相比，可用区具有更高的可用性、容错能力和可扩展性。

有关 Amazon 区域和可用区的更多信息，请参阅[Amazon 全球基础设施](https://www.amazonaws.cn/about-aws/global-infrastructure/)。

除了 Amazon 全球基础架构外，Step Functions 还提供多项功能来帮助支持您的数据弹性和备份需求。

## Step Functions 中的基础设施安全性
<a name="infrastructure-security"></a>

作为一项托管服务，受 Amazon 全球网络安全的保护。有关 Amazon 安全服务以及如何 Amazon 保护基础设施的信息，请参阅[Amazon 云安全](https://www.amazonaws.cn/security/)。要使用基础设施安全的最佳实践来设计您的 Amazon 环境，请参阅 S * Amazon ecurity Pillar Well-Architected Fram* ework 中的[基础设施保护](https://docs.amazonaws.cn/wellarchitected/latest/security-pillar/infrastructure-protection.html)。

您可以使用 Amazon 已发布的 API 调用通过网络进行访问。客户端必须支持以下内容：
+ 传输层安全性协议（TLS）。我们要求使用 TLS 1.2，建议使用 TLS 1.3。
+ 具有完全向前保密（PFS）的密码套件，例如 DHE（临时 Diffie-Hellman）或 ECDHE（临时椭圆曲线 Diffie-Hellman）。大多数现代系统（如 Java 7 及更高版本）都支持这些模式。

您可以从任何网络位置调用 Amazon API 操作，但Step Functions不支持基于资源的访问策略，其中可能包括基于源 IP 地址的限制。您还可以使用Step Functions策略来控制来自特定Amazon Virtual Private Cloud (Amazon VPC)端点或特定端点的访问 VPCs。实际上，这可以将对给定Step Functions资源的网络访问与网络中的特定 VPC 隔离开来。 Amazon 

# Step Functions 中的数据保护和加密
<a name="data-protection"></a>

分 Amazon [分担责任模型](https://www.amazonaws.cn/compliance/shared-responsibility-model/)适用于中的数据保护 Amazon Step Functions。如本模型所述 Amazon ，负责保护运行所有内容的全球基础架构 Amazon Web Services 云。您负责维护对托管在此基础结构上的内容的控制。您还负责您所使用的 Amazon Web Services 服务 的安全配置和管理任务。有关数据隐私的更多信息，请参阅[数据隐私常见问题](https://www.amazonaws.cn/compliance/data-privacy-faq/)。

出于数据保护目的，我们建议您保护 Amazon Web Services 账户 凭证并使用 Amazon IAM Identity Center 或 Amazon Identity and Access Management (IAM) 设置个人用户。这样，每个用户只获得履行其工作职责所需的权限。还建议您通过以下方式保护数据：
+ 对每个账户使用多重身份验证（MFA）。
+ 用于 SSL/TLS 与 Amazon 资源通信。我们要求使用 TLS 1.2，建议使用 TLS 1.3。
+ 使用设置 API 和用户活动日志 Amazon CloudTrail。有关使用 CloudTrail 跟踪捕获 Amazon 活动的信息，请参阅《*Amazon CloudTrail 用户指南》*中的[使用跟 CloudTrail 踪](https://docs.amazonaws.cn/awscloudtrail/latest/userguide/cloudtrail-trails.html)。
+ 使用 Amazon 加密解决方案以及其中的所有默认安全控件 Amazon Web Services 服务。
+ 使用高级托管安全服务（例如 Amazon Macie），它有助于发现和保护存储在 Amazon S3 中的敏感数据。
+ 如果您在 Amazon 通过命令行界面或 API 进行访问时需要经过 FIPS 140-3 验证的加密模块，请使用 FIPS 端点。有关可用的 FIPS 端点的更多信息，请参阅《美国联邦信息处理标准（FIPS）第 140-3 版》[https://www.amazonaws.cn/compliance/fips/](https://www.amazonaws.cn/compliance/fips/)。

强烈建议您切勿将机密信息或敏感信息（如您客户的电子邮件地址）放入标签或自由格式文本字段（如**名称**字段）。这包括你使用控制台、API 或 Amazon Web Services 服务 使用 Step Functions Amazon CLI或其他方式时 Amazon SDKs。在用于名称的标签或自由格式文本字段中输入的任何数据都可能会用于计费或诊断日志。如果您向外部服务器提供 URL，强烈建议您不要在网址中包含凭证信息来验证对该服务器的请求。

使用客户托管 Amazon KMS 密钥，您可以**保护包括受保护健康信息 (PHI)** 在内的客户数据免遭未经授权的访问。Step Functions 与集成 CloudTrail，因此您可以在 CloudTrail 控制台中查看和审核事件历史记录中的最新事件。

**Topics**
+ [

# Step Functions 中的静态数据加密
](encryption-at-rest.md)
+ [

# Step Functions 中的传输中数据加密
](encryption-in-transit.md)

# Step Functions 中的静态数据加密
<a name="encryption-at-rest"></a>

**阅读博客**  
在 “使用客户管理的密钥[加强数据安全” 中了解客户管理 Amazon KMS 的](https://www.amazonaws.cn/blogs/compute/strengthening-data-security-in-aws-step-functions-with-a-customer-managed-aws-kms-key/)密钥

Amazon Step Functions 始终使用透明的服务器端加密来加密您的静态数据。默认情况下，静态数据加密可降低保护敏感数据的运营开销和复杂性。您可以构建符合严格加密合规性和法规要求的安全敏感型应用程序。

尽管您无法禁用此加密层或选择其他加密类型，但您可以在创建状态机和活动资源时选择客户管理的密钥，从而在现有 Amazon 拥有的加密密钥上添加第二层加密：
+ **客户托管密钥** — Step Functions 支持使用您创建、拥有和管理的对称客户托管密钥，以便在现有 Amazon 拥有的加密基础上添加第二层加密。由于您可以完全控制这层加密，因此可以执行以下任务：
  + 制定和维护关键策略
  + 建立和维护 IAM 策略和授权
  + 启用和禁用密钥策略
  + 轮换加密材料
  + 添加 标签
  + 创建密钥别名
  + 安排密钥删除

  有关信息，请参阅《Amazon Key Management Service 开发人员指南》**中的 [customer managed key](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#customer-cmk)。

您可以使用**客户管理的 Amazon Step Functions 状态机和活动密钥**对数据进行加密。在创建或更新**状态机**以及创建 Act **ivit** y 时，您可以配置对称 Amazon KMS 密钥和数据密钥的重复使用周期。执行历史记录和状态机定义将使用应用于状态机的密钥进行加密。活动输入将使用应用于活动的密钥进行加密。

使用客户托管 Amazon KMS 密钥，您可以**保护包括受保护健康信息 (PHI)** 在内的客户数据免遭未经授权的访问。Step Functions 与集成 CloudTrail，因此您可以在 CloudTrail 控制台中查看和审核事件历史记录中的最新事件。

有关信息 Amazon KMS，请参阅[什么是 Amazon Key Management Service？](https://docs.amazonaws.cn/kms/latest/developerguide/overview.html) 

**注意**  
Step Functions 使用 Amazon 自有密钥自动启用静态加密，不收取任何费用。但是，使用客户管理的密钥需要 Amazon KMS 付费。有关定价的信息，请参阅 [Amazon Key Management Service 定价](https://www.amazonaws.cn/kms/pricing/)。

## 使用客户自主管理型密钥进行加密
<a name="enable-custom-encryption"></a>

 Step Functions 使用您的客户托管 Amazon KMS 密钥解密负载数据，然后将其传递给其他服务以执行任务。数据在传输过程中使用传输层安全性协议（TLS）进行加密。

 当从集成服务返回数据时，Step Functions 会使用您的客户托管 Amazon KMS 密钥对数据进行加密。您可以使用相同的密钥对许多 Amazon 服务进行一致的加密。

可以将客户自主管理型密钥与以下资源结合使用：
+ **状态机**：标准和快速工作流程类型
+ **活动**

可以通过输入 **KMS 密钥 ID** 来指定数据密钥，Step Functions 使用该密钥来加密您的数据。
+ **KMS 密钥 ID** [— Amazon KMS 客户托管密钥的密钥标识符](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#key-id)，其形式为密钥 ID、密钥 ARN、别名或别名 ARN。

## 使用客户自主管理型密钥创建状态机
<a name="create-state-machine-with-cmk"></a>

**先决条件：**在使用客户托管 Amazon KMS 密钥创建状态机之前，您的用户或角色必须拥有`DescribeKey`和的 Amazon KMS 权限`GenerateDataKey`。

您可以在 Amazon 控制台中、通过 API 或通过 Amazon CloudFormation 资源配置基础设施来执行以下步骤。 （CloudFormation 示例将在本指南的后面部分介绍。）

### 步骤 1：创建 Amazon KMS 密钥
<a name="create-key"></a>

 您可以使用 Amazon KMS 控制台或 Amazon KMS APIs创建对称的客户托管密钥。

**创建对称的客户托管密钥**

按照**《Amazon Key Management Service 开发人员指南》中[创建对称的客户托管密钥](https://docs.amazonaws.cn/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)的步骤进行操作。

**注意**  
*可选*：创建密钥时，可以选择**密钥管理员**。选定的用户或角色将被授予管理密钥的权限，例如通过 API 启用或禁用密钥。也可以选择**密钥用户**。这些用户或角色将被授予在加密操作中使用 Amazon KMS 密钥的能力。

### 步骤 2：设置 Amazon KMS 密钥策略
<a name="create-key-policy"></a>

密钥政策控制对客户托管密钥的访问。每个客户托管式密钥必须只有一个密钥策略，其中包含确定谁可以使用密钥以及如何使用密钥的声明。创建客户托管式密钥时，可以指定密钥策略。有关信息，请参阅《Amazon Key Management Service 开发人员指南》**中的 [Managing access to customer managed keys](https://docs.amazonaws.cn/kms/latest/developerguide/control-access-overview.html#managing-access)。

以下是控制台中的 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](https://docs.amazonaws.cn/kms/latest/developerguide/control-access-overview.html#overview-policy-elements) 和 [troubleshooting key access](https://docs.amazonaws.cn/kms/latest/developerguide/policy-evaluation.html#example-no-iam) 的更多信息，请参阅《Amazon Key Management Service 开发人员指南》**。

### 步骤 3：添加密钥策略以加密 CloudWatch 日志
<a name="encrypt-logs"></a>

 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 日志组*（可选）*
<a name="encrypt-cloudwatch-log-group"></a>

您可以使用自己的密 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 日志组设置 Amazon KMS 密钥权限的更多信息，请参阅日志文档](https://docs.amazonaws.cn/AmazonCloudWatch/latest/logs/encrypt-log-data-kms.html#cmk-permissions)。

### 步骤 5：创建状态机
<a name="create-state-machine"></a>

创建密钥并设置策略后，可以使用该密钥来创建新的状态机。

创建状态机时，选择**其它配置**，然后选择使用客户自主管理型密钥进行加密。然后，可以选择密钥，并设置数据密钥的重用期（从 1 分钟到 15 分钟）。

或者，您可以通过设置日志级别并选择使用您的密 Amazon KMS 钥加密日志组来启用日志记录。

**注意**  
只能在 Step Functions 控制台中对**新的日志组**启用加密。要了解如何将 Amazon KMS 密钥与现有日志组关[联，请参阅将 Amazon KMS 密钥与日志组](https://docs.amazonaws.cn/AmazonCloudWatch/latest/logs/encrypt-log-data-kms.html#associate-cmk)关联。

要使用客户自主管理型密钥成功启动标准工作流程和异步快速工作流程的执行，您的执行角色需要 `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 密钥加密的状态机
<a name="invoke-encrypted-state-machine"></a>

可以像往常一样调用加密的状态机，而数据将使用客户自主管理型密钥进行加密。

## 使用客户自主管理型密钥创建活动
<a name="create-activity-with-cmk"></a>

使用客户自主管理型密钥创建 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 权限策略的范围
<a name="scope-down-kms-permission-policies-with-conditions"></a>

可以使用密钥策略和 IAM 策略中的*加密上下文* 作为 `conditions`，来控制对于对称客户自主管理型密钥的访问权限。要将 Amazon KMS 密钥的使用限制为代表特定角色从 Step Functions 发出的请求，您可以使用`kms:ViaService`条件。

### 使用加密上下文限定范围
<a name="stepfunctions-encryption-context"></a>

[加密上下文](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#encrypt_context)是一组可选的键值对，包含有关数据的其他上下文信息。

Amazon KMS 使用加密上下文作为其他经过身份验证的数据来支持经过身份验证的加密。当您在加密数据的请求中包含加密上下文时，会将加密上下文 Amazon KMS 绑定到加密数据。要解密数据，您必须在请求中包含相同的加密上下文。

Step Functions 提供了 Amazon KMS 加密操作中的加密上下文，其中密钥`aws:states:stateMachineArn``aws:states:activityArn`用于状态机或活动，值为资源[亚马逊资源名称](https://docs.amazonaws.cn/general/latest/gr/aws-arns-and-namespaces.html) (ARN)。

**Example**  

```
"encryptionContext": {"aws:states:stateMachineArn": "arn:aws:states:region:account-id:stateMachine:stateMachineName"}
```

**Example**  

```
"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
<a name="stepfunctions-via-service"></a>

`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 权限时才适用（例如`CreateStateMachine``CreateActivity``GetActivityTask`、、等）。向**执行角色**添加 `kms:ViaService` 条件，可能会阻止新的执行启动或导致正在运行的执行失败。

## API 调用方所需的权限
<a name="using-api-with-encryption-required-permissions"></a>

要调用返回加密数据的 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 用于加密配置的资源
<a name="cfn-resources-for-encryption-configuration"></a>

 Amazon CloudFormation Step Functions 的资源类型可以使用加密配置来配置状态机和活动资源。

 默认情况下，Step Functions 提供透明的服务器端加密。两者都[https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-activity.html](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/aws-resource-stepfunctions-activity.html)接受一个可选`EncryptionConfiguration`属性，该属性可以为服务器端加密配置客户托管 Amazon KMS 密钥。

**先决条件：**在使用客户托管 Amazon KMS 密钥创建状态机之前，您的用户或角色必须拥有`DescribeKey`和的 Amazon KMS 权限`GenerateDataKey`。

 更新到 StateMachine 需要[不中断](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-no-interrupt)。对活动资源的更新要求：[替换](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html#update-replacement)。

 要在 Amazon CloudFormation 模板中声明**`EncryptionConfiguration`**属性，请使用以下语法：

 **JSON**

```
{
  "KmsKeyId" : String,
  "KmsDataKeyReusePeriodSeconds" : Integer,
  "Type" : String
}
```

 **YAML**

```
KmsKeyId: String
KmsDataKeyReusePeriodSeconds: Integer
Type: String
```

 **属性**
+ **Type**：状态机或活动的加密选项。*允许的值*：`CUSTOMER_MANAGED_KMS_KEY` \$1 `AWS_OWNED_KEY`
+ **KmsKeyId**-加密数据密钥的对称加密密钥的别名、别名 ARN、密钥 ID 或 Amazon KMS 密钥 ARN。要在其他 Amazon 账户中指定 Amazon KMS 密钥，客户必须使用密钥 ARN 或别名 ARN。有关信息 kmsKeyId，请参阅 Amazon KMS 文档[KeyId](https://docs.amazonaws.cn/kms/latest/APIReference/API_DescribeKey.html#API_DescribeKey_RequestParameters)中的。
+ **KmsDataKeyReusePeriodSeconds**-SFN 重复使用数据密钥的最长持续时间。期限到期后，Step Functions 将调用 `GenerateDataKey`。只有当 **Type** 为 `CUSTOMER_MANAGED_KMS_KEY` 时，才能设置此设置。值的范围可以介于 60-900 秒之间。默认为 300 秒。

### Amazon CloudFormation 例子
<a name="cfn-examples"></a>

#### 示例： StateMachine 使用客户托管密钥
<a name="statemachine-with-managed-key"></a>

```
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
```

#### 示例：使用客户自主管理型密钥的活动
<a name="activity-with-managed-key"></a>

```
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
```

#### 更新活动的加密要求创建新资源
<a name="updating-encryption-for-an-activity-requires-creating-a-new-resource"></a>

 活动配置是不可变的，并且资源名称必须唯一。要设置客户自主管理型密钥来进行加密，必须创建**新活动**。如果您尝试在 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
```

## 监控加密密钥使用情况
<a name="monitoring-encryption-keys"></a>

当您使用 Amazon KMS 客户托管密钥加密您的 Step Functions 资源时，您可以使用 CloudTrail来跟踪 Step Functions 发送到的请求 Amazon KMS。

您还可以在审核记录和日志中使用加密上下文来确定客户托管密钥的使用情况。加密上下文也会显示在 [Amazon CloudTrail](https://docs.amazonaws.cn/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) 生成的日志中。

以下示例是`Decrypt``DescribeKey`、和`GenerateDataKey`监控 Step Functions 为访问由客户托管密钥加密的数据而调用的 Amazon KMS 操作 CloudTrail 的事件：

------
#### [ Decrypt ]

当您访问加密的状态机或活动时，Step Functions 会调用 `Decrypt` 操作，以便使用存储的加密数据密钥来访问加密的数据。

以下示例事件记录了 `Decrypt` 操作：

```
{
  "eventVersion": "1.09",
  "userIdentity": {
    "type": "AssumedRole",
    "principalId": "111122223333:Sampleuser01",
    "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01",
    "accountId": "111122223333",
    "accessKeyId": "ASIAIOSFODNN7EXAMPLE",
    "sessionContext": {
      "sessionIssuer": {
        "type": "Role",
        "principalId": "111122223333:Sampleuser01",
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01",
        "accountId": "111122223333",
        "userName": "Admin"
      },
      "attributes": {
        "creationDate": "2024-07-05T21:06:27Z",
        "mfaAuthenticated": "false"
      }
    },
    "invokedBy": "states.amazonaws.com"
  },
  "eventTime": "2024-07-05T21:12:21Z",
  "eventSource": "kms.amazonaws.com",
  "eventName": "Decrypt",
  "awsRegion": "aa-example-1",
  "sourceIPAddress": "states.amazonaws.com",
  "userAgent": "states.amazonaws.com",
  "requestParameters": {
        "encryptionAlgorithm": "SYMMETRIC_DEFAULT",
        "keyId": "arn:aws:kms:aa-example-1:111122223333:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
        "encryptionContext": {
            "aws:states:stateMachineArn": "arn:aws:states:aa-example-1:111122223333:stateMachine:example1"
        }
    },
    "responseElements": null,
    "requestID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE",
    "eventID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE",
    "readOnly": true,
    "resources": [
        {
            "accountId": "111122223333",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:aa-example-1:111122223333:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "111122223333",
    "eventCategory": "Management"
}
```

------
#### [ DescribeKey ]

Step Functions 使用 `DescribeKey` 操作，来验证与状态机或活动关联的 Amazon KMS 客户自主管理型密钥是否存在于账户和区域中。

以下示例事件记录了 `DescribeKey` 操作：

```
{
  "eventVersion": "1.09",
  "userIdentity": {
    "type": "AssumedRole",
    "principalId": "111122223333:Sampleuser01",
    "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01",
    "accountId": "111122223333",
    "accessKeyId": "ASIAIOSFODNN7EXAMPLE",
    "sessionContext": {
      "sessionIssuer": {
        "type": "Role",
        "principalId": "111122223333:Sampleuser01",
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01",
        "accountId": "111122223333",
        "userName": "Admin"
      },
      "attributes": {
        "creationDate": "2024-07-05T21:06:27Z",
        "mfaAuthenticated": "false"
      }
    },
    "invokedBy": "states.amazonaws.com"
  },
  "eventTime": "2024-07-05T21:12:21Z",
  "eventSource": "kms.amazonaws.com",
  "eventName": "DescribeKey",
  "awsRegion": "aa-example-1",
  "sourceIPAddress": "states.amazonaws.com",
  "userAgent": "states.amazonaws.com",
  "requestParameters": {
    "keyId": "arn:aws:kms:aa-example-1:111122223333:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
  },
  "responseElements": null,
  "requestID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE",
  "eventID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE",
  "readOnly": true,
  "resources": [
    {
      "accountId": "111122223333",
      "type": "AWS::KMS::Key",
      "ARN": "arn:aws:kms:aa-example-1:111122223333:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
    }
  ],
  "eventType": "AwsApiCall",
  "managementEvent": true,
  "recipientAccountId": "111122223333",
  "eventCategory": "Management",
  "sessionCredentialFromConsole": "true"
}
```

------
#### [ GenerateDataKey ]

当您为状态机或活动启用 Amazon KMS 客户托管密钥时，Step Functions 会发送`GenerateDataKey`请求以获取加密状态机定义或执行数据的数据密钥。

以下示例事件记录了 `GenerateDataKey` 操作：

```
{
  "eventVersion": "1.09",
  "userIdentity": {
    "type": "AssumedRole",
    "principalId": "111122223333:Sampleuser01",
    "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01",
    "accountId": "111122223333",
    "accessKeyId": "ASIAIOSFODNN7EXAMPLE",
    "sessionContext": {
      "sessionIssuer": {
        "type": "Role",
        "principalId": "111122223333:Sampleuser01",
        "arn": "arn:aws:iam::111122223333:role/Admin",
        "accountId": "111122223333",
        "userName": "Admin"
      },
      "attributes": {
        "creationDate": "2024-07-05T21:06:27Z",
        "mfaAuthenticated": "false"
      }
    },
    "invokedBy": "states.amazonaws.com"
  },
  "eventTime": "2024-07-05T21:12:21Z",
  "eventSource": "kms.amazonaws.com",
  "eventName": "GenerateDataKey",
  "awsRegion": "aa-example-1",
  "sourceIPAddress": "states.amazonaws.com",
  "userAgent": "states.amazonaws.com",
  "requestParameters": {
    "keySpec": "AES_256",
    "encryptionContext": {
      "aws:states:stateMachineArn": "arn:aws:states:aa-example-1:111122223333:stateMachine:example1"
    },
    "keyId": "arn:aws:kms:aa-example-1:111122223333:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
  },
  "responseElements": null,
  "requestID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE",
  "eventID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE",
  "readOnly": true,
  "resources": [
    {
      "accountId": "111122223333",
      "type": "AWS::KMS::Key",
      "ARN": "arn:aws:kms:aa-example-1:111122223333:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
    }
  ],
  "eventType": "AwsApiCall",
  "managementEvent": true,
  "recipientAccountId": "111122223333",
  "eventCategory": "Management"
}
```

------

## FAQs
<a name="faqs"></a>

### 如果我的密钥在 Amazon KMS中标记为待删除或已被删除，会发生什么？
<a name="what-happens-if-my-key-is-marked-for-deletion-or-deleted-in-kms-"></a>

 如果密钥在中被删除或标记为删除 Amazon KMS，则任何相关的运行执行都将失败。在您移除或更改与工作流程关联的密钥之前，无法开始新的执行。***删除 Amazon KMS 密钥后，与工作流程执行相关的所有加密数据都将保持加密状态，无法再解密，从而使数据无法恢复。***

### 如果 Amazon KMS 密钥在中被禁用会 Amazon KMS怎样？
<a name="what-happens-if-a-kms-key-is-disabled-in-kms-"></a>

 如果在中禁用了 Amazon KMS 密钥 Amazon KMS，则任何相关的运行执行都将失败。无法启动新的执行。在重新启用该禁用密 Amazon KMS 钥之前，您无法再解密使用该禁用密钥加密的数据。

### 发送到的执行状态变更事件会怎 EventBridge样？
<a name="what-happens-to-execution-status-change-events-sent-to-ev-"></a>

 使用您的客户托管 Amazon KMS 密钥加密的工作流程的执行状态更改事件将不包括执行输入、输出、错误和原因。

## 了解详情
<a name="learn-more-data-at-rest-encryption"></a>

有关静态数据加密的信息，请参阅《Amazon Key Management Service 开发人员指南》**中的 [Amazon Key Management Service concepts](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html) 和 [security best practices for Amazon Key Management Service](https://docs.amazonaws.cn/kms/latest/developerguide/best-practices.html)。

# Step Functions 中的传输中数据加密
<a name="encryption-in-transit"></a>

Step Functions 加密服务与其他集成 Amazon 服务之间的传输中数据（请参阅[将服务与 Step Functions 集成](integrate-services.md)）。Step Functions 和集成服务之间传递的所有数据均使用传输层安全性协议 (TLS) 进行加密。

# Step Functions 中的 Identity and Access Management
<a name="auth-and-access-control-sfn"></a>

以下部分提供了有关如何使用 [Amazon Identity and Access Management (IAM)](https://docs.amazonaws.cn/IAM/latest/UserGuide/introduction.html) 和 Step Functions 通过控制访问您的资源的人员以保护这些资源的详细信息：例如，您将学习如何提供 Amazon Step Functions 具有 Amazon 资源访问权限的证书，例如从其他 Amazon 资源检索事件数据。

Amazon Identity and Access Management (IAM) Amazon Web Services 服务 可帮助管理员安全地控制对 Amazon 资源的访问权限。IAM 管理员控制可以*通过身份验证*（登录）和*授权*（具有权限）使用 Step Functions 资源的人员。您可以使用 IAM Amazon Web Services 服务 ，无需支付额外费用。

## 受众
<a name="security_iam_audience"></a>

您的使用方式 Amazon Identity and Access Management (IAM) 因您的角色而异：
+ **服务用户**：如果您无法访问功能，请从管理员处请求权限（请参阅[在 Step Functions 中排查身份和访问权限问题](security_iam_troubleshoot.md)）
+ **服务管理员**：确定用户访问权限并提交权限请求（请参阅[如何 Amazon Step Functions 与 IAM 配合使用](security_iam_service-with-iam.md)）
+ **IAM 管理员**：编写用于管理访问权限的策略（请参阅[基于身份的策略示例 Amazon Step Functions](security_iam_id-based-policy-examples.md)）

## 使用身份进行身份验证
<a name="security_iam_authentication"></a>

身份验证是您 Amazon 使用身份凭证登录的方式。您必须以 IAM 用户身份进行身份验证 Amazon Web Services 账户根用户，或者通过担任 IAM 角色进行身份验证。

对于编程访问， Amazon 提供 SDK 和 CLI 来对请求进行加密签名。有关更多信息，请参阅*《IAM 用户指南》*中的[适用于 API 请求的Amazon 签名版本 4](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_sigv.html)。

### Amazon Web Services 账户 root 用户
<a name="security_iam_authentication-rootuser"></a>

 创建时 Amazon Web Services 账户，首先会有一个名为 Amazon Web Services 账户 *root 用户的*登录身份，该身份可以完全访问所有资源 Amazon Web Services 服务 和资源。我们强烈建议不要使用根用户进行日常任务。有关需要根用户凭证的任务，请参阅《IAM 用户指南》**中的[需要根用户凭证的任务](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)。

### 联合身份
<a name="security_iam_authentication-federated"></a>

作为最佳实践，要求人类用户使用与身份提供商的联合身份验证才能 Amazon Web Services 服务 使用临时证书进行访问。

*联合身份是指*来自您的企业目录、Web 身份提供商的用户 Amazon Directory Service ，或者 Amazon Web Services 服务 使用来自身份源的凭据进行访问的用户。联合身份代入可提供临时凭证的角色。

### IAM 用户和群组
<a name="security_iam_authentication-iamuser"></a>

*[IAM 用户](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_users.html)*是对某个人员或应用程序具有特定权限的一个身份。建议使用临时凭证，而非具有长期凭证的 IAM 用户。有关更多信息，请参阅 *IAM 用户指南*[中的要求人类用户使用身份提供商的联合身份验证才能 Amazon 使用临时证书进行访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp)。

[https://docs.amazonaws.cn/IAM/latest/UserGuide/id_groups.html](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_groups.html)指定一组 IAM 用户，便于更轻松地对大量用户进行权限管理。有关更多信息，请参阅*《IAM 用户指南》*中的 [IAM 用户使用案例](https://docs.amazonaws.cn/IAM/latest/UserGuide/gs-identities-iam-users.html)。

### IAM 角色
<a name="security_iam_authentication-iamrole"></a>

*[IAM 角色](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles.html)*是具有特定权限的身份，可提供临时凭证。您可以通过[从用户切换到 IAM 角色（控制台）](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_use_switch-role-console.html)或调用 Amazon CLI 或 Amazon API 操作来代入角色。有关更多信息，请参阅《IAM 用户指南》**中的[担任角色的方法](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_manage-assume.html)。

IAM 角色对于联合用户访问、临时 IAM 用户权限、跨账户访问、跨服务访问以及在 Amazon EC2 上运行的应用程序非常有用。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的跨账户资源访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

## 使用策略管理访问
<a name="security_iam_access-manage"></a>

您可以 Amazon 通过创建策略并将其附加到 Amazon 身份或资源来控制中的访问权限。策略定义了与身份或资源关联时的权限。 Amazon 在委托人提出请求时评估这些政策。大多数策略都以 JSON 文档的 Amazon 形式存储在中。有关 JSON 策略文档的更多信息，请参阅*《IAM 用户指南》*中的 [JSON 策略概述](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies.html#access_policies-json)。

管理员使用策略，通过定义哪个**主体**可以在什么**条件**下对哪些**资源**执行哪些**操作**来指定谁有权访问什么。

默认情况下，用户和角色没有权限。IAM 管理员创建 IAM 策略并将其添加到角色中，然后用户可以担任这些角色。IAM 策略定义权限，与执行操作所用的方法无关。

### 基于身份的策略
<a name="security_iam_access-manage-id-based-policies"></a>

基于身份的策略是您附加到身份（用户、组或角色）的 JSON 权限策略文档。这些策略控制身份可以执行什么操作、对哪些资源执行以及在什么条件下执行。要了解如何创建基于身份的策略，请参阅《IAM 用户指南》**中的[使用客户管理型策略定义自定义 IAM 权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_create.html)。

基于身份的策略可以是*内联策略*（直接嵌入到单个身份中）或*托管策略*（附加到多个身份的独立策略）。要了解如何在托管策略和内联策略之间进行选择，请参阅*《IAM 用户指南》*中的[在托管策略与内联策略之间进行选择](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies-choosing-managed-or-inline.html)。

### 基于资源的策略
<a name="security_iam_access-manage-resource-based-policies"></a>

基于资源的策略是附加到资源的 JSON 策略文档。示例包括 IAM *角色信任策略*和 Amazon S3 *存储桶策略*。在支持基于资源的策略的服务中，服务管理员可以使用它们来控制对特定资源的访问。您必须在基于资源的策略中[指定主体](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_principal.html)。

基于资源的策略是位于该服务中的内联策略。您不能在基于资源的策略中使用 IAM 中的 Amazon 托管策略。

### 其他策略类型
<a name="security_iam_access-manage-other-policies"></a>

Amazon 支持其他策略类型，这些策略类型可以设置更常见的策略类型授予的最大权限：
+ **权限边界** – 设置基于身份的策略可以授予 IAM 实体的最大权限。有关更多信息，请参阅《 IAM 用户指南》**中的 [IAM 实体的权限边界](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_boundaries.html)。
+ **服务控制策略 (SCPs)**-在中指定组织或组织单位的最大权限 Amazon Organizations。有关更多信息，请参阅《Amazon Organizations 用户指南》**中的[服务控制策略](https://docs.amazonaws.cn/organizations/latest/userguide/orgs_manage_policies_scps.html)。
+ **资源控制策略 (RCPs)**-设置账户中资源的最大可用权限。有关更多信息，请参阅《*Amazon Organizations 用户指南》*中的[资源控制策略 (RCPs)](https://docs.amazonaws.cn/organizations/latest/userguide/orgs_manage_policies_rcps.html)。
+ **会话策略** – 在为角色或联合用户创建临时会话时，作为参数传递的高级策略。有关更多信息，请参阅《IAM 用户指南》**中的[会话策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies.html#policies_session)。

### 多个策略类型
<a name="security_iam_access-manage-multiple-policies"></a>

当多个类型的策略应用于一个请求时，生成的权限更加复杂和难以理解。要了解在涉及多种策略类型时如何 Amazon 确定是否允许请求，请参阅 *IAM 用户指南*中的[策略评估逻辑](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)。

## 访问控制
<a name="access-control-sfn"></a>

您可以使用有效的凭证来对自己的请求进行身份验证，但您还必须拥有权限才能创建或访问 Step Functions 资源。例如，您必须有权调用 Amazon Lambda与您的 Step Functions 规则关联的亚马逊简单通知服务 (Amazon SNS) 和亚马逊简单队列服务 (Amazon SQS) 目标。

下面几节介绍如何管理 Step Functions 的权限。
+ [在 Step Functions 中为状态机创建 IAM 角色](procedure-create-iam-role.md)
+ [在 Step Functions 中为非管理员用户创建精细权限](concept-create-iam-advanced.md)
+ [为 Step Functions 创建 Amazon VPC 端点](vpc-endpoints.md)
+ [Step Functions 如何为集成服务生成 IAM 策略](service-integration-iam-templates.md)
+ [使用分布式 Map 状态的 IAM 策略](iam-policies-eg-dist-map.md)

# 如何 Amazon Step Functions 与 IAM 配合使用
<a name="security_iam_service-with-iam"></a>

在使用 IAM 来管理对 Step Functions 的访问之前，您应该了解哪些 IAM 特征可与 Step Functions 一起使用。

下表列出了您可以与之配合使用的 IAM 功能 Amazon Step Functions：


| IAM 功能 | Step Functions 支持 | 
| --- | --- | 
|  [基于身份的策略](#security_iam_service-with-iam-id-based-policies)  |   是  | 
|  [基于资源的策略](#security_iam_service-with-iam-resource-based-policies)  |   否   | 
|  [策略操作](#security_iam_service-with-iam-id-based-policies-actions)  |   是  | 
|  [策略资源](#security_iam_service-with-iam-id-based-policies-resources)  |   是  | 
|  [策略条件键（特定于服务）](#security_iam_service-with-iam-id-based-policies-conditionkeys)  |   是  | 
|  [ACLs](#security_iam_service-with-iam-acls)  |   否   | 
|  [ABAC（策略中的标签）](#security_iam_service-with-iam-tags)  |   部分  | 
|  [临时凭证](#security_iam_service-with-iam-roles-tempcreds)  |   是  | 
|  [主体权限](#security_iam_service-with-iam-principal-permissions)  |   是  | 
|  [服务角色](#security_iam_service-with-iam-roles-service)  |   是  | 
|  [服务关联角色](#security_iam_service-with-iam-roles-service-linked)  |   否   | 

要全面了解 Step Functions 和其他 Amazon 服务如何与大多数 IAM 功能配合使用，请参阅 [IAM *用户指南中与 IAM* 配合使用的Amazon 服务](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)。

## Step Functions 基于身份的策略
<a name="security_iam_service-with-iam-id-based-policies"></a>

**支持基于身份的策略：**是

基于身份的策略是可附加到身份（如 IAM 用户、用户组或角色）的 JSON 权限策略文档。这些策略控制用户和角色可在何种条件下对哪些资源执行哪些操作。要了解如何创建基于身份的策略，请参阅《IAM 用户指南》**中的[使用客户管理型策略定义自定义 IAM 权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_create.html)。

通过使用 IAM 基于身份的策略，您可以指定允许或拒绝的操作和资源以及允许或拒绝操作的条件。要了解可在 JSON 策略中使用的所有元素，请参阅《IAM 用户指南》**中的 [IAM JSON 策略元素引用](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements.html)。

### Step Functions 基于身份的策略示例
<a name="security_iam_service-with-iam-id-based-policies-examples"></a>

要查看 Step Functions 基于身份的策略的示例，请参阅 [基于身份的策略示例 Amazon Step Functions](security_iam_id-based-policy-examples.md)。

## Step Functions 内基于资源的策略
<a name="security_iam_service-with-iam-resource-based-policies"></a>

**支持基于资源的策略：**否 

基于资源的策略是附加到资源的 JSON 策略文档。基于资源的策略的示例包括 IAM *角色信任策略*和 Amazon S3 *存储桶策略*。在支持基于资源的策略的服务中，服务管理员可以使用它们来控制对特定资源的访问。对于在其中附加策略的资源，策略定义指定主体可以对该资源执行哪些操作以及在什么条件下执行。您必须在基于资源的策略中[指定主体](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_principal.html)。委托人可以包括账户、用户、角色、联合用户或 Amazon Web Services 服务。

要启用跨账户访问，您可以将整个账户或其他账户中的 IAM 实体指定为基于资源的策略中的主体。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的跨账户资源访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

## Step Functions 的策略操作
<a name="security_iam_service-with-iam-id-based-policies-actions"></a>

**支持策略操作：**是

管理员可以使用 Amazon JSON 策略来指定谁有权访问什么。也就是说，哪个**主体**可以对什么**资源**执行**操作**，以及在什么**条件**下执行。

JSON 策略的 `Action` 元素描述可用于在策略中允许或拒绝访问的操作。在策略中包含操作以授予执行关联操作的权限。

要查看 Step Functions 操作列表，请参阅**《服务授权参考》中的 [Amazon Step Functions定义的资源](https://docs.amazonaws.cn/IAM/latest/UserGuide/list_awsstepfunctions.html)。

Step Functions 中的策略操作在操作前面使用以下前缀：

```
states
```

要在单个语句中指定多项操作，请使用逗号将它们隔开。

```
"Action": [
          "states:action1",
          "states:action2"
             ]
```

要查看 Step Functions 基于身份的策略的示例，请参阅 [基于身份的策略示例 Amazon Step Functions](security_iam_id-based-policy-examples.md)。

## Step Functions 的策略资源
<a name="security_iam_service-with-iam-id-based-policies-resources"></a>

**支持策略资源：**是

管理员可以使用 Amazon JSON 策略来指定谁有权访问什么。也就是说，哪个**主体**可以对什么**资源**执行**操作**，以及在什么**条件**下执行。

`Resource` JSON 策略元素指定要向其应用操作的一个或多个对象。作为最佳实践，请使用其 [Amazon 资源名称（ARN）](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference-arns.html)指定资源。对于不支持资源级权限的操作，请使用通配符 (\$1) 指示语句应用于所有资源。

```
"Resource": "*"
```

要查看 Step Functions 资源类型及其类型列表 ARNs，请参阅《*服务授权参考*》 Amazon Step Functions中[定义的操作](https://docs.amazonaws.cn/IAM/latest/UserGuide/list_awsstepfunctions.html)。要了解您可以在哪些操作中指定每个资源的 ARN，请参阅 [Amazon Step Functions定义的资源](https://docs.amazonaws.cn/IAM/latest/UserGuide/list_awsstepfunctions.html)。

要查看 Step Functions 基于身份的策略的示例，请参阅 [基于身份的策略示例 Amazon Step Functions](security_iam_id-based-policy-examples.md)。

## Step Functions 的策略条件键
<a name="security_iam_service-with-iam-id-based-policies-conditionkeys"></a>

**支持特定于服务的策略条件键：**是

管理员可以使用 Amazon JSON 策略来指定谁有权访问什么。也就是说，哪个**主体**可以对什么**资源**执行**操作**，以及在什么**条件**下执行。

`Condition` 元素根据定义的条件指定语句何时执行。您可以创建使用[条件运算符](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html)（例如，等于或小于）的条件表达式，以使策略中的条件与请求中的值相匹配。要查看所有 Amazon 全局条件键，请参阅 *IAM 用户指南*中的[Amazon 全局条件上下文密钥](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html)。

要查看 Step Functions 条件密钥列表，请参阅《服务授权参考》**中的 [Amazon Step Functions的条件密钥](https://docs.amazonaws.cn/IAM/latest/UserGuide/list_awsstepfunctions.html)。要了解可以使用条件键的操作和资源，请参阅[由定义的资源 Amazon Step Functions](https://docs.amazonaws.cn/IAM/latest/UserGuide/list_awsstepfunctions.html)。

 如果策略必须依赖于 Step Functions 服务主体名称，我们建议在 `aws:PrincipalServiceNamesList` [多值上下文键](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-single-vs-multi-valued-context-keys.html#reference_policies_condition-multi-valued-context-keys)，而不是在 `aws:PrincipalServiceName` 条件键中检查 `states.amazonaws.com` 是否存在。`aws:PrincipalServiceName` 条件键仅包含服务主体名称列表中的一个条目，并且该条目不一定是 `states.amazonaws.com`。以下条件块演示了检查 `states.amazonaws.com` 是否存在的过程。

```
{
    "Condition": {
        "ForAnyValue:StringEquals": {
            "aws:PrincipalServiceNamesList": "states.amazonaws.com"
        }
    }
}
```

要查看 Step Functions 基于身份的策略的示例，请参阅 [基于身份的策略示例 Amazon Step Functions](security_iam_id-based-policy-examples.md)。

## ACLs 在 Step Functions
<a name="security_iam_service-with-iam-acls"></a>

**支持 ACLs：**否 

访问控制列表 (ACLs) 控制哪些委托人（账户成员、用户或角色）有权访问资源。 ACLs 与基于资源的策略类似，尽管它们不使用 JSON 策略文档格式。

## ABAC 和 Step Functions
<a name="security_iam_service-with-iam-tags"></a>

**支持 ABAC（策略中的标签）：**部分支持

基于属性的访问权限控制（ABAC）是一种授权策略，该策略基于称为标签的属性来定义权限。您可以将标签附加到 IAM 实体和 Amazon 资源，然后设计 ABAC 策略以允许在委托人的标签与资源上的标签匹配时进行操作。

要基于标签控制访问，您需要使用 `aws:ResourceTag/key-name``aws:RequestTag/key-name` 或 `aws:TagKeys` 条件键在策略的[条件元素](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_condition.html)中提供标签信息。

如果某个服务对于每种资源类型都支持所有这三个条件键，则对于该服务，该值为**是**。如果某个服务仅对于部分资源类型支持所有这三个条件键，则该值为**部分**。

有关 ABAC 的更多信息，请参阅《IAM 用户指南》**中的[使用 ABAC 授权定义权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)。要查看设置 ABAC 步骤的教程，请参阅《IAM 用户指南》**中的[使用基于属性的访问权限控制（ABAC）](https://docs.amazonaws.cn/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html)。

## 将临时凭证与 Step Functions 结合使用
<a name="security_iam_service-with-iam-roles-tempcreds"></a>

**支持临时凭证：**是

临时证书提供对 Amazon 资源的短期访问权限，并且是在您使用联合身份或切换角色时自动创建的。 Amazon 建议您动态生成临时证书，而不是使用长期访问密钥。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的临时安全凭证](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_credentials_temp.html)和[使用 IAM 的。Amazon Web Services 服务](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)

## Step Functions 的跨服务主体权限
<a name="security_iam_service-with-iam-principal-permissions"></a>

**支持转发访问会话（FAS）：**是

 转发访问会话 (FAS) 使用调用主体的权限 Amazon Web Services 服务，再加上 Amazon Web Services 服务 向下游服务发出请求的请求。有关发出 FAS 请求时的策略详情，请参阅[转发访问会话](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_forward_access_sessions.html)。

## Step Functions 的服务角色
<a name="security_iam_service-with-iam-roles-service"></a>

**支持服务角色：**是

 服务角色是由一项服务担任、代表您执行操作的 [IAM 角色](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles.html)。IAM 管理员可以在 IAM 中创建、修改和删除服务角色。有关更多信息，请参阅《IAM 用户指南》**中的[创建向 Amazon Web Services 服务委派权限的角色](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_create_for-service.html)。

**警告**  
更改服务角色的权限可能会破坏 Step Functions 的功能。仅当 Step Functions 提供相关指导时才编辑服务角色。

## Step Functions 的服务相关角色
<a name="security_iam_service-with-iam-roles-service-linked"></a>

**支持服务相关角色：**否 

 服务相关角色是一种链接到的服务角色。 Amazon Web Services 服务服务可以代入代表您执行操作的角色。服务相关角色出现在您的中 Amazon Web Services 账户 ，并且归服务所有。IAM 管理员可以查看但不能编辑服务关联角色的权限。

有关创建或管理服务相关角色的详细信息，请参阅[能够与 IAM 搭配使用的Amazon 服务](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)。在表中查找**服务相关角色**列中包含 `Yes` 的表。选择**是**链接以查看该服务的服务相关角色文档。

# 基于身份的策略示例 Amazon Step Functions
<a name="security_iam_id-based-policy-examples"></a>

默认情况下，用户和角色没有创建或修改 Step Functions 资源的权限。要授予用户对所需资源执行操作的权限，IAM 管理员可以创建 IAM 策略。

要了解如何使用这些示例 JSON 策略文档创建基于 IAM 身份的策略，请参阅《IAM 用户指南》**中的[创建 IAM 策略（控制台）](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_create-console.html)。

有关 Step Functions 定义的操作和资源类型（包括每种资源类型的格式）的详细信息，请参阅《*服务授权参考*》 Amazon Step Functions中的[操作、资源和条件密钥](https://docs.amazonaws.cn/IAM/latest/UserGuide/list_awsstepfunctions.html)。 ARNs 

**Topics**
+ [

## 策略最佳实践
](#security_iam_service-with-iam-policy-best-practices)
+ [

## 使用 Step Functions 控制台
](#security_iam_id-based-policy-examples-console)
+ [

## 允许用户查看他们自己的权限
](#security_iam_id-based-policy-examples-view-own-permissions)

## 策略最佳实践
<a name="security_iam_service-with-iam-policy-best-practices"></a>

基于身份的策略确定某个人是否可以创建、访问或删除您账户中的 Step Functions 资源。这些操作可能会使 Amazon Web Services 账户产生成本。创建或编辑基于身份的策略时，请遵循以下指南和建议：
+ **开始使用 Amazon 托管策略并转向最低权限权限** — 要开始向用户和工作负载授予权限，请使用为许多常见用例授予权限的*Amazon 托管策略*。它们在你的版本中可用 Amazon Web Services 账户。我们建议您通过定义针对您的用例的 Amazon 客户托管策略来进一步减少权限。有关更多信息，请参阅《IAM 用户指南》**中的 [Amazon 托管策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)或[工作职能的Amazon 托管策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_job-functions.html)。
+ **应用最低权限**：在使用 IAM 策略设置权限时，请仅授予执行任务所需的权限。为此，您可以定义在特定条件下可以对特定资源执行的操作，也称为*最低权限许可*。有关使用 IAM 应用权限的更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的策略和权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies.html)。
+ **使用 IAM 策略中的条件进一步限制访问权限**：您可以向策略添加条件来限制对操作和资源的访问。例如，您可以编写策略条件来指定必须使用 SSL 发送所有请求。如果服务操作是通过特定 Amazon Web Services 服务的（例如）使用的，则也可以使用条件来授予对服务操作的访问权限 Amazon CloudFormation。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM JSON 策略元素：条件](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_condition.html)。
+ **使用 IAM Access Analyzer 验证您的 IAM 策略，以确保权限的安全性和功能性**：IAM Access Analyzer 会验证新策略和现有策略，以确保策略符合 IAM 策略语言（JSON）和 IAM 最佳实践。IAM Access Analyzer 提供 100 多项策略检查和可操作的建议，以帮助您制定安全且功能性强的策略。有关更多信息，请参阅《IAM 用户指南》**中的[使用 IAM Access Analyzer 验证策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access-analyzer-policy-validation.html)。
+ **需要多重身份验证 (MFA**)-如果 Amazon Web Services 账户您的场景需要 IAM 用户或根用户，请启用 MFA 以提高安全性。若要在调用 API 操作时需要 MFA，请将 MFA 条件添加到您的策略中。有关更多信息，请参阅《IAM 用户指南》**中的[使用 MFA 保护 API 访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html)。

有关 IAM 中的最佳实操的更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的安全最佳实践](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)。

## 使用 Step Functions 控制台
<a name="security_iam_id-based-policy-examples-console"></a>

要访问 Amazon Step Functions 控制台，您必须拥有一组最低权限。这些权限必须允许您列出和查看中有关 Step Functions 资源的详细信息 Amazon Web Services 账户。如果创建比必需的最低权限更为严格的基于身份的策略，对于附加了该策略的实体（用户或角色），控制台将无法按预期正常运行。

对于仅调用 Amazon CLI 或 Amazon API 的用户，您无需为其设置最低控制台权限。相反，只允许访问与其尝试执行的 API 操作相匹配的操作。

为确保用户和角色仍然可以使用 Step Functions 控制台，还要将 Step Function `ReadOnly` Amazon s `ConsoleAccess` 或托管策略附加到实体。有关更多信息，请参阅《IAM 用户指南》**中的[为用户添加权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console)。

## 允许用户查看他们自己的权限
<a name="security_iam_id-based-policy-examples-view-own-permissions"></a>

该示例说明了您如何创建策略，以允许 IAM 用户查看附加到其用户身份的内联和托管式策略。此策略包括在控制台上或使用 Amazon CLI 或 Amazon API 以编程方式完成此操作的权限。

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ViewOwnUserInfo",
            "Effect": "Allow",
            "Action": [
                "iam:GetUserPolicy",
                "iam:ListGroupsForUser",
                "iam:ListAttachedUserPolicies",
                "iam:ListUserPolicies",
                "iam:GetUser"
            ],
            "Resource": ["arn:aws:iam::*:user/${aws:username}"]
        },
        {
            "Sid": "NavigateInConsole",
            "Effect": "Allow",
            "Action": [
                "iam:GetGroupPolicy",
                "iam:GetPolicyVersion",
                "iam:GetPolicy",
                "iam:ListAttachedGroupPolicies",
                "iam:ListGroupPolicies",
                "iam:ListPolicyVersions",
                "iam:ListPolicies",
                "iam:ListUsers"
            ],
            "Resource": "*"
        }
    ]
}
```

# Amazon 的托管策略 Amazon Step Functions
<a name="security-iam-awsmanpol"></a>





 Amazon 托管策略是由创建和管理的独立策略 Amazon。 Amazon 托管策略旨在为许多常见用例提供权限，以便您可以开始为用户、组和角色分配权限。

请记住， Amazon 托管策略可能不会为您的特定用例授予最低权限权限，因为它们可供所有 Amazon 客户使用。我们建议通过定义特定于使用案例的[客户管理型策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies)来进一步减少权限。

您无法更改 Amazon 托管策略中定义的权限。如果 Amazon 更新 Amazon 托管策略中定义的权限，则更新会影响该策略所关联的所有委托人身份（用户、组和角色）。 Amazon 最有可能在启动新的 API 或现有服务可以使用新 Amazon Web Services 服务 的 API 操作时更新 Amazon 托管策略。

有关更多信息，请参阅《IAM 用户指南》**中的 [Amazon 托管式策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)。









## Amazon 托管策略： AWSStepFunctionsConsoleFullAccess
<a name="security-iam-awsmanpol-AWSStepFunctionsConsoleFullAccess"></a>

您可以将 [https://docs.amazonaws.cn/aws-managed-policy/latest/reference/AWSStepFunctionsConsoleFullAccess.html](https://docs.amazonaws.cn/aws-managed-policy/latest/reference/AWSStepFunctionsConsoleFullAccess.html) 策略附加到 IAM 身份。

此策略授予的*administrator*权限允许用户访问 Step Functions 控制台。要获得完整的控制台体验，用户可能还需要该服务可以担任的其他 IAM 角色的 iam: PassRole 权限。

## Amazon 托管策略： AWSStepFunctionsReadOnlyAccess
<a name="security-iam-awsmanpol-AWSStepFunctionsReadOnlyAccess"></a>

您可以将 [https://docs.amazonaws.cn/aws-managed-policy/latest/reference/AWSStepFunctionsReadOnlyAccess.html](https://docs.amazonaws.cn/aws-managed-policy/latest/reference/AWSStepFunctionsReadOnlyAccess.html) 策略附加到 IAM 身份。

此策略授予的*read-only*权限允许用户或角色列出和描述状态机、活动、执行、活动 MapRuns、标签以及状态机别名和版本。此策略还授予检查您提供的状态机定义语法的权限。

## Amazon 托管策略： AWSStepFunctionsFullAccess
<a name="security-iam-awsmanpol-AWSStepFunctionsFullAccess"></a>

您可以将 [https://docs.amazonaws.cn/aws-managed-policy/latest/reference/AWSStepFunctionsFullAccess.html](https://docs.amazonaws.cn/aws-managed-policy/latest/reference/AWSStepFunctionsFullAccess.html) 策略附加到 IAM 身份。

此策略向用户或角色授予使用 Step Functions API 的*full*权限。要获得完全访问*iam:PassRole*权限，用户必须拥有服务可以担任的至少一个 IAM 角色的权限。

## Step Functions 更新 Amazon 了托管策略
<a name="security-iam-awsmanpol-updates"></a>

查看自该服务开始跟踪这些更改以来 Step Functions Amazon 托管策略更新的详细信息。要获得有关对此页面更改的自动提示，请订阅 Step Functions [文档历史记录](document-history.md)页面上的 RSS 源。




| 更改 | 描述 | 日期 | 
| --- | --- | --- | 
|  [AWSStepFunctionsReadOnlyAccess](#security-iam-awsmanpol-AWSStepFunctionsReadOnlyAccess)：对现有策略的更新   |  Step Functions 添加了新的权限，以支持调用 `states:ValidateStateMachineDefinition` API 操作来检查您提供的状态机定义的语法。  | 2024 年 4 月 25 日 | 
|  [AWSStepFunctionsReadOnlyAccess](https://docs.amazonaws.cn/aws-managed-policy/latest/reference/AWSStepFunctionsReadOnlyAccess.html)：对现有策略的更新  |  Step Functions 添加了新的权限，允许列出和读取与以下内容相关的数据：标签 (ListTagsForResource) ListMapRuns、分布式地图 (、 DescribeMapRun)、版本和别名 (DescribeStateMachineAlias、 ListStateMachineAliases、 ListStateMachineVersions)。  | 2024 年 4 月 2 日 | 
|  Step Functions 开始了跟踪更改  |  Step Functions 开始跟踪其 Amazon 托管策略的更改。  | 2024 年 4 月 2 日 | 

# 在 Step Functions 中为状态机创建 IAM 角色
<a name="procedure-create-iam-role"></a>

Amazon Step Functions 可以执行代码和访问 Amazon 资源（例如调用 Amazon Lambda 函数）。为了保持安全性，您必须使用 IAM 角色为 Step Functions 授予对这些资源的访问权限。

本指南[用于了解 Step Functions 的教程](learning-resources.md#tutorials)中的使您能够利用自动生成的 IAM 角色，这些角色对您创建状态机的 Amazon 区域有效。但是，您可以为状态机创建自己的 IAM 角色。

在创建状态机使用的 IAM 策略时，策略中应包括您希望状态机承担的权限。您可以使用现有的 Amazon 托管策略作为示例，也可以从头开始创建满足您特定需求的自定义策略。有关更多信息，请参阅**《IAM 用户指南》中的[创建 IAM 策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_create.html)。

要为状态机创建您自己的 IAM 角色，请按照本节中的步骤操作。

在此示例中，您将创建一个有权调用 Lambda 函数的 IAM 角色。

## 为 Step Functions 创建角色
<a name="create-role-for-step-functions"></a>

1. 登录到 [IAM 控制台](https://console.amazonaws.cn/iam/home)，然后选择 **Roles**、**Create role**。

1. 在**选择可信实体**页面的 **Amazon 服务**下，从列表中选择 **Step Functions**，然后选择**下一步：权限**。

1. 在**已附加权限政策**页面上，选择**下一步：审核**。

1. 在**审核**页面上，对于**角色名称**，输入 `StepFunctionsLambdaRole`，然后选择**创建角色**。

   IAM 角色显示在角色列表中。

有关 IAM 权限和策略的更多信息，请参阅**《IAM 用户指南》中的[访问管理](https://docs.amazonaws.cn/IAM/latest/UserGuide/access.html)。

## 防止跨服务混淆代理问题
<a name="prevent-cross-service-confused-deputy"></a>

混淆代理问题是一个安全性问题，即不具有某操作执行权限的实体可能会迫使具有更高权限的实体执行该操作。在中 Amazon，跨服务模仿可能会导致混乱的副手问题。一个服务（*呼叫服务*）调用另一项服务（*所谓的服务*）时，可能会发生跨服务模拟。这种类型的模拟可能跨账户和跨服务发生。可以操纵调用服务以使用其权限对另一个客户的资源进行操作，否则该服务不应有访问权限。

为了防止众议员感到困惑，我们 Amazon 提供了一些工具，这些工具可帮助您保护所有服务的数据，这些服务委托人已被授予访问您账户中资源的权限。本节重点介绍针对的跨服务混淆代理预防 Amazon Step Functions；但是，您可以在 *IAM 用户指南*的[混乱副手问题](https://docs.amazonaws.cn/IAM/latest/UserGuide/confused-deputy.html)部分中了解有关此主题的更多信息。

我们建议在资源策略中使用 [https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 和 [https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全局条件上下文键，以限制 Step Functions 为其他服务提供的资源访问权限。如果您只希望将一个资源与跨服务访问相关联，请使用。`aws:SourceArn`如果您想允许该账户中的任何资源与跨服务使用操作相关联，请使用。`aws:SourceAccount`

防范混淆代理问题最有效的方法是使用 `aws:SourceArn` 全局条件上下文键和资源的完整 ARN。如果不知道资源的完整 ARN，或者正在指定多个资源，请针对 ARN 未知部分使用带有通配符字符 (`*`) 的 `aws:SourceArn` 全局上下文条件键。例如 `arn:aws:states:*:111122223333:*`。

以下是*新人策略*的示例，它展示了如何将 `aws:SourceArn` 和 `aws:SourceAccount` 与 Step Functions 搭配使用来防止出现混乱的副手问题。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement":[
     {
        "Effect":"Allow",
        "Principal":{
           "Service":[
              "states.amazonaws.com"
           ]
        },
        "Action":"sts:AssumeRole",
        "Condition":{
           "ArnLike":{
              "aws:SourceArn":"arn:aws:states:us-east-1:111122223333:stateMachine:*"
           },
           "StringEquals":{
              "aws:SourceAccount":"111122223333"
           }
        }
     }
  ]
}
```

## 附加内联策略
<a name="attach-inline-policy"></a>

Step Functions 可以直接在 `Task` 状态中控制其他服务。附加内联策略以允许 Step Functions 访问您需要控制的服务的 API 操作。

1. 打开 [IAM 控制台](https://console.amazonaws.cn/iam/home)，选择**角色**，搜索您的 Step Functions 角色，然后选择该角色。

1. 选择**添加内联策略**。

1. 使用**可视化编辑器**或 **JSON** 选项卡为您的角色创建策略。

有关 Amazon Step Functions 如何控制其他 Amazon 服务的更多信息，请参阅[将服务与 Step Functions 集成](integrate-services.md)。

**注意**  
有关 Step Functions 控制台创建的 IAM 策略的示例，请参阅[Step Functions 如何为集成服务生成 IAM 策略](service-integration-iam-templates.md)。

# 在 Step Functions 中为非管理员用户创建精细权限
<a name="concept-create-iam-advanced"></a>

IAM 中的默认托管策略（例如`ReadOnly`）并不能完全涵盖所有类型的 Amazon Step Functions 权限。本节将介绍这些不同类型的权限并提供一些示例配置。

Step Functions 具有四种类别的权限。根据您要为用户提供的访问权限，您可以使用这些类别的权限控制访问权限。

[服务级别权限](#concept-create-iam-advanced-service)  
适用于**不**对特定资源执行的 API 组件。

[状态机级权限](#concept-create-iam-advanced-state)  
适用于对特定状态机执行的所有 API 组件。

[执行级权限](#concept-create-iam-advanced-execution)  
适用于对特定执行采用的所有 API 组件。

[活动级权限](#concept-create-iam-advanced-activity)  
适用于对特定活动或活动的特殊实例执行的所有 API 组件。

## 服务级别权限
<a name="concept-create-iam-advanced-service"></a>

此权限级别适用于**不**对特定资源执行的所有 API 操作。包括 `[CreateStateMachine](https://docs.amazonaws.cn/step-functions/latest/apireference/API_CreateStateMachine.html)`、`[CreateActivity](https://docs.amazonaws.cn/step-functions/latest/apireference/API_CreateActivity.html)`、`[ListStateMachines](https://docs.amazonaws.cn/step-functions/latest/apireference/API_ListStateMachines.html)`、`[ListActivities](https://docs.amazonaws.cn/step-functions/latest/apireference/API_ListActivities.html)` 和 `[ValidateStateMachineDefinition](https://docs.amazonaws.cn/step-functions/latest/apireference/API_ValidateStateMachineDefinition.html)`。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "states:ListStateMachines",
                "states:ListActivities",
                "states:CreateStateMachine",
                "states:CreateActivity",
                "states:ValidateStateMachineDefinition"
            ],
            "Resource": [
                "arn:aws:states:*:*:*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:PassRole"
            ],
            "Resource": [
                "arn:aws:iam::123456789012:role/my-execution-role"
            ]
        }
    ]
}
```

## 状态机级权限
<a name="concept-create-iam-advanced-state"></a>

此权限级别适用于对特定状态机执行的所有 API 操作。这些 API 操作要求状态机的 Amazon 资源名称 (ARN) 作为请求的一部分，例如 `[DeleteStateMachine](https://docs.amazonaws.cn/step-functions/latest/apireference/API_DeleteStateMachine.html)`、`[DescribeStateMachine](https://docs.amazonaws.cn/step-functions/latest/apireference/API_DescribeStateMachine.html)`、`[StartExecution](https://docs.amazonaws.cn/step-functions/latest/apireference/API_StartExecution.html)` 和 `[ListExecutions](https://docs.amazonaws.cn/step-functions/latest/apireference/API_ListExecutions.html)`。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "states:DescribeStateMachine",
        "states:StartExecution",
        "states:DeleteStateMachine",
        "states:ListExecutions",
        "states:UpdateStateMachine",
        "states:TestState",
        "states:RevealSecrets"
      ],
      "Resource": [ 
        "arn:aws:states:*:*:stateMachine:StateMachinePrefix*" 
      ]
    }
  ]
}
```

## 执行级权限
<a name="concept-create-iam-advanced-execution"></a>

此权限级别适用于对特定执行采用的所有 API 操作。这些 API 操作要求执行的 ARN 作为请求的一部分，例如 `[DescribeExecution](https://docs.amazonaws.cn/step-functions/latest/apireference/API_DescribeExecution.html)`、`[GetExecutionHistory](https://docs.amazonaws.cn/step-functions/latest/apireference/API_GetExecutionHistory.html)` 和 `[StopExecution](https://docs.amazonaws.cn/step-functions/latest/apireference/API_StopExecution.html)`。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "states:DescribeExecution",
        "states:DescribeStateMachineForExecution",
        "states:GetExecutionHistory",
        "states:StopExecution"
      ],
      "Resource": [ 
        "arn:aws:states:*:*:execution:*:ExecutionPrefix*"
      ]
    }
  ]
}
```

## 活动级权限
<a name="concept-create-iam-advanced-activity"></a>

此权限级别适用于将对特定活动或活动的特殊实例执行的所有 API 操作。这些 API 操作要求活动的 ARN 或实例的令牌作为请求的一部分，例如 `[DeleteActivity](https://docs.amazonaws.cn/step-functions/latest/apireference/API_DeleteActivity.html)`、`[DescribeActivity](https://docs.amazonaws.cn/step-functions/latest/apireference/API_DescribeActivity.html)`、`[GetActivityTask](https://docs.amazonaws.cn/step-functions/latest/apireference/API_GetActivityTask.html)` 和 `[SendTaskHeartbeat](https://docs.amazonaws.cn/step-functions/latest/apireference/API_SendTaskHeartbeat.html)`。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "states:DescribeActivity",
        "states:DeleteActivity",
        "states:GetActivityTask",
        "states:SendTaskHeartbeat"
      ],
      "Resource": [
        "arn:aws:states:*:*:activity:ActivityPrefix*"
      ]
    }
  ]
}
```

# 在 Step Function Amazon Web Services 账户 s 中访问其他资源中的资源
<a name="concepts-access-cross-acct-resources"></a>

Step Functions 提供对工作流程 Amazon Web Services 账户 中不同配置的资源的跨账户访问权限。使用 Step Functions 服务集成，您可以调用任何跨账户 Amazon 资源，即使该资源 Amazon Web Services 服务 不支持基于资源的策略或跨账户调用。

例如，假设您拥有两个 Amazon Web Services 账户名为 “开发和测试” 的同一个项目 Amazon Web Services 区域。使用跨账户存取，“开发”账户中的工作流可以访问“测试”账户中的资源，如 Amazon S3 存储桶、Amazon DynamoDB 表和 Lambda 函数。

**重要**  
IAM 角色和基于资源的策略仅在单个分区内跨账户委派访问权限。例如，假定您在标准 `aws` 分区的美国西部（加利福尼亚北部）中有一个账户。您在 `aws-cn` 分区的中国（北京）中也有一个账户。您不能使用中国（北京）的账户中 Amazon S3 基于资源的策略，来允许标准 `aws` 账户中用户的访问权限。

有关跨账户存取的更多信息，请参阅**《IAM 用户指南》中的[跨账户策略评估逻辑](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_evaluation-logic-cross-account.html)。

尽管每个 Amazon Web Services 账户 步骤都可以完全控制自己的资源，但使用 Step Functions，您无需自定义任何代码即可重新组织、交换、添加或删除工作流程中的步骤。即使流程发生变化或应用程序不断发展，您也可以这样做。

您还可以调用嵌套状态机的执行，这样它们就可以在不同的账户中使用。这样做可以有效分离和隔离您的工作流。当您在工作流中使用 [`.sync`](connect-to-resource.md#connect-sync) 服务集成模式访问不同账户中的另一个 Step Functions 工作流时，Step Functions 会使用轮询来消耗您分配的配额。有关更多信息，请参阅 [运行作业 (.sync)](connect-to-resource.md#connect-sync)。

**注意**  
跨区域 Amazon SDK 集成和跨区域 Amazon 资源访问在 Step Functions 中不可用。

## 关键的跨账户资源概念
<a name="key-terms-cross-acct-access"></a>

**[执行角色](procedure-create-iam-role.md)**  
Step Functions 用来运行代码和访问 Amazon 资源的 IAM 角色，例如 Amazon Lambda 函数的 “调用” 操作。

**[服务集成](integrate-services.md)**  
可以在工作流程的某个`Task`状态内调用的 Amazon SDK 集成 API 操作。

**源账户**  
 Amazon Web Services 账户 拥有状态机并已开始执行的。

**目标账户**  
您可以 Amazon Web Services 账户 向其拨打跨账户的电话。

**目标角色**  
目标账户中的 IAM 角色，状态机在调用目标账户所拥有的资源时会假定该角色。

**[运行作业 (.sync)](connect-to-resource.md#connect-sync)**  
一种用于调用服务的服务集成模式，例如 Amazon Batch。它还能使 Step Functions 状态机在进入下一状态前等待作业完成。要指示 Step Functions 应该等待，请在 `Task` 状态定义的 `Resource` 字段中附加 `.sync` 后缀。

## 调用跨账户资源
<a name="invoke-cross-acct-resource"></a>

要在工作流中调用跨账户资源，请执行以下操作：

1. 在包含资源的目标账户中创建 IAM 角色。此角色向包含状态机的源账户授予访问目标账户资源的权限。

1. 在 `Task` 状态的定义中，指定在调用跨账户资源之前由状态机担任的目标 IAM 角色。

1. 修改目标 IAM 角色中的信任策略来允许源账户临时担任此角色。信任策略必须包含源账户中定义的状态机的 Amazon 资源名称（ARN）。此外，还要在目标 IAM 角色中定义调用 Amazon 资源的相应权限。

1. 更新源账户的执行角色，使其包含担任目标 IAM 角色所需的权限。

有关示例，请参阅教程中的[在 Step Functi Amazon ons 中访问跨账户资源](tutorial-access-cross-acct-resources.md)。

**注意**  
您可以配置状态机承担一个 IAM 角色，以便从多个 Amazon Web Services 账户访问资源。但是，状态机在给定时间只能承担一个 IAM 角色。

![\[访问跨账户资源的概念\]](http://docs.amazonaws.cn/step-functions/latest/dg/images/cross-account-support-concept.png)


## 跨账户存取 .sync 集成模式
<a name="concepts-cross-acct-sync-pattern"></a>

在工作流中使用 `.sync` 服务集成模式时，Step Functions 会对调用的跨账户资源进行轮询，以确认任务是否完成。这会导致实际任务完成时间与 Step Functions 确认任务完成时间之间出现轻微延迟。目标 IAM 角色需要 `.sync` 调用所需的权限来完成轮询循环。为此，目标 IAM 角色必须拥有允许源账户承担的信任策略。此外，目标 IAM 角色还需要完成轮询循环所需的权限。

**注意**  
嵌套快速工作流当前尚不支持 `arn:aws:states:::states:startExecution.sync`。请改用 `arn:aws:states:::aws-sdk:sfn:startSyncExecution`。

### .sync 调用的信任策略更新
<a name="cross-acct-sync-pattern-policy-update"></a>

更新目标 IAM 角色的信任策略，如下面的示例所示。`sts:ExternalId` 字段进一步控制谁可担任该角色。状态机的名称必须仅包含 Amazon Security Token Service `AssumeRole` API 支持的字符。有关更多信息，请参阅《Amazon Security Token Service API Reference》**中的 [AssumeRole](https://docs.amazonaws.cn/STS/latest/APIReference/API_AssumeRole.html)。

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Principal": {
        "AWS": "arn:aws:iam::sourceAccountID:role/InvokeRole",
      },
      "Condition": {
        "StringEquals": {
          "sts:ExternalId": "arn:aws:states:us-east-2:sourceAccountID:stateMachine:stateMachineName"
        }
      }
    }
  ]
}
```

### .sync 调用所需的权限
<a name="cross-acct-sync-pattern-perms-update"></a>

要授予状态机所需的权限，请更新目标 IAM 角色所需的权限。有关更多信息，请参阅 [Step Functions 如何为集成服务生成 IAM 策略](service-integration-iam-templates.md)。例如，要启动状态机，请添加以下权限。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "states:StartExecution"
      ],
      "Resource": [
        "arn:aws:states:us-east-1:123456789012:stateMachine:myStateMachineName"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "states:DescribeExecution",
        "states:StopExecution"
      ],
      "Resource": [
        "arn:aws:states:us-east-1:123456789012:execution:myStateMachineName:*"
      ]
    }
  ]
}
```

# 为 Step Functions 创建 Amazon VPC 端点
<a name="vpc-endpoints"></a>

如果您使用亚马逊虚拟私有云（Amazon VPC）托管 Amazon 资源，则可以在您的亚马逊 VPC 和 Amazon Step Functions 工作流程之间建立连接。您可以将此连接用于您的 Step Functions 工作流，而无需穿越公共 Internet。标准工作流、快速工作流和同步快速工作流都支持 Amazon VPC 端点。

Amazon VPC 允许您在自定义虚拟网络中启动 Amazon 资源。可以使用 VPC 控制您的网络设置，例如 IP 地址范围、子网、路由表和网络网关。有关更多信息 VPCs，请参阅 [Amazon VPC 用户指南](https://docs.amazonaws.cn/vpc/latest/userguide/)。

要将您的 Amazon VPC 连接到 Step Functions，您必须首先定义一个*接口 VPC 终端节点*，该终端节点允许您将您的 VPC 与其他 Amazon 服务连接起来。该端点提供了可靠且可扩展的连接，无需互联网网关、网络地址转换 (NAT) 实例或 VPN 连接。有关更多信息，请参阅 *Amazon VPC 用户指南*中的[接口 VPC 端点 (Amazon PrivateLink)](https://docs.amazonaws.cn/vpc/latest/userguide/vpce-interface.html)。

## 创建端点
<a name="vpc-endpoint-create"></a>

您可以使用、 Amazon Command Line Interface (Amazon CLI)、 Amazon 软件开发工具包 Amazon Web Services 管理控制台、 Amazon Step Functions API 或在 VPC 中创建 Amazon Step Functions 终端节点 Amazon CloudFormation。

有关使用 Amazon VPC 控制台或 Amazon CLI创建和配置端点的信息，请参阅 *Amazon VPC 用户指南*中的[创建接口端点](https://docs.amazonaws.cn/vpc/latest/userguide/vpce-interface.html#create-interface-endpoint)。

**注意**  
 在创建端点时，请将 Step Functions 指定为您希望 VPC 连接到的服务。在 Amazon VPC 控制台中，服务名称因 Amazon 地区而异。例如，如果您选择美国东部（弗吉尼亚州北部），则标准工作流和快速工作流的服务名称为 **com.amazonaws.us-east-1.state**，同步快速工作流的服务名称为 **com.amazonaws.us-east-1.sync-states**。

**注意**  
无需通过[私有 DNS](https://docs.amazonaws.cn/vpc/latest/privatelink/verify-domains.html) 覆盖开发工具包中的端点即可使用 VPC 端点。但是，如果要覆盖同步快速工作流的开发工具包中的端点，则需要将 `DisableHostPrefixInjection` 配置设置为 `true`。示例（Java 开发工具包 V2）：  

```
SfnClient.builder()
  .endpointOverride(URI.create("https://vpce-{vpceId}.sync-states.us-east-1.vpce.amazonaws.com"))
  .overrideConfiguration(ClientOverrideConfiguration.builder()
    .advancedOptions(ImmutableMap.of(SdkAdvancedClientOption.DISABLE_HOST_PREFIX_INJECTION, true))
    .build())
  .build();
```

有关使用创建和配置终端节点的信息 Amazon CloudFormation，请参阅*Amazon CloudFormation 用户指南*中的 [AWS:: EC2:: VPCEndpoint](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-vpcendpoint.html) 资源。

## Amazon VPC 端点策略
<a name="vpc-endpoint-policy"></a>

要控制对 Step Functions 的连接访问权限，您可以在创建亚马逊 VPC 终端节点时附加 Amazon Identity and Access Management (IAM) 终端节点策略。您可以通过附加多个端点策略来创建复杂的 IAM 规则。有关更多信息，请参阅:
+  [Step Functions 的 Amazon Virtual Private Cloud 端点策略](#vpc-iam) 
+  [在 Step Functions 中为非管理员用户创建精细权限](concept-create-iam-advanced.md) 
+  [使用 VPC 端点控制对服务的访问](https://docs.amazonaws.cn/vpc/latest/userguide/vpc-endpoints-access.html) 

## Step Functions 的 Amazon Virtual Private Cloud 端点策略
<a name="vpc-iam"></a>

您可以为 Step Functions 创建 Amazon VPC 端点策略，并在其中指定以下内容：
+ 可执行操作的主体。
+ 可执行的操作。
+ 可对其执行操作的资源。

以下示例显示了一个 Amazon VPC 端点策略，该策略允许一个用户创建状态机，并拒绝所有其他用户删除状态机的权限。示例策略还授予所有 用户执行权限。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
              "states:ListExecutions", "states:StartExecution", "states:StopExecution", "states:DescribeExecution"
            ],
            "Resource": "*",
            "Effect": "Allow",
            "Principal": "*"
        },
        {
            "Action": "states:CreateStateMachine",
            "Resource": "*",
            "Effect": "Allow",
            "Principal": {
              "AWS": "arn:aws:iam::123456789012:user/MyUser"
            }
        },
        {
            "Action": "states:DeleteStateMachine",
            "Resource": "*",
            "Effect": "Deny",
            "Principal": "*"
        }
    ]
}
```

有关创建端点策略的更多信息，请参阅以下内容：
+  [在 Step Functions 中为非管理员用户创建精细权限](concept-create-iam-advanced.md) 
+  [使用 VPC 端点控制对服务的访问](https://docs.amazonaws.cn/vpc/latest/userguide/vpc-endpoints-access.html) 

# Step Functions 如何为集成服务生成 IAM 策略
<a name="service-integration-iam-templates"></a>

当您在 Amazon Step Functions 控制台中创建状态机时，Step Functions 会根据状态机定义中使用的资源生成一个 Amazon Identity and Access Management (IAM) 策略，如下所示：
+ 对于**优化集成**，Step Functions 将为状态机创建一个包含必要权限和角色的策略。

  提示：您可以在[集成优化的服务](integrate-optimized.md)下面的每个服务页面中查看示例策略。
+ 对于**标准集成**，Step Functions 将创建一个具有部分权限的 IAM 角色。

  您必须添加状态机与服务交互所需的所有缺失角色策略。

## 动态资源与静态资源
<a name="connect-iam-dynamic-static"></a>

*静态资源***直接**在状态机的任务状态中定义。在任务状态中包含要直接调用的资源信息时，Step Functions 可以只为这些资源创建 IAM 角色。

*动态资源*在启动状态机时作为输入**传递**，或者作为输入传递给单个状态，然后使用 JSONata 或进行访问 JSONPath。当您将动态资源传递给任务时，Step Functions 无法自动缩小权限范围，因此 Step Functions 将创建一个具有更高宽松度的策略，该策略指定：`"Resource": "*"`。

## 使用 .sync 的任务的额外权限
<a name="connect-iam-sync-async"></a>

对于使用[运行作业（.sync）](connect-to-resource.md#connect-sync)模式的任务，需要额外的权限来监视和接收来自所连接服务的 API 的响应。

当作业在连接的服务（**轮询**和**事件**）上运行时，Step Functions 使用两种方法来监控作业的状态。

轮询需要 `Describe` 或 `Get` API 操作的权限。例如，对于 Amazon ECS，状态机必须具有允许权限`ecs:DescribeTasks`，因为 Amazon Glue 状态机需要允许权限`glue:GetJobRun`。如果角色中缺少必需的权限，则 Step Functions 可能无法确定您的作业状态。使用轮询方法的原因之一是因为某些服务集成不支持 EventBridge事件，而有些服务仅在尽力发送事件。

或者，您可以使用从 Amazon 服务发送到 Amazon 的事件 EventBridge。事件通过托管规则路由到 Step EventBridge Functions，因此该角色需要`events:PutTargets``events:PutRule`、和`events:DescribeRule`的权限。如果角色中缺少这些权限，则在 Step Functions 得知您的任务已完成之前，可能会有一段延迟。有关 EventBridge 事件的更多信息，请参阅[来自 Amazon 服务的事件](https://docs.amazonaws.cn/eventbridge/latest/userguide/eb-service-event.html)。

## 排查 .sync 工作流卡住的问题
<a name="polling-events-troubleshooting"></a>

对于**同时**支持轮询和事件的“运行作业”（.sync）任务，即使角色缺少轮询所需的权限，您的任务仍可以通过事件正常完成。

在前面的场景中，您可能没有注意到轮询权限缺失或不正确。在极少数情况下，事件无法传送到 Step Functions 或由 Step Functions 处理，您的执行可能会卡住。

 要验证您的轮询权限配置是否正确，您可以通过以下方式在没有 EventBridge 事件的环境中运行执行 
+  删除中负责将事件转发 EventBridge 到 Step Functions 的托管规则。
**注意**  
 因为托管规则由账户中的所有状态机共享，因此应仅使用测试或开发账户，以避免对其他状态机造成意外影响。
+ 通过检查目标服务策略模板中用于 `events:PutRule` 的 `Resource` 字段，可以确定要删除的特定托管规则。下次创建或更新使用该服务集成的状态机时，将重新创建托管规则。
+  有关删除 EventBridge 规则的更多信息，请参阅[禁用或删除规则](https://docs.amazonaws.cn/eventbridge/latest/userguide/eb-delete-rule.html)。

## 取消工作流的权限
<a name="iam-cancel-tasks"></a>

如果使用运行作业 (.sync) 模式的任务停止，Step Functions 会尽力尝试取消该任务。

取消任务需要 `Cancel`、`Stop`、`Terminate` 或 `Delete` API 操作的权限，例如 `batch:TerminateJob` 或 `eks:DeleteCluster`。如果您的角色中缺少这些权限，Step Functions 将无法取消您的任务，而且当任务继续运行时，可能会产生额外的费用。有关停止任务的更多信息，请参阅[运行任务](connect-to-resource.md#connect-sync)。

**了解有关集成模式的更多信息**  
 要了解有关同步任务的信息，请参阅[探索 Step Functions 中的服务集成模式](connect-to-resource.md)。

## 仅具有活动的 Step Functions 状态机的 IAM 策略
<a name="activities-iam"></a>

对于仅具有 `Activity` 任务或根本没有任务的状态机，请使用拒绝访问所有操作和资源的 IAM 策略。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*"
        }
    ]
}
```

有关使用 ` Activity ` 任务的更多信息，请参阅[了解 Step Functions 中的活动](concepts-activities.md)。

# 使用分布式 Map 状态的 IAM 策略
<a name="iam-policies-eg-dist-map"></a>

当您使用 Step Functions 控制台创建工作流时，Step Functions 可以根据工作流定义中的资源自动生成 IAM 策略。生成的策略包括允许状态机角色调用*分布式地图状态*的 `[StartExecution](https://docs.amazonaws.cn/step-functions/latest/apireference/API_StartExecution.html)` API 操作和访问 Amazon 资源（例如 Amazon S3 存储桶和对象以及 Lambda 函数）所需的最低权限。

我们建议在 IAM 策略中仅包括必需的权限。例如，如果您的工作流包含分布式模式下的 `Map` 状态，则将策略范围缩小到包含您的数据的特定 Amazon S3 存储桶和文件夹。

**重要**  
如果您在*分布式 Map 状态* 输入中指定了 Amazon S3 存储桶和对象或前缀，并将[参考路径](amazon-states-language-paths.md#amazon-states-language-reference-paths)指向现有键值对，请务必更新工作流程的 IAM 策略。将策略范围缩小到运行时该路径解析到的存储桶和对象名称。

## 运行分布式 Map 状态的 IAM 策略示例
<a name="iam-policy-run-dist-map"></a>

当您在工作流中包含*分布式 Map 状态* 时，Step Functions 需要适当的权限才能允许状态机角色为*分布式 Map 状态* 调用 `[StartExecution](https://docs.amazonaws.cn/step-functions/latest/apireference/API_StartExecution.html)` API 操作。

以下 IAM 策略示例授予您的状态机角色运行*分布式 Map 状态* 所需的最低权限。

**注意**  
确保将 `stateMachineName` 替换为使用*分布式 Map 状态* 的状态机的名称。例如 `arn:aws:states:region:account-id:stateMachine:mystateMachine`。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "states:StartExecution"
      ],
      "Resource": [
        "arn:aws:states:us-east-1:123456789012:stateMachine:myStateMachineName"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "states:DescribeExecution"
      ],
      "Resource": "arn:aws:states:us-east-1:123456789012:execution:myStateMachineName:*"
    }
  ]
}
```

## redriving分布式 Map 的 IAM 策略示例
<a name="iam-policy-redrive-dist-map"></a>

您可以通过[redriving](redrive-executions.md)[父工作流](state-map-distributed.md#dist-map-orchestrate-parallel-workloads-key-terms)，重新启动未成功的子工作流执行。redriven父工作流会redrives所有未成功的状态，包括分布式 Map。确保您的执行角色具有允许其在父工作流上调用 `[RedriveExecution](https://docs.amazonaws.cn/step-functions/latest/apireference/API_RedriveExecution.html)` API 操作所需的最低权限。

下面的 IAM 策略示例授予状态机角色redriving*分布式 Map 状态* 所需的最低权限。

**注意**  
确保将 `stateMachineName` 替换为使用*分布式 Map 状态* 的状态机的名称。例如 `arn:aws:states:region:account-id:stateMachine:mystateMachine`。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "states:RedriveExecution"
      ],
      "Resource": "arn:aws:states:us-east-2:123456789012:execution:myStateMachineName/myMapRunLabel:*"
    }
  ]
}
```

## 从 Amazon S3 数据集读取数据的 IAM 策略示例
<a name="iam-policy-eg-item-reader"></a>

以下示例展示了使用 [ListObjectsV2](https://docs.amazonaws.cn/AmazonS3/latest/API/API_ListObjectsV2.html) 和 [GetObject](https://docs.amazonaws.cn/AmazonS3/latest/API/API_GetObject.html)API 操作授予访问您的 Amazon S3 数据集所需的最低权限的技术。

**Example 使用 Amazon S3 对象作为数据集的条件**  
以下条件授予访问 Amazon S3 存储桶的 `processImages` 文件夹中的对象所需的最低权限。  

```
"Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket" ],
"Condition": {
   "StringLike": { 
      "s3:prefix": [ "processImages" ]
   }
}
```

**Example 使用 CSV 文件作为数据集**  
以下示例显示了访问名为 `ratings.csv` 的 CSV 文件所需的操作。  

```
"Action": [ "s3:GetObject" ],
"Resource": [
   "arn:aws:s3:::amzn-s3-demo-bucket/csvDataset/ratings.csv"
   ]
```

**Example 使用 Amazon S3 清单作为数据集**  
下面显示了 Amazon S3 清单和数据文件的示例资源。  

```
"Resource": [
   "arn:aws:s3:::myPrefix/amzn-s3-demo-bucket/myConfig-id/YYYY-MM-DDTHH-MMZ/manifest.json",
   "arn:aws:s3:::myPrefix/amzn-s3-demo-bucket/myConfig-id/data/*"
   ]
```

**Example 使用 ListObjects V2 限制使用文件夹前缀**  
使用 [ListObjectsV2](https://docs.amazonaws.cn/AmazonS3/latest/API/API_ListObjectsV2.html) 时，将生成两个策略。其中一个策略用于允许**列出**存储桶的内容 (`ListBucket`)，另一个策略将允许**检索存储桶中的对象** (`GetObject`)。  
下面显示了示例操作、资源和条件：  

```
"Action": [ "s3:ListBucket" ],
"Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket" ],
"Condition": {
   "StringLike": {
      "s3:prefix": [ "/path/to/your/json/" ]
   }
}
```

```
"Action": [ "s3:GetObject" ],
"Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket/path/to/your/json/*" ]
```
请注意，`GetObject` 不会限定范围，您将为对象使用通配符 (`*`)。

## 将数据写入 Amazon S3 存储桶的 IAM 策略示例
<a name="iam-policy-eg-result-writer"></a>

以下 IAM 策略示例授予使用 `[PutObject](https://docs.amazonaws.cn/AmazonS3/latest/API/API_PutObject.html)` API 操作将子工作流程执行结果写入 Amazon S3 存储桶*csvJobs*中名为的文件夹所需的最低权限。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListMultipartUploadParts",
                "s3:AbortMultipartUpload"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-destination-bucket/csvJobs/*"
            ]
        }
    ]
}
```

### Amazon KMS key 加密的 Amazon S3 存储桶的 IAM 权限
<a name="multiupload-dmap-result-policy"></a>

*分布式 Map 状态* 使用多部份内容上传将子工作流执行结果写入 Amazon S3 存储桶。如果使用 Amazon Key Management Service (Amazon KMS) 密钥对存储桶进行加密，则还必须在 IAM 策略中包含对密钥执行 `kms:Decrypt`、`kms:Encrypt` 和 `kms:GenerateDataKey` 操作的权限。这些权限是必需的，因为 Amazon S3 必须在完成分段上传之前解密并读取加密的文件段中的数据。

下面的 IAM 策略示例对用于加密 Amazon S3 存储桶的密钥的 `kms:Decrypt`、`kms:Encrypt` 和 `kms:GenerateDataKey` 操作授予了权限。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:Decrypt",
      "kms:Encrypt",
      "kms:GenerateDataKey"
    ],
    "Resource": [
      "arn:aws:kms:us-east-1:123456789012:key/111aa2bb-333c-4d44-5555-a111bb2c33dd"
    ]
  }
}
```

有关更多信息，请参阅 *Amazon 知识中心 *中的[用 Amazon KMS key加密将大型文件上传到 Amazon S3 ](https://www.amazonaws.cn/premiumsupport/knowledge-center/s3-large-file-encryption-kms-key/)。

如果您的 IAM 用户或角色与 Amazon Web Services 账户 相同KMS key，则您必须对密钥策略拥有这些权限。如果您的 IAM 用户或角色属于与 KMS key 不同的账户，您必须在密钥政策和 IAM 用户或角色中具有这些权限。

# 在 Step Functions 中创建基于标签的 IAM 策略
<a name="tag-based-policies"></a>

Step Functions 支持基于标签的策略。例如，您可能会限制对下面这样的所有 Step Functions 资源的访问：在这些资源包含的标签中，具有键 `environment` 和值 `production`。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "states:TagResource",
                "states:UntagResource",
                "states:DeleteActivity",
                "states:DeleteStateMachine",
                "states:StopExecution"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {"aws:ResourceTag/environment": "production"}
            }
        }
    ]
}
```

此策略将使用 `Deny` 来拒绝对已标记为 `environment/production` 的所有资源的以下功能：删除状态机或活动、停止执行以及添加或删除新的标签。

对于基于标签的授权，状态机执行资源（如下例所示）会继承与状态机关联的标签。

```
arn:partition:states:region:account-id:execution:<StateMachineName>:<ExecutionId>
```

当您调用[DescribeExecution](https://docs.amazonaws.cn/step-functions/latest/apireference/API_DescribeExecution.html)或 APIs 以其他方式指定执行资源 ARN 时，Step Functions 会在执行基于标签的授权时使用与状态机关联的标签来接受或拒绝请求。这有助于在状态机级别允许或拒绝对状态机执行的访问。

有关标记的更多信息，请参阅以下内容：
+ [在 Step Functions 中标记状态机和活动](sfn-best-practices.md#concepts-tagging)
+ [使用 IAM 标签控制访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_iam-tags.html)

# 在 Step Functions 中排查身份和访问权限问题
<a name="security_iam_troubleshoot"></a>

使用以下信息可帮助您诊断和修复在使用 Step Functions 和 IAM 时可能遇到的常见问题。

**Topics**
+ [

## 我无权在 Step Functions 中执行操作
](#security_iam_troubleshoot-no-permissions)
+ [

## 我无权执行 iam：PassRole
](#security_iam_troubleshoot-passrole)
+ [

## 我想允许我以外的人访问我的 Step Amazon Web Services 账户 Functions 资源
](#security_iam_troubleshoot-cross-account-access)

## 我无权在 Step Functions 中执行操作
<a name="security_iam_troubleshoot-no-permissions"></a>

如果您收到一个错误，指明您无权执行某个操作，则必须更新策略以允许您执行该操作。

当 `mateojackson` 用户尝试使用控制台查看有关虚构 `my-example-widget` 资源的详细信息，但不拥有虚构 `states:GetWidget` 权限时，会发生以下示例错误。

```
User: arn:aws:iam::123456789012:user/mateojackson is not authorized to perform: states:GetWidget on resource: my-example-widget
```

在此情况下，Mateo 的策略必须更新以允许其使用 `states:GetWidget` 操作访问 `my-example-widget` 资源。

如果您需要帮助，请联系您的 Amazon 管理员。您的管理员是提供登录凭证的人。

## 我无权执行 iam：PassRole
<a name="security_iam_troubleshoot-passrole"></a>

如果您收到一个错误，表明您无权执行 `iam:PassRole` 操作，则必须更新策略以允许您将角色传递给 Step Functions。

有些 Amazon Web Services 服务 允许您将现有角色传递给该服务，而不是创建新的服务角色或服务相关角色。为此，您必须具有将角色传递到服务的权限。

当名为 `marymajor` 的 IAM 用户尝试使用控制台在 Step Functions 中执行操作时，会发生以下示例错误。但是，服务必须具有服务角色所授予的权限才可执行此操作。Mary 不具有将角色传递到服务的权限。

```
User: arn:aws:iam::123456789012:user/marymajor is not authorized to perform: iam:PassRole
```

在这种情况下，必须更新 Mary 的策略以允许她执行 `iam:PassRole` 操作。

如果您需要帮助，请联系您的 Amazon 管理员。您的管理员是提供登录凭证的人。

## 我想允许我以外的人访问我的 Step Amazon Web Services 账户 Functions 资源
<a name="security_iam_troubleshoot-cross-account-access"></a>

您可以创建一个角色，以便其他账户中的用户或您组织外的人员可以使用该角色来访问您的资源。您可以指定谁值得信赖，可以代入角色。对于支持基于资源的策略或访问控制列表 (ACLs) 的服务，您可以使用这些策略向人们授予访问您的资源的权限。

要了解更多信息，请参阅以下内容：
+ 要了解 Step Functions 是否支持这些特征，请参阅 [如何 Amazon Step Functions 与 IAM 配合使用](security_iam_service-with-iam.md)。
+ 要了解如何提供对您拥有的资源的访问权限 Amazon Web Services 账户 ，请参阅 [IAM 用户*指南中的向您拥有 Amazon Web Services 账户 的另一个 IAM 用户*提供访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_common-scenarios_aws-accounts.html)权限。
+ 要了解如何向第三方提供对您的资源的访问[权限 Amazon Web Services 账户，请参阅 *IAM 用户指南*中的向第三方提供](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_common-scenarios_third-party.html)访问权限。 Amazon Web Services 账户 
+ 要了解如何通过身份联合验证提供访问权限，请参阅《IAM 用户指南》**中的[为经过外部身份验证的用户（身份联合验证）提供访问权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_common-scenarios_federated-users.html)。
+ 要了解使用角色和基于资源的策略进行跨账户访问之间的差别，请参阅《IAM 用户指南》**中的 [IAM 中的跨账户资源访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。