Postgres权限

时间:2020-02-06 19:44:03

标签: postgresql privileges

我无法理解PostgreSQL中的特权。

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

我已经创建了一个用户:

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对某个功能的权限,以使其无法在该功能范围内执行任何操作?

1 个答案:

答案 0 :(得分: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可以执行的所有操作。

相关问题