AWS Glue 带标签的基于身份的 (IAM) 访问控制策略示例 - AWS Glue
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

AWS Glue 带标签的基于身份的 (IAM) 访问控制策略示例

本节包含用于控制各种 AWS Glue 操作和资源的权限的带标签的示例 AWS Identity and Access Management (IAM) 策略。您可以复制这些示例并在 IAM 控制台中对其进行编辑。然后可将其附加到 IAM 身份,如用户、角色和组。

您可以通过在 IAM 策略中附加标签并指定 resourceTag 条件来控制对爬网程序、作业、触发器和开发终端节点的访问。

使用标签的访问控制示例

例如,假设您想将对触发器 t2 的访问限制为您账户中名为 Tom 的特定用户。所有其他用户(包括 Sam)都有权访问触发器 t1。触发器 t1t2 具有以下属性。

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。AWS Glue 管理员还为 Tom 提供了一个 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 可以使用 GetTriggersGetTrigger 来访问触发器 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 尝试访问 t1t2 时的结果。

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
重要

显式拒绝策略不适用于复数 API。即使将标签值 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 操作以允许访问特定资源的详细信息。利用此方法,管理员无需允许访问复数 GetCrawlersGetDevEndpointsGetJobsGetTriggers API 操作。相反,您可以允许使用以下 API 操作列出资源:

  • ListCrawlers

  • ListDevEndpoints

  • ListJobs

  • ListTriggers

此外,您可以允许使用以下 API 操作获取有关各个资源的详细信息:

  • BatchGetCrawlers

  • BatchGetDevEndpoints

  • BatchGetJobs

  • BatchGetTriggers

作为管理员,要使用此方法,您可以执行以下操作:

  1. 将标签添加到您的爬网程序、开发终端节点、作业和触发器。

  2. 拒绝用户对 Get API 操作(例如 GetCrawlersGetDevEndpontsGetJobsGetTriggers)的访问。

  3. 要使用户能够查明他们有权访问的标记资源,请允许用户访问 List API 操作,例如 ListCrawlersListDevEndpontsListJobsListTriggers

  4. 拒绝用户对 AWS Glue 标记 API(例如 TagResourceUntagResource)的访问。

  5. 允许用户使用 BatchGet API 操作(例如 BatchGetCrawlersBatchGetDevEndpontsBatchGetJobsBatchGetTriggers)访问资源详细信息。

例如,在调用 ListCrawlers 操作时,请提供标签值以匹配用户名。然后,结果是与提供的标签值匹配的爬网程序的列表。向 BatchGetCrawlers 提供名称列表以获取有关每个带给定标签的爬网程序的详细信息。

例如,如果 Tom 应只能检索标记了 Tom 的触发器的详细信息,管理员可将标签添加到 Tom 的触发器,拒绝所有用户对 GetTriggers API 操作的访问,并允许所有用户访问 ListTriggersBatchGetTriggers。以下是 AWS Glue 管理员向 Tom 授予的资源策略。在此策略的第一个部分中,GetTriggers 拒绝 AWS Glue 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 尝试使用 BatchGetTriggers 访问 t1t2 时的结果。

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 * * ? *)" } }