如何使用原生 AWS 功能通过分区保护对 athena/glue table 的访问
How to secure access to an athena/glue table by partition using native AWS features
我有一个使用启用了身份验证的 Amplify 的 React 应用程序。该应用程序有很多用户,他们都是一个“客户”的成员,仅此而已。
我希望能够使用 IAM 限制作为客户端成员的用户对 Glue table 中数据的访问,这样我就有了一个接近数据层的安全层尽可能。
我在 table 中有一个 'clientid' 分区。 table 由 s3 存储桶支持,每个客户端的数据存储在他们自己的 'clientid=xxxxxx' 文件夹中。 table 是由 Glue 作业创建的,最后在 "write_dynamic_frame" 方法中使用以下选项创建了文件夹。
{"partitionKeys": ["clientid"]},
我的第一个想法是在前端使用 clientid 将用户的客户端 ID 烘焙到 select 只是他们的分区的查询中,但很明显,这很容易被滥用。
然后我尝试使用 Glue 爬虫扫描现有 table 的 s3 存储桶,希望它能为每个文件夹创建一个 table,如果我取消选中 “为每个 S3 路径创建一个模式” 选项。但是,爬虫 'sees' 将文件夹作为分区(大概,至少部分是由于蜂巢分区结构),我又得到一个 table。
有成千上万的客户端和 TB 的数据,因此 moving/renaming 数据和手动创建 table 是不可行的。
请帮忙!
我假设您已经有一种机制可以为前端的每个用户分配一个 IAM 角色(个人或每个客户端),否则这是一个大话题,可能应该是它自己的问题。
解决您问题的最基本方法是确保 IAM 角色仅对允许用户访问的分区前缀具有 s3:GetObject
权限。这意味着用户只能访问自己的数据,如果他们尝试访问其他用户的数据,将会收到错误消息。不过,他们可能会通过尝试不同的组合并观察未命中任何分区的查询(这是允许的,因为不会访问任何文件)与查询命中分区(这将不允许)。
我认为最好为每个客户端创建表,甚至数据库,这样您也可以在 Glue 数据目录级别设置权限,根本不允许对其他 databases/tables 的查询而不是用户自己的。不幸的是,Glue Crawlers 不会帮助你,他们能做的事情太有限,并且会尝试以无益的方式提供帮助。您可以使用 Glue 数据目录轻松创建这些表 API,并且无需移动任何数据,只需将表的位置指向当前分区的位置即可。
我有一个使用启用了身份验证的 Amplify 的 React 应用程序。该应用程序有很多用户,他们都是一个“客户”的成员,仅此而已。
我希望能够使用 IAM 限制作为客户端成员的用户对 Glue table 中数据的访问,这样我就有了一个接近数据层的安全层尽可能。
我在 table 中有一个 'clientid' 分区。 table 由 s3 存储桶支持,每个客户端的数据存储在他们自己的 'clientid=xxxxxx' 文件夹中。 table 是由 Glue 作业创建的,最后在 "write_dynamic_frame" 方法中使用以下选项创建了文件夹。
{"partitionKeys": ["clientid"]},
我的第一个想法是在前端使用 clientid 将用户的客户端 ID 烘焙到 select 只是他们的分区的查询中,但很明显,这很容易被滥用。
然后我尝试使用 Glue 爬虫扫描现有 table 的 s3 存储桶,希望它能为每个文件夹创建一个 table,如果我取消选中 “为每个 S3 路径创建一个模式” 选项。但是,爬虫 'sees' 将文件夹作为分区(大概,至少部分是由于蜂巢分区结构),我又得到一个 table。
有成千上万的客户端和 TB 的数据,因此 moving/renaming 数据和手动创建 table 是不可行的。
请帮忙!
我假设您已经有一种机制可以为前端的每个用户分配一个 IAM 角色(个人或每个客户端),否则这是一个大话题,可能应该是它自己的问题。
解决您问题的最基本方法是确保 IAM 角色仅对允许用户访问的分区前缀具有 s3:GetObject
权限。这意味着用户只能访问自己的数据,如果他们尝试访问其他用户的数据,将会收到错误消息。不过,他们可能会通过尝试不同的组合并观察未命中任何分区的查询(这是允许的,因为不会访问任何文件)与查询命中分区(这将不允许)。
我认为最好为每个客户端创建表,甚至数据库,这样您也可以在 Glue 数据目录级别设置权限,根本不允许对其他 databases/tables 的查询而不是用户自己的。不幸的是,Glue Crawlers 不会帮助你,他们能做的事情太有限,并且会尝试以无益的方式提供帮助。您可以使用 Glue 数据目录轻松创建这些表 API,并且无需移动任何数据,只需将表的位置指向当前分区的位置即可。