【问题标题】:Only allow COUNT to Postgres role?只允许 COUNT 到 Postgres 角色?
【发布时间】:2016-10-13 15:06:32
【问题描述】:

我需要为其他人创建一个 Postgres 用户来查询我的数据库,但不能让他们看到列的值,因为它是敏感数据,他们应该只能看到计数。他们需要能够通过 where 子句的许多不同可能排列来计算 where。有没有办法做到这一点?

【问题讨论】:

  • 这些WHERE子句需要引用敏感列吗?
  • 很遗憾是的,否则我知道我只能授予对非敏感列的访问权限。

标签: postgresql roles


【解决方案1】:

我认为唯一能灵活处理这种情况的就是SECURITY DEFINER function。基本上,这些函数中的查询的行为就好像它们是由函数的所有者运行的,而不是函数的调用者,允许调用者做他们通常没有权限的事情(以受控方式)。

当然,您需要小心您在其中运行的内容,并且在将任何用户输入合并到您的查询中时,您需要特别偏执,如果您这样做会使事情变得困难希望调用者指定他们自己的WHERE 子句。用户定义的函数可能是不可能的,因为像WHERE my_func(private_col) 这样的约束可以简单地将其输入写入某处的表中。但是像WHERE private_col = 1 这样无害的东西可能同样糟糕,如果调用者设法潜入他们自己对= 运算符的定义;写这样的函数时一定要lock down your search path

除此之外,即使您有一个完美的解决方案,这种设置也可能不像看起来那么安全。您可能不会直接公开这些值,但您仍然会公开有关这些值的信息,并且在多个查询过程中,这足以重建这些值本身。例如:

SELECT COUNT(*) FROM private_data WHERE creditcard >= '00000000' AND creditcard < '50000000';
SELECT COUNT(*) FROM private_data WHERE creditcard >= '25000000' AND creditcard < '50000000';
SELECT COUNT(*) FROM private_data WHERE creditcard >= '25000000' AND creditcard < '37500000';
...

这只需 54 步即可收敛到一个数字。即使是 100 个字符的字符串,通常也只需要几百个查询即可确定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 2012-08-23
    • 1970-01-01
    相关资源
    最近更新 更多