Postgres权限

问题描述 投票:0回答:1

我在理解PostgreSQL中的特权时遇到麻烦。

例如我有一个与用户webapiuser一起使用的Web应用程序。从某种意义上说,该用户只能通过某种功能来操作数据库,因此受到限制。这意味着没有直接的DB CRUD操作,只能通过上帝postgres用户创建的功能,并且只能通过其自己的[[domain内部的功能。我已经完成了许多阅读工作,其中许多教程都指向每个函数添加SECURITY DEFINER,但这allow由函数所有者代表用户执行的函数,在我的理解中没有达到目的。我毕竟试图锁定这种访问权限。

我已经使用以下方式创建了一个用户:

CREATE USER webapiuser WITH PASSWORD <password>;

并授予USAGE所有模式:

GRANT USAGE ON SCHEMA schemaA TO webapiuser; GRANT USAGE ON SCHEMA schemaB TO webapiuser; GRANT USAGE ON SCHEMA poublic TO webapiuser;

我尝试添加:

GRANT EXECUTE ON FUNCTION schemaA.func_myfunction() TO webapiuser;

但是后来我被permission denied for view view_my_view打中。该函数确实从该视图中进行选择,因此我想GRANT命令正在运行。如果执行执行插入操作的函数,则会收到类似的错误permission denied for table my_table。我必须去特权兔子洞多远才能执行此看似简单的任务?而且,如果我直接在这些表上向该用户授予INSERTUPDATEDELETE特权,那么就无法达到目的。

是否不应该向用户授予功能的EXECUTE权限,使其不能在该功能范围内执行任何操作?

postgresql privileges
1个回答
1
投票
首先,让我感到惊讶的是,有很多人认为这是使用函数进行数据修改的最佳方法。除了PL / pgSQL函数缓存计划(您也可以使用准备好的语句)计划之外,我看不到这一点。

除非绝对必要,否则您绝对不应对任何人使用超级用户特权,这是不必要的,并且是安全问题。

为了描述我的建议,请三个(普通!)用户abc

  • a是模式appschema和该模式中的数据库对象(即a)的所有者。 a将对象的所有必要权限授予b,但不授予c
  • b拥有一组SECURITY DEFINER函数,它们对appschema中的表执行数据修改。 bEXECUTE撤消对这些功能的PUBLIC特权,并将其仅授予c

    SET search_path = appschema定义所有这些功能非常重要。

    ] >>
  • c是应用程序使用的用户。除了EXECUTE功能的b特权外,该用户除连接数据库的权限外没有其他权限。
  • 现在c执行任何功能时,它们将在b的用户上下文中运行,也就是说,它们可以执行b可以执行的所有操作。

© www.soinside.com 2019 - 2024. All rights reserved.