本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon SimIdentity and Access Management Workflow Servic
访问 Amazon SWF 时需要具备以下凭证Amazon可以用来验证您的请求。这些凭证必须有权访问 Amazon 资源,例如从其他 Amazon 资源检索事件数据。下面几节提供有关如何使用的详细信息Amazon Identity and Access Management(IAM)Amazon SWF 通过控制可以访问资源的对象来保护资源:
身份验证
您可以以下面任一类型的身份访问Amazon:
-
Amazon账户根用户— 注册时Amazon,您会提供与您账户关联的电子邮件地址和密码。这些是您的根凭证,它们提供对您所有 Amazon 资源的完全访问权限。
-
IAM 用户— 一个IAM 用户是您的账户中具有特定的自定义权限(例如,用于在 Amazon SWF 中发送事件数据的权限)的身份。您可以使用 IAM 用户名和密码登录以保护Amazon网页(如 Amazon Web Services Management Console
、Amazon论坛 或 Amazon Web Services Support 中心 )的安全。 除了用户名和密码之外,您还可以为每个用户生成访问密钥。在通过几个开发工具包之一
或使用 Amazon Command Line Interface(Amazon CLI) 以编程方式访问Amazon服务时,可以使用这些密钥。软件开发工具包和 Amazon CLI 工具使用访问密钥对您的请求进行加密签名。如果您不使用Amazon工具,则必须自行对请求签名。Amazon Simple WorkSignature Version 4,用于对入站 API 请求进行验证的协议。有关身份验证请求的更多信息,请参阅 Amazon Web Services 一般参考中的签名版本 4 签名流程。 -
IAM 角色— 一个IAM 角色是可在账户中创建的具有特定权限的具有特定权限的另一个 IAM 身份。它类似于IAM 用户,但未与特定人员相关联。利用 IAM 角色,可以获得临时访问密钥,用于访问 Amazon 服务和资源。具有临时凭证的 IAM 角色在以下情况下很有用:
-
联合身份用户访问 – 您可以不创建 IAM 用户,而是使用来自 Amazon Directory Service、您的企业用户目录或 Web 身份提供商 (IdP) 的既有身份。这些用户被称为联合用户。在通过身份提供者请求访问权限时,Amazon 将为联合身份用户分配角色。有关联合身份用户的更多信息,请参阅 IAM 用户指南中的联合身份用户和角色。
-
跨账户访问权限— 您可以使用您账户中的 IAM 角色向另一个账户授予对您账户中的资源的访问权限。有关示例,请参阅教程:委托对方的访问权限Amazon使用 IAM 角色的账户在IAM 用户指南.
-
Amazon服务访问— 您可以使用您账户中的 IAM 角色向向授予对Amazon提供访问账户资源所需的权限。例如,您可以创建一个角色以允许 Amazon Redshift 代表您访问 Amazon S3 存储桶,然后将存储在该存储桶中的数据加载到 Amazon Redshift 集群中。有关更多信息,请参阅《IAM 用户指南》中的创建向Amazon服务委派权限的角色。
-
在Amazon EC2 上运行的应用程序 – 您不用将访问密钥存储在 EC2 实例中以供实例上运行的应用程序使用并发出 Amazon API 请求,而是可以使用 IAM 角色管理这些应用程序的临时凭证。要将Amazon角色分配给 EC2 实例并使其对该实例的所有应用程序可用,您可以创建一个附加到实例的实例配置文件。实例配置文件包含角色,并使 EC2 实例上运行的程序能够获得临时凭证。有关更多信息,请参阅 IAM 用户指南中的对 Amazon EC2 上的应用程序使用角色。
-
访问控制
您可以使用有效的凭证来对自己的请求进行身份验证,但您还必须拥有权限才能创建或访问 Amazon SWF 资源。例如,您必须具有权限才能调用Amazon Lambda、Amazon Simple Notification Service (Amazon SNS) 和与您的 Amazon Simple Qeue Service (Amazon SWF QS)
下面几节介绍如何管理 Amazon SWF 的权限。我们建议您先阅读概述。
基本原理
Amazon SWF 访问控制主要基于两种类型的权限:
-
资源权限:用户可以访问哪些 Amazon SWF 资源。
您可以只针对域授予资源权限。
-
API 权限:用户可以调用哪些 Amazon SWF 操作。
最简单的方法是授予账户完全访问权限(调用任何域中的任何 Amazon SWF 操作)或完全拒绝访问。但是,IAM 支持更精细的访问控制方法,这种方法通常更有用。例如,您可以:
-
允许用户不受限制地调用任何 Amazon SWF 操作,但只能在指定的域中调用任何 Amazon SWF 操作。您可以使用这样一个策略允许开发中的工作流应用程序使用任何操作,但只能是“沙盒”域。
-
允许用户访问任何域,但限制其使用 API 的方法。您可以使用这样一个策略允许“审核员”应用程序在任何域中调用 API,但只允许读取访问。
-
允许用户在特定域中只调用一组有限的操作。您可以使用这样一个策略允许工作流启动程序只在特定域中调用
StartWorkflowExecution
操作。
Amazon SWF 访问控制基于以下原则:
-
访问控制决策仅基于 IAM 策略;所有策略审计和操作均通过 IAM 完成。
-
访问控制模型使用 deny-by-default 政策;任何未明确允许的访问都将被拒绝。
-
您可以通过向工作流程的参与者附加适当的 IAM 策略来控制对 Amazon SWF 资源的访问。
-
资源权限只能针对域授予。
-
您可以通过将条件应用到一个或多个参数上来进一步限制某些操作的使用。
-
如果您授予使用权限RespondDecisionTaskCompleted,您可以对该操作中包含的决策列表表示权限。
每个决策都由一个或多个参数,就像常规 API 调用那样。为了使策略可读性强一点,您可以授予决策权限,就像它们是实际的 API 调用那样,还包括将条件应用于一些参数。这些类型的权限被称为 伪 API 权限。
有关能用条件进行限制的常规和伪 API 参数的摘要,请参阅 API 摘要。
Amazon SWF IAM 策略
IAM 策略包含一个或多个Statement
元素,每个元素都包含一组定义策略的元素。有关元素的完整列表和有关如何构建策略的一般性讨论,请参阅访问策略语言. Amazon SWF 访问控制基于以下要素:
- 效果
-
(必需) 该语句的效果:
deny
或allow
。注意 您必须明确允许访问;默认情况下,IAM 拒绝访问。
- 资源
-
(必选)资源-中的实体Amazon用户可以与之交互的服务——该声明适用于。
您可以只针对域授予资源权限。例如,策略只允许对您的账户中特定域进行访问。要表达对域的权限,请设置
Resource
改为该域名的亚马逊资源名称 (ARN),其格式为 “arn: aws: swf:区域
:AccountID
:/域/DomainName
“。区域
是Amazon区域,AccountID
是没有短划线的账户 ID,并且DomainName
是域名。 - 操作
-
(必需) 应用语句的操作,可以通过以下格式引用:
serviceId
:action
。对于Amazon SWF,请设置Service
到swf
. 例如,swf:StartWorkflowExecution
指的是StartWorkflowExecution操作,用于控制允许哪些用户启动工作流程。如果您授予使用权限RespondDecisionTaskCompleted,您还可以使用使用控制对包含的决策列表的访问
Action
表示虚拟 API 的权限。由于 IAM 默认拒绝访问,因此必须明确允许决策者的决定,否则将不被接受。您可以使用*
值允许所有决策。 - 条件
-
(可选) 表示一个或多个操作参数的约束条件,以限制允许的值。
Amazon SWF 操作的范围通常很广,您可以使用 IAM 条件来缩小范围。例如,要限制列出哪个任务PollForActivityTask允许访问操作,您必须包括
Condition
然后使用swf:taskList.name
用于指定允许列表的密钥。您可以表达下列实体的约束条件。
-
工作流类型。名称和版本具有单独密钥。
-
活动类型。名称和版本具有单独密钥。
-
任务列表。
-
标签。您可以为某些操作指定多个标签。在此情况下,每个标签都有一个单独的密钥。
注意 对于 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" } ] }
如果您将此政策附加给参与者,则该参与者可以使用任何 Amazon SWF 操作department1
和department2
域。有时候,您还可以使用通配符表示多个域。
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:ScheduleActivityTask“带有 “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 策略时必须考虑服务模型限制。可以创建语法上有效的 IAM 策略来表示无效的 Amazon SWF 请求;在访问控制方面允许的请求仍然会失败,因为它是无效的请求。
对于实例,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 服务模式不允许typeFilter
和tagFilter
要在同一个地方使用的参数ListOpenWorkflowExecutions
请求。因此,该策略允许服务通过抛出来拒绝的呼叫ValidationException
—作为无效请求。
API 摘要
本节简要介绍如何使用 IAM 策略来控制参与者如何使用每个 API 和伪 API 来访问 Amazon SWF 资源。
-
对于除
RegisterDomain
和ListDomains
之外的所有操作,您可以通过授予域资源权限的方式允许或拒绝对任何或所有账户域的访问。 -
您可以允许或拒绝任何常规 API 成员的权限,如果您授权调用
RespondDecisionTaskCompleted
,还可以允许或拒绝任何伪 API 成员的权限。 -
您可以使用 Condition 限制某些参数的可允许值。
以下章节列出了可针对每个常规和伪 API 成员限制的参数,并提供了相关密钥,指出您可以根据其控制域访问的任何限制条件。
常规 API
本章节列出了常规 API 成员,并简要描述了可进行限制的参数和相关密钥。它还指出了您可以根据其控制域访问的任何限制条件。
-
tagFilter.tag
— 字符串约束。密钥是swf:tagFilter.tag
-
typeFilter.name
— 字符串约束。密钥是swf:typeFilter.name
。 -
typeFilter.version
— 字符串约束。密钥是swf:typeFilter.version
。
CountClosedWorkflowExecutions
要求 typeFilter
和 tagFilter
相互排斥。
-
tagFilter.tag
— 字符串约束。密钥是swf:tagFilter.tag
-
typeFilter.name
— 字符串约束。密钥是swf:typeFilter.name
。 -
typeFilter.version
— 字符串约束。密钥是swf:typeFilter.version
。
CountOpenWorkflowExecutions
要求 typeFilter
和 tagFilter
相互排斥。
-
taskList.name
— 字符串约束。密钥是swf:taskList.name
。
-
taskList.name
— 字符串约束。密钥是swf:taskList.name
。
-
activityType.name
— 字符串约束。密钥是swf:activityType.name
。 -
activityType.version
— 字符串约束。密钥是swf:activityType.version
。
-
您不能限制此操作的参数。
-
workflowType.name
— 字符串约束。密钥是swf:workflowType.name
。 -
workflowType.version
— 字符串约束。密钥是swf:workflowType.version
。
-
activityType.name
— 字符串约束。密钥是swf:activityType.name
。 -
activityType.version
— 字符串约束。密钥是swf:activityType.version
。
-
您不能限制此操作的参数。
-
您不能限制此操作的参数。
-
workflowType.name
— 字符串约束。密钥是swf:workflowType.name
。 -
workflowType.version
— 字符串约束。密钥是swf:workflowType.version
。
-
您不能限制此操作的参数。
-
您不能限制此操作的参数。
-
tagFilter.tag
— 字符串约束。密钥是swf:tagFilter.tag
-
typeFilter.name
— 字符串约束。密钥是swf:typeFilter.name
。 -
typeFilter.version
— 字符串约束。密钥是swf:typeFilter.version
。
ListClosedWorkflowExecutions
要求 typeFilter
和 tagFilter
相互排斥。
-
您不能限制此操作的参数。
-
tagFilter.tag
— 字符串约束。密钥是swf:tagFilter.tag
-
typeFilter.name
— 字符串约束。密钥是swf:typeFilter.name
。 -
typeFilter.version
— 字符串约束。密钥是swf:typeFilter.version
。
ListOpenWorkflowExecutions
要求 typeFilter
和 tagFilter
相互排斥。
-
您不能限制此操作的参数。
-
taskList.name
— 字符串约束。密钥是swf:taskList.name
。
-
taskList.name
— 字符串约束。密钥是swf:taskList.name
。
-
您不能限制此操作的参数。
-
defaultTaskList.name
— 字符串约束。密钥是swf:defaultTaskList.name
。 -
name
— 字符串约束。密钥是swf:name
。 -
version
— 字符串约束。密钥是swf:version
。
-
name
— 正在注册的域名可用作此操作的资源。
-
defaultTaskList.name
— 字符串约束。密钥是swf:defaultTaskList.name
。 -
name
— 字符串约束。密钥是swf:name
。 -
version
— 字符串约束。密钥是swf:version
。
RequestCancelWorkflowExecution
-
您不能限制此操作的参数。
-
您不能限制此操作的参数。
-
您不能限制此操作的参数。
-
您不能限制此操作的参数。
-
decisions.member.N
— 通过伪 API 权限间接限制。有关详细信息,请参阅伪 API。
-
您不能限制此操作的参数。
-
tagList.member.0
— 字符串约束。密钥是swf:tagList.member.0
-
tagList.member.1
— 字符串约束。密钥是swf:tagList.member.1
-
tagList.member.2
— 字符串约束。密钥是swf:tagList.member.2
-
tagList.member.3
— 字符串约束。密钥是swf:tagList.member.3
-
tagList.member.4
— 字符串约束。密钥是swf:tagList.member.4
-
taskList.name
— 字符串约束。密钥是swf:taskList.name
。 -
workflowType.name
— 字符串约束。密钥是swf:workflowType.name
。 -
workflowType.version
— 字符串约束。密钥是swf:workflowType.version
。
限制的标签不能超过五个。
-
您不能限制此操作的参数。
伪 API
本章节列出了表示 RespondDecisionTaskCompleted
中所包含决策的伪 API 成员。如果您已授权使用 RespondDecisionTaskCompleted
,您的策略会用与常规 API 相同的方法来授予此 API 成员权限。您可以通过设置一个或多个参数的条件来限制伪 API 的某些成员。本章节列出了伪 API 成员,并简要描述了可进行限制的参数与相关密钥。
aws:SourceIP
、aws:UserAgent
和 aws:SecureTransport
密钥不可用于伪 API。如果您的预期安全策略需要这些密钥对伪 API 进行访问控制,您可以将其用于 RespondDecisionTaskCompleted
操作。
CancelTimer
-
您不能限制此操作的参数。
CancelWorkflowExecution
-
您不能限制此操作的参数。
CompleteWorkflowExecution
-
您不能限制此操作的参数。
ContinueAsNewWorkflowExecution
-
tagList.member.0
— 字符串约束。密钥是swf:tagList.member.0
-
tagList.member.1
— 字符串约束。密钥是swf:tagList.member.1
-
tagList.member.2
— 字符串约束。密钥是swf:tagList.member.2
-
tagList.member.3
— 字符串约束。密钥是swf:tagList.member.3
-
tagList.member.4
— 字符串约束。密钥是swf:tagList.member.4
-
taskList.name
— 字符串约束。密钥是swf:taskList.name
。 -
workflowTypeVersion
— 字符串约束。密钥是swf:workflowTypeVersion
。
限制的标签不能超过五个。
FailWorkflowExecution
-
您不能限制此操作的参数。
RecordMarker
-
您不能限制此操作的参数。
RequestCancelActivityTask
-
您不能限制此操作的参数。
RequestCancelExternalWorkflowExecution
-
您不能限制此操作的参数。
ScheduleActivityTask
-
activityType.name
— 字符串约束。密钥是swf:activityType.name
。 -
activityType.version
— 字符串约束。密钥是swf:activityType.version
。 -
taskList.name
— 字符串约束。密钥是swf:taskList.name
。
SignalExternalWorkflowExecution
-
您不能限制此操作的参数。
StartChildWorkflowExecution
-
tagList.member.0
— 字符串约束。密钥是swf:tagList.member.0
-
tagList.member.1
— 字符串约束。密钥是swf:tagList.member.1
-
tagList.member.2
— 字符串约束。密钥是swf:tagList.member.2
-
tagList.member.3
— 字符串约束。密钥是swf:tagList.member.3
-
tagList.member.4
— 字符串约束。密钥是swf:tagList.member.4
-
taskList.name
— 字符串约束。密钥是swf:taskList.name
。 -
workflowType.name
— 字符串约束。密钥是swf:workflowType.name
。 -
workflowType.version
— 字符串约束。密钥是swf:workflowType.version
。
限制的标签不能超过五个。
StartTimer
-
您不能限制此操作的参数。