本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon SWF IAM 策略
IAM 策略包含一个或多个 Statement
元素,每个元素都包含一组定义该策略的元素。有关元素的完整列表以及如何构建策略的一般性讨论,请参阅 The Access Policy Language。Amazon SWF 访问控制基于以下元素:
- 效果
-
(必需) 该语句的效果:
deny
或allow
。注意
您必须显式允许访问;默认情况下,IAM 会拒绝访问。
- 资源
-
(必需)该语句适用的资源( Amazon 服务中用户可以与之交互的实体)。
您可以只针对域授予资源权限。例如,策略只允许对您的账户中特定域进行访问。
要表达对域名的权限,请
Resource
将其设置为该域的亚马逊资源名称 (ARN),其格式为 “arn: aws: swf:区域
:accountID:/domain/”。DomainName
区域
是 Amazon 区域,accoun
tID 是没有破折号的账户 IDDomainName
,也是域名。 - 操作
-
(必需) 应用语句的操作,可以通过以下格式引用:
serviceId
:action
。对于 Amazon SWF,将serviceID
设置为swf
。例如,swf:StartWorkflowExecution
指的是StartWorkflow执行操作,用于控制允许哪些用户启动工作流程。如果您授予使用权限 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" } ] }
如果将此策略附加到一个操作者,它就可以使用 department1
和 department2
域中的任何 Amazon SWF 操作。有时候,您还可以使用通配符表示多个域。
API 权限和约束条件
您控制用户可以对 Action
操作元素使用哪些操作。您可以选择通过使用 Condition
元素限制操作的可允许参数值。
如果您想将参与者限制为只进行特定操作,您可以使用与下述类似的方法:
{ "Version": "2012-10-17", "Statement": [ { "Effect" : "Allow", "Action" : "swf:StartWorkflowExecution", "Resource" : "arn:aws:swf:*:123456789012:/domain/department2" } ] }
如果将此策略附加到操作者,它能调用 StartWorkflowExecution
在 department2
域中启动工作流。它不能在任何其他域中使用任何其他操作或启动工作流。
您可以进一步限制参与者通过限制一个或多个 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
操作的 name
和 version
参数。如果将此策略附加到操作者,它只能在 department1
域中运行 workflow1
的 version2
,且两个参数都必须包含在请求中。
您可以使用 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_tag
或 another_ok_tag
。但是,此策略只会限制标签列表的第一个元素。列表可以有包含都会被允许的任意值的其他元素,因为此策略不会对 swf:tagList.member.1
、swf:tagList.member.2
等等应用任何条件。
解决此问题的一个方法是禁止使用标签列表。以下策略要求列表中只能包含一个元素,从而确保只允许有 some_ok_tag
或 another_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:ScheduleActivity任务” 替换为 “swf: *”。
您可以使用 Condition 运算符像使用常规 API 一样地限制参数。此 Condition
的 StringEquals
运算符允许 RespondDecisionTaskCompleted
为 SomeActivityType
活动安排一个活动任务,并且它必须安排该任务。如果您想要允许 RespondDecisionTaskCompleted
使用一个参数值但又不需要它这样做,您可以替代使用 StringEqualsIfExists
运算符。
Amazon 托管策略: 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
请求中使用 typeFilter
和 tagFilter
参数。因此,该策略允许通过引发无效请求 ValidationException
来拒绝服务的调用。