Amazon SWF IAM 策略 - Amazon Simple Workflow Service

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

Amazon SWF IAM 策略

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

效果

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

注意

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

资源

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

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

操作

(必需) 应用语句的操作,可以通过以下格式引用:serviceId:action。对于 Amazon SWF,将 serviceID 设置为 swf。例如,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 策略。有关详细信息,请参阅字符串条件

Amazon SWF 策略示例

一个工作流由多个操作者组成,包括活动、决策程序等。您可以通过附加适当的 IAM 策略控制每个操作者的访问权限。本章节提供了一些示例。以下所示为最简单的案例:

{ "Version": "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Action" : "swf:*", "Resource" : "arn:aws:swf:*:123456789012:/domain/*" } ] }

如果您将此策略附加到参与者,它对所有地区的账户都有访问权。您可以使用通配符利用一个值来表示多个资源、操作或地区。

  • Resource 值中的第一个通配符 (*) 表示资源权限适用于所有区域。要将权限限制在单个区域,请使用适当的区域字符串替换通配符,如 us-east-1。

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

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

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

以下章节显示的是以更精细方法授予权限的策略的示例。

域权限

如果您想将部门工作流限制到一个特定域中,您可以使用与下述类似的方法:

{ "Version": "2012-10-17", "Statement": [ { "Effect" : "Allow", "Action" : "swf:*", "Resource" : "arn:aws:swf:*:123456789012:/domain/department1" } ] }

如果您附加此策略到参与者,它可以调用任何操作,但只能针对 department1 域。

如果您希望参与者有权访问多个域,您可以针对每个域单独授予权限,如下所述:

{ "Version": "2012-10-17", "Statement": [ { "Effect" : "Allow", "Action" : "swf:*", "Resource" : "arn:aws:swf:*:123456789012:/domain/department1" }, { "Effect" : "Allow", "Action" : "swf:*", "Resource" : "arn:aws:swf:*:123456789012:/domain/department2" } ] }

如果将此策略附加到一个操作者,它就可以使用 department1department2 域中的任何 Amazon SWF 操作。有时候,您还可以使用通配符表示多个域。

API 权限和约束条件

您控制用户可以对 Action 操作元素使用哪些操作。您可以选择通过使用 Condition 元素限制操作的可允许参数值。

如果您想将参与者限制为只进行特定操作,您可以使用与下述类似的方法:

{ "Version": "2012-10-17", "Statement": [ { "Effect" : "Allow", "Action" : "swf:StartWorkflowExecution", "Resource" : "arn:aws:swf:*:123456789012:/domain/department2" } ] }

如果将此策略附加到操作者,它能调用 StartWorkflowExecutiondepartment2 域中启动工作流。它不能在任何其他域中使用任何其他操作或启动工作流。

您可以进一步限制参与者通过限制一个或多个 StartWorkflowExecution 参数值启动的工作流范围,如下所述:

{ "Version": "2012-10-17", "Statement": [ { "Effect" : "Allow", "Action" : "swf:StartWorkflowExecution", "Resource" : "arn:aws:swf:*:123456789012:/domain/department1", "Condition" : { "StringEquals" : { "swf:workflowType.name" : "workflow1", "swf:workflowType.version" : "version2" } } } ] }

此策略限制 StartWorkflowExecution 操作的 nameversion 参数。如果将此策略附加到操作者,它只能在 department1 域中运行 workflow1version2,且两个参数都必须包含在请求中。

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

{ "Version": "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Action" : "swf:StartWorkflowExecution", "Resource" : "arn:aws:swf:*:123456789012:/domain/some_domain", "Condition" : { "StringEqualsIfExists" : { "swf:taskList.name" : "task_list_name" } } } ] }

参与者可通过此策略在启动工作流执行时选择性地指定任务列表。

您可以限制某些操作的标签列表。在此情况下,每个标签都有一个单独的密钥,所以您会使用 swf:tagList.member.0 限制列表中的第一个标签,使用 swf:tagList.member.1 限制列表中的第二个标签,以此类推,最多能限制 5 个。但是,对于标签列表的限制方法,您必须要谨慎。关于实例,下面是推荐策略的示例:

{ "Version": "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Action" : "swf:StartWorkflowExecution", "Resource" : "arn:aws:swf:*:123456789012:/domain/some_domain", "Condition" : { "StringEqualsIfExists" : { "swf:tagList.member.0" : "some_ok_tag", "another_ok_tag" } } } ] }

此策略允许您选择指定 some_ok_taganother_ok_tag。但是,此策略只会限制标签列表的第一个元素。列表可以有包含都会被允许的任意值的其他元素,因为此策略不会对 swf:tagList.member.1swf:tagList.member.2 等等应用任何条件。

解决此问题的一个方法是禁止使用标签列表。以下策略要求列表中只能包含一个元素,从而确保只允许有 some_ok_taganother_ok_tag

{ "Version": "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Action" : "swf:StartWorkflowExecution", "Resource" : "arn:aws:swf:*:123456789012:/domain/some_domain", "Condition" : { "StringEqualsIfExists" : { "swf:tagList.member.0" : "some_ok_tag", "another_ok_tag" }, "Null" : { "swf:tagList.member.1" : "true" } } } ] }

伪 API 权限和约束条件

如果您想限制提供给 RespondDecisionTaskCompleted 的决策,您首先必须允许参与者调用 RespondDecisionTaskCompleted。然后,您可以使用常规 API 的句法,授予适当伪 API 成员权限,如下所示:

{ "Version": "2012-10-17", "Statement" : [ { "Resource" : "arn:aws:swf:*:123456789012:/domain/*", "Action" : "swf:RespondDecisionTaskCompleted", "Effect" : "Allow" }, { "Resource" : "*", "Action" : "swf:ScheduleActivityTask", "Effect" : "Allow", "Condition" : { "StringEquals" : { "swf:activityType.name" : "SomeActivityType" } } } ] }

如果您将此策略附加到参与者,第一个 Statement 元素将允许参与者调用 RespondDecisionTaskCompleted。第二个元素允许操作者使用 ScheduleActivityTask 决策来指导 Amazon SWF 计划活动任务。要允许所有决定,请将 “swf:ScheduleActivityTask” 替换为 “swf: *”。

您可以使用 Condition 运算符像使用常规 API 一样地限制参数。此 ConditionStringEquals 运算符允许 RespondDecisionTaskCompletedSomeActivityType 活动安排一个活动任务,并且它必须安排该任务。如果您想要允许 RespondDecisionTaskCompleted 使用一个参数值但又不需要它这样做,您可以替代使用 StringEqualsIfExists 运算符。

AWS 托管策略: SimpleWorkflowFullAccess

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

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

权限详细信息

该策略包含以下权限。

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

IAM 策略的服务模型限制

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

对于实例,ListOpenWorkflowExecutions 建议对 使用以下策略:

{ "Version": "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Action" : "swf:ListOpenWorkflowExecutions", "Resource" : "arn:aws:swf:*:123456789012:/domain/domain_name", "Condition" : { "StringEquals" : { "swf:typeFilter.name" : "workflow_name", "swf:typeFilter.version" : "workflow_version", "swf:tagFilter.tag" : "some_tag" } } } ] }

Amazon SWF 服务模型不允许在同一个 ListOpenWorkflowExecutions 请求中使用 typeFiltertagFilter 参数。因此,该策略允许通过引发无效请求 ValidationException 来拒绝服务的调用。