0

我们正在探索使用 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.tb 上的策略标签“policy-tag-name”

这是意料之中的,也是设计使然。

但是,如果用户发出此查询:

select a 
from (
    select a, b 
    from t 
    group by a, b
)

然后发生同样的错误。

为什么是这样?用户没有访问任何他们不允许访问的数据。我正在努力理解为什么 group by 语句会导致此错误。任何人都可以启发我吗?

4

1 回答 1

1

此查询不公开值 b,但如果允许,它将公开有关 b 的一些信息。

例如,它让人们知道每个 a 的值有多少个不同的 b 值。假设 a 是产品 ID,b 是卖家 ID。查询将显示每个产品有多少单独的卖家。但决定隐藏卖家的人可能不想要这个。或者 a 是某个员工组(例如部门或经理 ID),b 是薪水。这个查询会暴露他们是否有相同的薪水。政策阻止了这一点。

请注意,可能存在更复杂的查询,其中引用 b 不会公开任何关于 b 的信息,但无论如何策略都会阻止它。这也是设计使然 - BigQuery 保证安全,如果它不能证明此类引用不会暴露任何信息,则会禁止它。

于 2021-07-13T03:02:00.907 回答