【问题标题】:Execute Permission on Function not Enough in PostgreSQL?在 PostgreSQL 中对功能不够的执行权限?
【发布时间】:2021-05-28 08:42:36
【问题描述】:

从 MS SQL 端到 Pg 的新手,限制访问只需授予函数和 SP 的 EXE 权限。因此创建了一个用户/角色,将其search_path 设置为数据库的专用模式,授予EXECUTE ON ALL FUNCTIONS IN SCHEMA myschema。尝试执行一个函数得到了

架构 myschema 的权限被拒绝

好的,grant usage on schema myschema to role。该函数执行select ... from mytable 所以现在

表 mytable 的权限被拒绝

grant SELECT on my table?等等,这个函数的目的是限制角色探索表。

【问题讨论】:

  • 您是否希望函数内的代码以与调用者不同的权限运行?然后你必须使用SECURITY DEFINER

标签: postgresql


【解决方案1】:

您的情况是:用户a 在架构myschema 中拥有一个表mytable。用户b 最初没有任何权限。现在您要允许b 有限访问mytable。在桌子上授予SELECT 太多了——您只想通过特殊功能myfunction 授予访问权限。

然后您需要一个不以调用者 (SECURITY INVOKER) 的权限运行的函数,这将是默认设置,但具有函数所有者 (SECURITY DEFINER) 的权限。然后用户a 应该运行:

CREATE FUNCTION public.read_mytable(...) RETURNS ...
   LANGUAGE ...
   /* runs with the privileges of the owner */
   SECURITY DEFINER
   /* important: force "search_path" to a fixed order */
   SET search_path = pg_catalog,pg_temp
AS $$...$$;

/* by default, everybody can execute a function */
REVOKE EXECUTE ON FUNCTION public.read_mytable FROM PUBLIC;
GRANT EXECUTE ON FUNCTION public.read_mytable TO b;

请注意,我在架构 public 中创建了函数,b 可以访问该函数(不要忘记 REVOKE CREATE ON SCHEMA public FROM PUBLIC;!)。

为用户b 设置search_path 是不够的,因为这始终可以使用SET 命令动态更改。你不希望 brun a privilege escalation attack

【讨论】:

  • 太好了,我现在可以在路径中没有pg_temp 的情况下解决它。拥有它有什么好处?
  • This 是一篇好文章。将每个新功能/sp 授予公共 EXE 以像 MS SQL 或 Oracle 一样显式授予权限,更改默认 pg 行为不是很好吗? REVOKE CREATE ON SCHEMA public FROM PUBLIC; 也是默认的吗?最后一个问题,如果我放弃 public 架构有什么影响?
  • 这只是标准顺序。您可以将search_path 设置为空,效果相同。出于兼容性原因,默认设置仍然存在,尽管public 的努力正在进行中。您可以删除 public 架构,但您可能需要另一个位置来存放扩展对象。
猜你喜欢
  • 2017-06-05
  • 2023-04-02
  • 2021-12-17
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 2016-11-03
  • 1970-01-01
  • 2011-03-03
相关资源
最近更新 更多