BigQuery 中行级安全性的最佳做法
本文档介绍了使用行级安全性时的最佳做法。
在阅读本文档之前,请先阅读以下内容以熟悉行级安全性:BigQuery 行级安全性简介和使用行级安全性。
限制用户权限以限制旁道攻击
旁道攻击是一种基于从系统本身获取的信息的安全攻击。具有比所需范围更广权限的攻击者可以更轻松地装载旁道攻击,并通过观察或搜索结算、日志记录或系统消息来获知敏感数据。
为了减少此类机会,BigQuery 会对面向具有行级安全性的表的所有查询隐藏敏感统计信息。这些敏感统计信息包括处理的字节数和分区数、计费字节数以及查询计划阶段。
我们建议管理员不要向只应查看过滤后数据的用户授予以下权限,以避免授予对敏感数据的访问权限。
权限 | 敏感数据 |
---|---|
Project Owner 或 Project Creator 角色 | 项目所有者可以在审核日志中查看已处理的字节数和相关的数据。项目创建者可以创建自己拥有的新项目,还可以查看结算和审核日志。 |
BigQuery Data Editor、Owner 或 Viewer 角色 | 查看查询的错误消息。 |
Cloud Billing Viewer 权限 | 查看 BigQuery 结算。 |
示例
- 通过在查询具有行级访问权限政策的表时反复观察查询时长,用户可以推断出原本可能受行级访问权限政策保护的行的值。这种类型的攻击需要对分区列或聚簇列的关键值范围进行大量反复尝试。虽然在观察或测量查询时长时存在固有的噪声,但是通过反复尝试,攻击者仍可以获取可靠的估算值。如果您对此保护级别比较敏感,我们建议您改用单独的表来隔离具有不同访问权限控制要求的行。
- 攻击者可能会搜索针对查询处理的字节数,具体方法是监控在超出查询作业限制(例如结算字节数或自定义费用控制上限)时发生的错误。但是,这种攻击需要执行大量查询。
- 通过反复执行查询并观察 Cloud Billing 中的 BigQuery 结算金额,用户可以推断出原本可能受行级访问政策保护的行值。这种类型的攻击需要对分区列或聚簇列的关键值范围进行大量反复尝试。如果您对此保护级别敏感,我们建议您限制对查询结算数据的访问权限。
我们还建议管理员监控 Cloud Audit Logs(/bigquery/docs/reference/auditlogs),以了解是否存在针对具有行级安全性的表的可疑活动,例如意外添加、修改或删除行级访问权限政策。
限制用户权限以限制数据篡改
对表具有写入权限的用户可以使用 bq load
命令或 BigQuery Storage Write API 将数据插入表中。这将允许具有写入权限的用户更改其他用户的查询结果。
我们建议管理员为表写入权限和行级访问权限政策创建单独的 Google 群组。只应查看过滤后的表结果的用户不应具有对过滤后的表的写入权限。
重新创建行级访问权限政策时避免意外访问
首次添加表的行访问权限政策时,您会立即开始过滤查询结果中的数据。移除表的最后一个行级访问权限政策后,即使您打算只重新创建行级访问权限政策,也可能会无意中向超出预期范围的受众群体授予未过滤的访问权限。
我们建议管理员在重新创建表的最后一个行级访问权限政策时特别注意遵循以下准则:
- 首先,使用表访问权限控制移除对表的所有访问权限。
- 移除所有行级访问权限政策。
- 重新创建所需的行级访问权限政策。
- 重新启用表的访问权限。
或者,您可以先创建表的新行级访问权限政策,然后删除不再需要的旧行级访问权限政策。
只能在组织内部使用行级安全性(不能跨组织使用)
请勿跨组织使用行级安全功能,以帮助防止通过旁道攻击造成数据泄露,以及保持对敏感数据的访问权限的更严格控制。
对于子查询行级访问权限政策,请在组织或项目中创建和搜索表。这样可以提高安全性并简化 ACL 配置,因为授权对象必须对政策中的目标表和引用的表具有 bigquery.tables.getData
权限,以及任何相关的列级安全性权限。
我们建议仅将行级安全功能用于组织内安全约束(例如在组织/企业/公司内共享数据),而不用于跨组织或公共安全。
示例
在组织外部,您对有权访问数据的人员的控制力度会削弱。在组织内部,您可以使用行级访问权限政策来控制有权访问表的结算信息的人员。结算信息是旁道攻击的途径。
使用 Filtered Data Viewer
角色须谨慎
创建行级访问权限政策时,系统会自动为政策中的主账号授予 bigquery.filteredDataViewer
角色。您只能使用 DDL 语句在政策中添加或移除负责人。
但是,可以通过 IAM 将 bigquery.filteredDataViewer
角色授予更高级别的资源,例如表、数据集或项目。为用户授予 bigquery.filteredDataViewer
角色后,他们就可以查看该表、数据集或项目中的所有行级访问权限政策定义的行。
但是,授予表的 bigquery.filteredDataViewer
角色并不一定意味着用户可以看到表中的所有行。联合所有行级访问政策的过滤条件表达式不一定可以形成整个表的闭环。
我们建议您在针对任何资源授予 bigquery.filteredDataViewer
角色时须谨慎。
对分区列进行过滤会影响性能
行级访问政策过滤条件不参与查询对分区表和聚簇表进行裁剪。
如果您的行级访问权限政策命名了分区列,则查询将无法获得查询删减的性能优势。