Amazon基于资源的访问控制策略示例 - Amazon连接词
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

Amazon基于资源的访问控制策略示例

本部分包含示例资源策略,其中包括用于授予跨账户访问权限的策略。

重要

通过更改AmazonGlue 资源策略,您可能意外撤消对现有Amazon在您的账户中 Glue 合用户并导致意外中断。仅在开发或测试账户中尝试这些示例,并确保它们不会中断任何现有的工作流,然后再进行更改。

注意

IAM 策略和AmazonGlue 资源策略需要几秒钟进行传播。附加新策略后,您可能会注意到,旧策略仍有效,直至新策略传播到整个系统。

以下示例使用Amazon命令行界面 (AmazonCLI)进行交互AmazonGlue 服务 API。您可以在AmazonGlue 控制台或使用Amazon开发工具包。

设置AmazonCLI

  1. 安装AmazonCLI 中的说明进行操作安装Amazon命令行界面中的Amazon命令行界面用户指南

  2. 配置AmazonCLI 中的说明进行操作配置和证书文件。使用您的Amazon帐户管理员凭据。配置默认Amazon区域设置为 us-west-2(或您使用的区域),然后将默认输出格式设置为JSON

  3. 测试访问Amazon通过运行以下命令(替换爱丽丝与您的账户中的真正 IAM 用户或角色一起使用)。

    # Run as admin of account account-id $ aws glue put-resource-policy --profile administrator-name --region us-west-2 --policy-in-json '{ "Version": "2012-10-17", "Statement": [ { "Principal": { "AWS": [ "arn:aws:iam::account-id:user/Alice" ] }, "Effect": "Allow", "Action": [ "glue:*" ], "Resource": [ "arn:aws:glue:us-west-2:account-id:*" ] } ] }'
  4. 为账户中的每个 IAM 用户配置用户配置文件,用于测试资源策略和跨账户访问。

示例 1. 使用资源策略控制同一账户中的访问

在此示例中,账户 A 中的管理员用户创建一个资源策略,该策略向 IAM 用户授予Alice在账户 A 中对目录的完全访问权限。爱丽丝未附加 IAM 策略。

为执行此操作,管理员用户需运行以下操作AmazonCLI 命令。

# Run as admin of Account A $ aws glue put-resource-policy --profile administrator-name --region us-west-2 --policy-in-json '{ "Version": "2012-10-17", "Statement": [ { "Principal": { "AWS": [ "arn:aws:iam::account-A-id:user/Alice" ] }, "Effect": "Allow", "Action": [ "glue:*" ], "Resource": [ "arn:aws:glue:us-west-2:account-A-id:*" ] } ] }'

而不是将 JSON 策略文档作为您的AmazonCLI 命令,您可以将策略文档保存在一个文件中,然后在AmazonCLI 命令,前缀为file://。下面是具体操作示例。

$ echo '{ "Version": "2012-10-17", "Statement": [ { "Principal": { "AWS": [ "arn:aws:iam::account-A-id:user/Alice" ] }, "Effect": "Allow", "Action": [ "glue:*" ], "Resource": [ "arn:aws:glue:us-west-2:account-A-id:*" ] } ] }' > /temp/policy.json $ aws glue put-resource-policy --profile admin1 \ --region us-west-2 --policy-in-json file:///temp/policy.json

在此资源策略传播后,Alice 可以访问所有Amazon帐户 A 中的 Glue 资源,如下所示。

# Run as user Alice $ aws glue create-database --profile alice --region us-west-2 --database-input '{ "Name": "new_database", "Description": "A new database created by Alice", "LocationUri": "s3://my-bucket" }' $ aws glue get-table --profile alice --region us-west-2 --database-name "default" --table-name "tbl1"}

为了回应爱丽丝get-table调用,AmazonGlue 服务将返回以下内容。

{ "Table": { "Name": "tbl1", "PartitionKeys": [], "StorageDescriptor": { ...... }, ...... } }

示例 2. 使用资源策略授予跨账户访问权限

在此示例中,账户 A 中的资源策略用于向账户 B 中的 Bob 授予对账户 A 中所有数据目录资源的只读访问权限。为此,需要执行四个步骤:

  1. 验证账户 A 是否已将其 Amazon Athena 数据目录迁移到AmazonGlue。

    对的跨账户访问Amazon如果资源所有者账户未将其 Athena 数据目录迁移至,则不允许使用 Glue。AmazonGlue。有关如何将 Athena 目录迁移到AmazonGlue,请参阅升级到Amazon分步 Glue 数据目录中的Amazon Athena 用户指南

    # Verify that the value "ImportCompleted" is true. This value is region specific. $ aws glue get-catalog-import-status --profile admin1 --region us-west-2 { "ImportStatus": { "ImportCompleted": true, "ImportTime": 1502512345.0, "ImportedBy": "StatusSetByDefault" } }
  2. 账户 A 中的管理员创建一个资源策略,用于向账户 B 授予访问权限。

    # Run as admin of Account A $ aws glue put-resource-policy --profile admin1 --region us-west-2 --policy-in-json '{ "Version": "2012-10-17", "Statement": [ { "Principal": { "AWS": [ "arn:aws:iam::account-B-id:root" ] }, "Effect": "Allow", "Action": [ "glue:Get*", "glue:BatchGet*" ], "Resource": [ "arn:aws:glue:us-west-2:account-A-id:*" ] } ] }'
  3. 账户 B 中的管理员使用 IAM 策略向 Bob 授予对账户 A 的访问权限。

    # Run as admin of Account B $ aws iam put-user-policy --profile admin2 --user-name Bob --policy-name CrossAccountReadOnly --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "glue:Get*", "glue:BatchGet*" ], "Resource": [ "arn:aws:glue:us-west-2:account-A-id:*" ] } ] }'
  4. 验证 Bob 对账户 A 中资源的访问权限。

    # Run as user Bob. This call succeeds in listing Account A databases. $ aws glue get-databases --profile bob --region us-west-2 --catalog-id account-A-id { "DatabaseList": [ { "Name": "db1" }, { "Name": "db2" }, ...... ] } # This call succeeds in listing tables in the 'default' Account A database. $ aws glue get-table --profile alice --region us-west-2 --catalog-id account-A-id \ --database-name "default" --table-name "tbl1" { "Table": { "Name": "tbl1", "PartitionKeys": [], "StorageDescriptor": { ...... }, ...... } } # This call fails with access denied, because Bob has only been granted read access. $ aws glue create-database --profile bob --region us-west-2 --catalog-id account-A-id --database-input '{ "Name": "new_database2", "Description": "A new database created by Bob", "LocationUri": "s3://my-bucket2" }' An error occurred (AccessDeniedException) when calling the CreateDatabase operation: User: arn:aws:iam::account-B-id:user/Bob is not authorized to perform: glue:CreateDatabase on resource: arn:aws:glue:us-west-2:account-A-id:database/new_database2

在步骤 2 中,账户 A 中的管理员向账户 B 的根用户授予权限。然后,该根用户可通过将 IAM 策略附加到委托人(用户、角色、组等)来将其拥有的权限委派给这些委托人。由于管理员用户已附加完整访问权限的 IAM 策略,所以管理员将自动拥有已授予根用户的权限以及向账户中的其他 IAM 用户委派权限的权限。

也可以在步骤 2 中,直接将权限授予用户 Bob 的 Amazon 资源名称 (ARN)。这会将跨账户访问权限仅授予 Bob。但是,要使 Bob 实际获得跨账户访问权限,仍需执行步骤 3。对于跨账户访问,二者资源帐户中的资源策略需要用户账户中的 IAM 策略才能使用访问权限。这不同于示例 1 中的同一账户访问,其中资源策略或 IAM 策略可以独立授予访问权限。