在 Amazon 中以 IAM 角色身份运行查询 QuickSight - Amazon QuickSight

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

在 Amazon 中以 IAM 角色身份运行查询 QuickSight

您可以对连接至 Amazon Athena、Amazon Redshift 或 Amazon S3 的数据来源使用精细的访问策略,而不是更广泛的权限,从而提高数据安全性。首先,您需要创建一个 AWS Identity and Access Management (IAM)角色,该角色的权限可在人员或 API 开始查询时激活。然后,亚马逊 QuickSight 管理员或开发人员将 IAM 角色分配给 Athena 或 Amazon S3 数据源。角色到位后,任何运行查询的人员或 API 都拥有运行查询所需的确切权限。

在承诺实施运行身份角色以提高数据安全性之前,需要考虑以下几点:

  • 阐述额外的安全措施为您带来的优势。

  • 与您的 QuickSight 管理员合作,了解向数据源添加角色是否有助于您更好地实现安全目标或要求。

  • 询问对于涉及的数据来源、人员和应用程序的数量,您的团队能否以可行的方式记录和维护这种类型的安全措施? 如果不能,那么谁来承担这部分工作?

  • 在结构化组织中,将利益相关者分配到运营、开发和 IT 支持组成的平行团队中。询问他们的经验、建议以及是否愿意支持您的计划。

  • 在启动项目之前,请考虑进行概念验证,让需要访问数据的人员参与其中。

以下规则适用于在 Athena、Amazon Redshift 和 Amazon S3 中使用运行身份角色:

  • 每个数据源只能关联一个 RoleArn。数据来源的使用者(通常会访问数据集和视觉对象)可以生成许多不同类型的查询。该角色对正常工作和无法正常工作的查询设定了界限。

  • ARN 必须与使用该角色的 QuickSight 实例 AWS 账户 相同的 IAM 角色对应。

  • IAM 角色必须具有 QuickSight 允许担任该角色的信任关系。

  • 调用 QuickSight的 API 的身份必须具有传递角色的权限,然后才能更新RoleArn属性。您只需要在创建或更新角色 ARN 时传递角色。之后不会重新评估权限。同样,省略角色 ARN 时不需要权限。

  • 省略角色 ARN 时,Athena 或 Amazon S3 数据来源将使用账户范围的角色和范围缩小策略。

  • 当存在角色 ARN 时,账户范围的角色和任何范围缩小策略都将被忽略。对于 Athena 数据来源,Lake Formation 权限不会被忽略。

  • 对于 Amazon S3 数据来源,必须可以使用 IAM 角色访问清单文件和清单文件指定的数据。

  • ARN 字符串需要与数据 AWS 区域 所在 AWS 账户 和查询位置中的现有 IAM 角色相匹配。

当 QuickSight 连接到中的其他服务时 AWS,它会使用 IAM 角色。默认情况下,这个不太精细的角色版本由 QuickSight 为其使用的每项服务创建,并且该角色由 AWS 账户 管理员管理。当您添加带有自定义权限策略的 IAM 角色 ARN 时,您会为需要额外保护的数据来源覆盖更广泛的角色。有关策略的更多信息,请参阅《IAM 用户指南》中的创建客户管理型策略

使用 Athena 数据来源运行查询

使用 API 将 ARN 附加到 Athena 数据来源。为此,请在的RoleArn属性中添加角色 ARN。AthenaParameters为了进行验证,您可以在编辑 Athena 数据来源对话框中查看角色 ARN。但是,角色 ARN 是一个只读字段。

显示角色 ARN 的编辑 Athena 数据来源弹出窗口。

首先,您需要一个自定义 IAM 角色,我们在以下示例中对此进行了演示。

请记住,以下代码示例仅用于学习。此示例仅在临时开发和测试环境中使用,不能在生产环境中使用。此示例中的策略不保护任何特定资源,这些资源必须位于可部署策略中。此外,即使是为了开发,你也需要添加自己的 AWS 账户信息。

以下命令创建一个简单的新角色并附加一些向其授予权限的策略 QuickSight。

aws iam create-role \ --role-name TestAthenaRoleForQuickSight \ --description "Test Athena Role For QuickSight" \ --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "quicksight.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }'

确定或创建用于每个数据源的 IAM 角色后,使用附加策略 attach-role-policy。

aws iam attach-role-policy \ --role-name TestAthenaRoleForQuickSight \ --policy-arn arn:aws:iam::222222222222:policy/service-role/AWSQuickSightS3Policy1 aws iam attach-role-policy \ --role-name TestAthenaRoleForQuickSight \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSQuicksightAthenaAccess1 aws iam attach-role-policy \ --role-name TestAthenaRoleForQuickSight \ --policy-arn arn:aws:iam::aws:policy/AmazonS3Access1

验证权限后,您可以通过创建新角色或更新现有角色在 QuickSight 数据源中使用该角色。使用这些命令时,请更新 AWS 账户 ID 并 AWS 区域 使其与您自己的 ID 相匹配。

请记住,这些示例代码片段不适用于生产环境。 AWS 强烈建议您为生产案例确定并使用一组最低权限策略。

aws quicksight create-data-source --aws-account-id 222222222222 \ --region us-east-1 \ --data-source-id "athena-with-custom-role" \ --cli-input-json '{ "Name": "Athena with a custom Role", "Type": "ATHENA", "data sourceParameters": { "AthenaParameters": { "RoleArn": "arn:aws:iam::222222222222:role/TestAthenaRoleForQuickSight" } } }'

使用 Amazon Redshift 数据来源运行查询

将您的 Amazon Redshift 数据与运行身份角色联系起来,从而通过精细的访问策略提高数据安全性。您可以为使用公共网络或 VPC 连接的 Amazon Redshift 数据来源创建运行身份角色。您可以在编辑 Amazon Redshift 数据来源对话框中指定要使用的连接类型。Amazon Redshift 无服务器数据源不支持运行身份角色。

下图显示了使用公共网络连接类型的 Amazon Redshift 数据来源。

显示连接类型的编辑 Amazon S3 数据来源弹出窗口。

首先,您需要一个自定义 IAM 角色,我们在以下示例中对此进行了演示。以下命令创建示例新角色并附加向授予权限的策略 QuickSight。

aws iam create-role \ --role-name TestRedshiftRoleForQuickSight \ --description "Test Redshift Role For QuickSight" \ --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "quicksight.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }'

在您确定或创建用于每个数据来源的 IAM 角色后,请使用 attach-role-policy 附加策略。如果redshift:GetClusterCredentialsWithIAM权限已附加到您要使用的角色,则DatabaseUser和的值DatabaseGroups是可选的。

aws iam attach-role-policy \ --role-name TestRedshiftRoleForQuickSight \ --policy-arn arn:aws:iam:111122223333:policy/service-role/AWSQuickSightRedshiftPolicy aws iam create-policy --policy-name RedshiftGetClusterCredentialsPolicy1 \ --policy-document file://redshift-get-cluster-credentials-policy.json aws iam attach-role-policy \ --role-name TestRedshiftRoleForQuickSight \ --policy-arn arn:aws:iam:111122223333:policy/RedshiftGetClusterCredentialsPolicy1 // redshift-get-cluster-credentials-policy.json { "Version": "2012-10-17", "Statement": [ { "Sid": "RedshiftGetClusterCredentialsPolicy", "Effect": "Allow", "Action": [ "redshift:GetClusterCredentials" ], "Resource": [ "*" ] } ] }

上面的示例创建了一个使用RoleARNDatabaseUser、和 DatabaseGroups IAM 参数的数据源。如果您只想通过 IAM RoleARN 参数建立连接,请将redshift:GetClusterCredentialsWithIAM权限附加到您的角色,如下例所示。

aws iam attach-role-policy \ --role-name TestRedshiftRoleForQuickSight \ --policy-arn arn:aws:iam:111122223333:policy/RedshiftGetClusterCredentialsPolicy1 // redshift-get-cluster-credentials-policy.json { "Version": "2012-10-17", "Statement": [ { "Sid": "RedshiftGetClusterCredentialsPolicy", "Effect": "Allow", "Action": [ "redshift:GetClusterCredentialsWithIAM" ], "Resource": [ "*" ] } ] }"

验证权限后,您可以通过创建新角色或更新现有角色在 QuickSight 数据源中使用该角色。使用这些命令时,请更新 AWS 账户 ID 和 AWS 区域,使其与您自己的账号 ID 和区域一致。

aws quicksight create-data-source \ --region us-west-2 \ --endpoint https://quicksight.us-west-2.quicksight.aws.com/ \ --cli-input-json file://redshift-data-source-iam.json \ redshift-data-source-iam.json is shown as below { "AwsAccountId": "AWSACCOUNTID", "DataSourceId": "DATSOURCEID", "Name": "Test redshift demo iam", "Type": "REDSHIFT", "DataSourceParameters": { "RedshiftParameters": { "Database": "integ", "Host": "redshiftdemocluster.us-west-2.redshift.amazonaws.com", "Port": 8192, "ClusterId": "redshiftdemocluster", "IAMParameters": { "RoleArn": "arn:aws:iam::222222222222:role/TestRedshiftRoleForQuickSight", "DatabaseUser": "user", "DatabaseGroups": ["admin_group", "guest_group", "guest_group_1"] } } }, "Permissions": [ { "Principal": "arn:aws:quicksight:us-east-1:AWSACCOUNTID:user/default/demoname", "Actions": [ "quicksight:DescribeDataSource", "quicksight:DescribeDataSourcePermissions", "quicksight:PassDataSource", "quicksight:UpdateDataSource", "quicksight:DeleteDataSource", "quicksight:UpdateDataSourcePermissions" ] } ] }

如果您的数据来源使用 VPC 连接类型,请使用以下 VPC 配置。

{ "AwsAccountId": "AWSACCOUNTID", "DataSourceId": "DATSOURCEID", "Name": "Test redshift demo iam vpc", "Type": "REDSHIFT", "DataSourceParameters": { "RedshiftParameters": { "Database": "mydb", "Host": "vpcdemo.us-west-2.redshift.amazonaws.com", "Port": 8192, "ClusterId": "vpcdemo", "IAMParameters": { "RoleArn": "arn:aws:iam::222222222222:role/TestRedshiftRoleForQuickSight", "DatabaseUser": "user", "AutoCreateDatabaseUser": true } } }, "VpcConnectionProperties": { "VpcConnectionArn": "arn:aws:quicksight:us-west-2:222222222222:vpcConnection/VPC Name" }, "Permissions": [ { "Principal": "arn:aws:quicksight:us-east-1:222222222222:user/default/demoname", "Actions": [ "quicksight:DescribeDataSource", "quicksight:DescribeDataSourcePermissions", "quicksight:PassDataSource", "quicksight:UpdateDataSource", "quicksight:DeleteDataSource", "quicksight:UpdateDataSourcePermissions" ] } ] }

如果您的数据源使用redshift:GetClusterCredentialsWithIAM权限但不使用DatabaseUserDatabaseGroups参数,请向该角色授予对架构中部分或所有表的访问权限。要查看角色是否已被授予对特定表的SELECT权限,请在 Amazon Redshift 查询编辑器中输入以下命令。

SELECT u.usename, t.schemaname||'.'||t.tablename, has_table_privilege(u.usename,t.tablename,'select') AS user_has_select_permission FROM pg_user u CROSS JOIN pg_tables t WHERE u.usename = 'IAMR:RoleName' AND t.tablename = tableName

有关 Amazon Redshift 查询编辑器中该SELECT操作的更多信息,请参阅选择。

要向角色授予SELECT权限,请在 Amazon Redshift 查询编辑器中输入以下命令。

GRANT SELECT ON { [ TABLE ] table_name [, ...] | ALL TABLES IN SCHEMA schema_name [, ...] } TO "IAMR:Rolename";

有关亚马逊 Redshift 查询编辑器中该GRANT操作的更多信息,请参阅 GRANT。

使用 Amazon S3 数据来源运行查询

Amazon S3 数据源包含一个清单文件, QuickSight 用于查找和解析您的数据。您可以通过 QuickSight 控制台上传 JSON 清单文件,也可以提供指向 S3 存储桶中 JSON 文件的 URL。如果您选择提供 URL,则 QuickSight 必须获得在 Amazon S3 中访问该文件的权限。使用 QuickSight 管理控制台控制对清单文件及其引用的数据的访问权限。

借助该RoleArn属性,您可以通过覆盖账户范围角色的自定义 IAM 角色授予对清单文件及其引用的数据的访问权限。使用 API 将 ARN 附加到 Amazon S3 数据来源的清单文件。为此,请在 S3Parameters 的RoleArn属性中添加角色 ARN。为了进行验证,您可以在编辑 S3 数据来源对话框中查看角色 ARN。但是角色 ARN 是只读字段,如以下屏幕截图所示。

显示角色 ARN 的编辑 Amazon S3 数据来源弹出窗口。

首先,请创建一个 Amazon S3 清单文件。然后,您可以在创建新的 Amazon S3 数据集 QuickSight 时将其上传到亚马逊,也可以将该文件放入包含您的数据文件的 Amazon S3 存储桶中。查看以下清单文件具体形式的示例:

{ "fileLocations": [ { "URIPrefixes": [ "s3://quicksightUser-run-as-role/data/" ] } ], "globalUploadSettings": { "format": "CSV", "delimiter": ",", "textqualifier": "'", "containsHeader": "true" } }

有关如何创建清单文件的说明,请参阅 支持的 Amazon S3 清单文件格式

创建清单文件并将其添加到您的 Amazon S3 存储桶或将其上传到之后 QuickSight,在 IAM 中创建或更新授予s3:GetObject访问权限的现有角色。以下示例说明如何使用 AWS API 更新现有 IAM 角色:

aws iam put-role-policy \ --role-name QuickSightAccessToS3RunAsRoleBucket \ --policy-name GrantS3RunAsRoleAccess \ --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::s3-bucket-name" }, { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::s3-bucket-name/manifest.json" }, { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::s3-bucket-name/*" } ] }'

在您的策略授予 s3:GetObject 访问权限后,您可以开始创建将更新后的 put-role-policy 应用于 Amazon S3 数据来源清单文件的数据来源。

aws quicksight create-data-source --aws-account-id 111222333444 --region us-west-2 --endpoint https://quicksight.us-west-2.quicksight.aws.com/ \ --data-source-id "s3-run-as-role-demo-source" \ --cli-input-json '{ "Name": "S3 with a custom Role", "Type": "S3", "DataSourceParameters": { "S3Parameters": { "RoleArn": "arn:aws:iam::111222333444:role/QuickSightAccessRunAsRoleBucket", "ManifestFileLocation": { "Bucket": "s3-bucket-name", "Key": "manifest.json" } } } }'

验证权限后,您可以通过创建新角色或更新现有角色在 QuickSight 数据源中使用该角色。使用这些命令时,请务必更新 AWS 账户 ID 并 AWS 区域 与您自己的 ID 相匹配。