本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
AWS Glue 带标签的基于身份的 (IAM) 访问控制策略示例
本节包含用于控制各种 AWS Glue 操作和资源的权限的带标签的示例 AWS Identity and Access Management (IAM) 策略。您可以复制这些示例并在 IAM 控制台中对其进行编辑。然后可将其附加到 IAM 身份,如用户、角色和组。
您可以通过在 IAM 策略中附加标签并指定 resourceTag
条件来控制对爬网程序、作业、触发器和开发终端节点的访问。
使用标签的访问控制示例
例如,假设您想将对触发器 t2
的访问限制为您账户中名为 Tom
的特定用户。所有其他用户(包括 Sam
)都有权访问触发器 t1
。 触发器 t1
和 t2
具有以下属性。
aws glue get-triggers { "Triggers": [ { "State": "CREATED", "Type": "SCHEDULED", "Name": "t1", "Actions": [ { "JobName": "j1" } ], "Schedule": "cron(0 0/1 * * ? *)" }, { "State": "CREATED", "Type": "SCHEDULED", "Name": "t2", "Actions": [ { "JobName": "j1" } ], "Schedule": "cron(0 0/1 * * ? *)" } ] }
管理员已将标签值 AWS Glue (Tom
) 附加到触发器 glue:resourceTag/Name": "Tom"
。t2
管理员还为 Tom 提供了一个 AWS Glue 策略,其中包含基于标签的条件语句。IAM因此,Tom 只能使用对带标签值 Tom
的资源有效的 AWS Glue 操作。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "glue:*", "Resource": "*", "Condition": { "StringEquals": { "glue:resourceTag/Name": "Tom" } } } ] }
当 Tom 尝试访问触发器 t1
时,他收到一条指示访问被拒绝的消息。同时,他可以成功检索触发器 t2
。
aws glue get-trigger --name t1 An error occurred (AccessDeniedException) when calling the GetTrigger operation: User: Tom is not authorized to perform: glue:GetTrigger on resource: arn:aws:glue:us-east-1:123456789012:trigger/t1 aws glue get-trigger --name t2 { "Trigger": { "State": "CREATED", "Type": "SCHEDULED", "Name": "t2", "Actions": [ { "JobName": "j1" } ], "Schedule": "cron(0 0/1 * * ? *)" } }
Tom 无法使用复数 GetTriggers
API 列出触发器,因为此 API 操作不支持对标签进行筛选。
为了向 Tom 提供对 GetTriggers
的访问权限,AWS Glue 管理员创建了一个将权限拆分为两部分的策略。一个部分允许 Tom 使用 GetTriggers
API 操作访问所有触发器。第二个部分允许 Tom 访问使用值 Tom
标记的 API 操作。 利用此策略,Tom 可以对触发器 GetTriggers
同时允许 GetTrigger
和 t2
访问。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "glue:GetTriggers", "Resource": "*" }, { "Effect": "Allow", "Action": "glue:*", "Resource": "*", "Condition": { "StringEquals": { "glue:resourceTag/Name": "Tom" } } } ] }
使用带 Deny 的标签的访问控制示例
编写资源策略的另一种方法是明确拒绝对资源的访问,而不是向用户授予访问权限。例如,如果 Tom 被视为团队的特殊用户,则管理员可以拒绝 Sam 和团队中的其他人对 Tom
的资源的访问。因此,Sam 可以访问几乎所有资源,但带标签值 Tom
的资源除外。 以下是 AWS Glue 管理员向 Sam 授予的资源策略。在此策略的第一个部分中,所有资源都允许所有 AWS Glue API 操作。但在第二个部分中,标记了
Tom
的那些资源将被拒绝访问。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "glue:*", "Resource": "*" }, { "Effect": "Deny", "Action": [ "glue:*" ], "Resource": [ "*" ], "Condition": { "StringEquals": { "glue:resourceTag/Name": "Tom" } } } ] }
通过使用上一个示例中的相同触发器,Sam 可以访问触发器 t1
而不是触发器 t2
。 以下示例显示了 Sam 尝试访问 t1
和 t2
时的结果。
aws glue get-trigger --name t1 { "Trigger": { "State": "CREATED", "Type": "SCHEDULED", "Name": "t1", "Actions": [ { "JobName": "j1" } ], "Schedule": "cron(0 0/1 * * ? *)" } } aws glue get-trigger --name t2 An error occurred (AccessDeniedException) when calling the GetTrigger operation: User: Sam is not authorized to perform: glue:GetTrigger on resource: arn:aws:glue:us-east-1:123456789012:trigger/t2 with an explicit deny
显式拒绝策略不适用于复数 APIs。 即使将标签值 Tom
附加到触发器 t2
,Sam 仍可以调用 GetTriggers
来查看触发器 t2
。 因此,管理员可能不希望允许访问 GetTriggers
API 操作。以下示例显示了 Sam 运行 GetTriggers
API 时的结果。
aws glue get-triggers { "Triggers": [ { "State": "CREATED", "Type": "SCHEDULED", "Name": "t1", "Actions": [ { "JobName": "j1" } ], "Schedule": "cron(0 0/1 * * ? *)" }, { "State": "CREATED", "Type": "SCHEDULED", "Name": "t2", "Actions": [ { "JobName": "j1" } ], "Schedule": "cron(0 0/1 * * ? *)" } ] }
将标签与 List 和 Batch API 操作结合使用的访问控制示例
编写资源策略的第三种方法是允许使用 List
API 操作访问资源以列出标签值的资源。然后,使用相应的 Batch
API 操作以允许访问特定资源的详细信息。利用此方法,管理员无需允许访问复数 GetCrawlers
、GetDevEndpoints
、GetJobs
或 GetTriggers
API 操作。相反,您可以允许使用以下 API 操作列出资源:
-
ListCrawlers
-
ListDevEndpoints
-
ListJobs
-
ListTriggers
此外,您可以允许使用以下 API 操作获取有关各个资源的详细信息:
-
BatchGetCrawlers
-
BatchGetDevEndpoints
-
BatchGetJobs
-
BatchGetTriggers
作为管理员,要使用此方法,您可以执行以下操作:
-
将标签添加到您的爬网程序、开发终端节点、作业和触发器。
-
拒绝用户访问
Get
API 操作,例如GetCrawlers
、GetDevEndponts
、GetJobs
和GetTriggers
。 -
要使用户能够查明他们有权访问的标记资源,请允许用户访问
List
API 操作,例如ListCrawlers
、ListDevEndponts
、ListJobs
和ListTriggers
。 -
拒绝用户访问 AWS Glue 标记 APIs,例如
TagResource
和UntagResource
。 -
允许用户使用
BatchGet
API 操作(例如BatchGetCrawlers
、BatchGetDevEndponts
、BatchGetJobs
和BatchGetTriggers
)访问资源详细信息。
例如,在调用 ListCrawlers
操作时,请提供标签值以匹配用户名。然后,结果是与提供的标签值匹配的爬网程序的列表。向 BatchGetCrawlers
提供名称列表以获取有关每个带给定标签的爬网程序的详细信息。
例如,如果 Tom 应该只能检索标记有 Tom
的触发器的详细信息,管理员可以向 Tom
的触发器添加标签,拒绝所有用户对 GetTriggers
API 操作的访问权限,并允许所有用户访问 ListTriggers
和 BatchGetTriggers
。 以下是 AWS Glue 管理员向 Tom 授予的资源策略。在策略的第一个部分中,AWS Glue 拒绝 GetTriggers
API 操作。 在策略的第二部分中,允许对所有资源使用 ListTriggers
。但在第三个部分中,允许使用 BatchGetTriggers
访问标记了 Tom
的那些资源。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "glue:GetTriggers", "Resource": "*" }, { "Effect": "Allow", "Action": [ "glue:ListTriggers" ], "Resource": [ "*" ] }, { "Effect": "Allow", "Action": [ "glue:BatchGetTriggers" ], "Resource": [ "*" ], "Condition": { "StringEquals": { "glue:resourceTag/Name": "Tom" } } } ] }
通过使用上一个示例中的相同触发器,Tom 可以访问触发器 t2
而不是触发器 t1
。 以下示例显示了 Tom 尝试使用 t1
访问 t2
和 BatchGetTriggers
时的结果。
aws glue batch-get-triggers --trigger-names t2 { "Triggers": { "State": "CREATED", "Type": "SCHEDULED", "Name": "t2", "Actions": [ { "JobName": "j2" } ], "Schedule": "cron(0 0/1 * * ? *)" } } aws glue batch-get-triggers --trigger-names t1 An error occurred (AccessDeniedException) when calling the BatchGetTriggers operation: No access to any requested resource.
以下示例显示了 Tom 尝试通过同一 BatchGetTriggers
调用访问触发器 t2
和触发器 t3
(不存在)时的结果。请注意,由于 Tom 有权访问触发器 t2
且该触发器存在,因此,仅返回 t2
。虽然 Tom 有权访问触发器 t3
,但触发器 t3
不存在,因此在 "TriggersNotFound": []
列表的响应中将返回 t3
。
aws glue batch-get-triggers --trigger-names t2 t3 { "Triggers": { "State": "CREATED", "Type": "SCHEDULED", "Name": "t2", "Actions": [ { "JobName": "j2" } ], "TriggersNotFound": ["t3"], "Schedule": "cron(0 0/1 * * ? *)" } }