为什么 BigQuery 策略标记列在 GROUP BY 语句中使用时会阻止访问其他列?

问题描述

我们正在探索使用 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 安全地使用它,如果它不能证明这样的引用没有暴露任何信息,它就会禁止它。