Amazon SWF IAM 策略 - Amazon Simple Workflow Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

Amazon SWF IAM 策略

IAM 策略包含一个或多个 Statement 元素,每个元素都包含一组定义该策略的元素。有关元素的完整列表以及如何构建策略的一般性讨论,请参阅 The Access Policy Language。Amazon SWF 访问控制基于以下元素:

效果

(必需) 该语句的效果:denyallow

注意

您必须显式允许访问;默认情况下,IAM 会拒绝访问。

资源

(必需)该语句适用的资源( Amazon 服务中用户可以与之交互的实体)。

您可以只针对域授予资源权限。例如,策略只允许对您的账户中特定域进行访问。要表达对域名的权限,Resource请将其设置为该域的亚马逊资源名称 (ARN),其格式为 “arn: aws: swf::: /domain/”。Region AccountID DomainName Region是 Amazon 区域,AccountID是没有破折号的账户 ID,DomainName是域名。

操作

(必填)该语句适用的操作,您可以使用以下格式来引用该操作:serviceId: action。对于亚马逊 SWF,请设置为serviceIDswf例如,swf:StartWorkflowExecution指的是StartWorkflowExecution操作,用于控制允许哪些用户启动工作流程。

如果您授予使用权限 RespondDecisionTaskCompleted,则还可以使用来表达对伪 API 的权限,从而控制Action对包含的决策列表的访问权限。由于 IAM 在默认情况下拒绝访问,您必须显式允许决策程序的决策,否则决策将不被接受。您可以使用 * 值允许所有决策。

状况

(可选) 表示一个或多个操作参数的约束条件,以限制允许的值。

Amazon SWF 操作的范围通常较广,您可以使用 IAM 条件来缩小范围。例如,要限制允许该PollForActivityTask操作访问的任务列表,您可以添加Condition并使用swf:taskList.name密钥指定允许列表。

您可以表达下列实体的约束条件。

  • 工作流类型。名称和版本具有单独密钥。

  • 活动类型。名称和版本具有单独密钥。

  • 任务列表。

  • Tags. 您可以为某些操作指定多个标签。在此情况下,每个标签都有一个单独的密钥。

注意

对于 Amazon SWF,所有值都是字符串,因此您可以使用字符串运算符(如 StringEquals)来限制参数,将参数限制为指定的字符串。但是,StringEquals 等常规字符串比较运算符需要全部请求以包含参数。如果不显式包含参数,且类型注册过程中未提供默认值 (如默认任务列表),则访问将被拒绝。

将条件视为可选项通常很有用,这样一来,您可以调用操作,而无需包含相关参数。例如,您可能希望允许决策者指定一组RespondDecisionTaskCompleted决策,但也允许它为任何特定调用仅指定其中一个决策。这种情况下,可使用 StringEqualsIfExists 运算符限制适当的参数,在参数满足条件时允许访问,但不会在参数不存在时拒绝访问。

有关可限制参数的完整列表和相关密钥,请参阅 API 摘要

下一部分将举例说明如何构建 Amazon SWF 策略。有关详细信息,请参阅字符串条件

为亚马逊 SWF 编写政策

一个工作流程由多个参与者组成,包括活动、决策者等。您可以通过附加适当的 IAM 策略控制每个操作者的访问权限。

通过以下操作,参与者将获得所有地区的完全账户访问权限:

  • 操作:swf:*

  • 资源:arn:aws:swf:*:123456789012:/domain/*

您可以使用通配符利用一个值来表示多个资源、操作或地区。

  • Resource值中的第一个通配符 (*) 表示资源权限适用于所有区域

    要将权限限制在单个区域,请使用适当的区域字符串替换通配符,如 us-east-1。

  • Resource 值中的第二个通配符 (*) 让操作者可以访问指定区域中的任何账户域。

  • Action 值中的通配符 (*) 让操作者可以调用任何 Amazon SWF 操作。

有关通配符使用方法的详细信息,请参阅元素描述

域权限

要将部门的工作流程限制在特定域内,您可以授予权限,允许参与者调用任何操作,但仅限于特定部门。

要授予参与者访问多个域名的权限,请以声明列表形式明确每个域的权限:

  • 操作:swf:*

  • 资源:arn:aws:swf:*:123456789012:/domain/department1

  • 资源:arn:aws:swf:*:123456789012:/domain/department2

您可以允许参与者在和域中使用任何 Amazon SWF 操作department1department2有时候,您还可以使用通配符表示多个域。

API 权限和约束条件

您可以通过在Action元素中指定作来控制角色可以使用哪些动作。

通过以下操作,操作者只能调StartWorkflowExecution用启动工作流程。它不能使用任何其他操作。

  • 操作:swf:StartWorkflowExecution

Conditions

您可以选择使用元素来限制操作允许的参数值。Condition

要限制操作者可以启动哪些工作流程,请按如下方式限制一个或多个StartWorkflowExecution参数值:

"Condition" : { "StringEquals" : { "swf:workflowType.name" : "workflow1", "swf:workflowType.version" : "version2" } }

具有先前约束条件的 actor 只能version2运行,workflow1并且两个参数都必须包含在请求中。

您可以使用 StringEqualsIfExists 运算符限制操作,无需将其包含在请求中,如下所述:

"Condition" : { "StringEqualsIfExists" : { "swf:taskList.name" : "task_list_name" } }

具有先前策略的参与者可以在开始执行工作流程时选择性地指定任务列表。

您可以限制某些操作的标签列表。每个标签都有单独的密钥,因此您可以使用swf:tagList.member.0限制列表中的第一个标签,swf:tagList.member.1限制列表中的第二个标签,依此类推,最多 5 个。

限制标签列表时必须谨慎行事。例如,建议使用以下条件。

建议使用以下条件,因为它允许您选择性地指定some_ok_taganother_ok_tag。但是,条件仅限制标签列表的第一个元素。该列表可能包含其他具有任意值的元素,这些元素都是允许的,因为该条件不适用于swf:tagList.member.1swf:tagList.member.2、等的任何条件。

// Example to illustrate an insecure Condition "Condition" : { "StringEqualsIfExists" : { "swf:tagList.member.0" : "some_ok_tag", "another_ok_tag" } }

解决前一个问题的一种方法是禁止使用标签列表。

以下策略要求列表中只能包含一个元素,从而确保只允许有 some_ok_taganother_ok_tag

"Condition" : { "StringEqualsIfExists" : { "swf:tagList.member.0" : "some_ok_tag", "another_ok_tag" }, "Null" : { "swf:tagList.member.1" : "true" } }

伪 API 权限和约束条件

要限制可用的决定RespondDecisionTaskCompleted,必须先允许参与者调用RespondDecisionTaskCompleted。然后,您可以使用与常规 API 相同的语法来表达相应伪 API 成员的权限,如下所示:

  • 报表 1

    资源:arn:aws:swf:*:123456789012:/domain/*

    操作:swf:RespondDecisionTaskCompleted

  • 报表 2

    资源:*

    操作:swf:ScheduleActivityTask

    状况 "StringEquals" : { "swf:activityType.name" : "SomeActivityType" }

第一个Statement允许演员打电话RespondDecisionTaskCompleted。第二条语句允许参与者利用该ScheduleActivityTask决定来指示 Amazon SWF 安排活动任务。要允许所有决定,请将 “swf:ScheduleActivityTask” 替换为 “swf: *”。

您可以使用 Condition 运算符像使用常规 API 一样地限制参数。前一个示例中的StringEquals操作员ConditionRespondDecisionTaskCompleted允许为该活动安排SomeActivityType活动任务,并且必须安排该任务。如果您想要允许 RespondDecisionTaskCompleted 使用一个参数值但又不需要它这样做,您可以替代使用 StringEqualsIfExists 运算符。

Amazon 托管策略: SimpleWorkflowFullAccess

您可以将 SimpleWorkflowFullAccess 策略附加到 IAM 身份。

该策略提供对 Amazon SWF 配置服务的完全访问权限。

IAM 策略的服务模型限制

在创建 IAM 策略时,您必须考虑服务模型限制条件。创建一个代表无效 Amazon SWF 请求的在语法上有效的 IAM 策略是有可能的;但在访问控制方面得到允许的请求仍然会因为是无效请求而失败。

例如,Amazon SWF 服务模型允许在同一个ListOpenWorkflowExecutions请求中使用typeFiltertagFilter参数。以下条件将允许服务将拒绝的呼叫(通过抛出ValidationException)为无效请求:

"Condition" : { "StringEquals" : { "swf:typeFilter.name" : "workflow_name", "swf:typeFilter.version" : "workflow_version", "swf:tagFilter.tag" : "some_tag" } }