问题描述
我们正在探索使用 BigQuery 政策标签来实现列级安全性。我们发现,当用户无权访问的列包含在 GROUP BY 子句中时,用户也无法访问 GROUP BY 子句中的其他列。
让我用一个人为的例子来解释。假设我们有一个包含两列的表 t
:
t.a
t.b
这些列上有政策标签,允许我们的最终用户查看 t.a
中的数据,但不能查看 t.b
中的数据。
select a
from t
但是在发出此查询时:
select b
from t
访问被拒绝:BigQuery BigQuery:用户无权访问 project.dataset.t.b 列上的政策标签“policy-tag-name”。
这是预期的并且是设计使然。
select a
from (
select a,b
from t
group by a,b
)
然后发生同样的错误。
这是为什么?用户没有访问任何他们不允许访问的数据。我很难理解为什么 group by 语句会导致此错误。谁能给我指点一下?
解决方法
此查询不公开值 b,但如果允许,它将公开有关 b 的一些信息。
例如它让人们知道每个 a 的值有多少个不同的 b 值。假设 a 是产品 ID,b 是卖家 ID。查询将显示每个产品有多少个独立的卖家。但决定隐藏卖家的人可能不想要这个。或者 a 是某个员工组(例如部门或经理 ID),而 b 是工资。这个查询会暴露他们是否有相同的薪水。政策阻止了这一点。
请注意,可能存在更复杂的查询,其中引用 b 不会公开有关 b 的任何信息,但无论如何策略会阻止它。这也是设计使然 - BigQuery 安全地使用它,如果它不能证明这样的引用没有暴露任何信息,它就会禁止它。