我无法理解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
。要执行此看似简单的任务,必须去特权兔子洞多远?而且,如果我直接在这些表上向该用户授予INSERT
,UPDATE
,DELETE
特权,那么就无法达到目的。
是否不应该授予用户EXECUTE
对某个功能的权限,以使其无法在该功能范围内执行任何操作?
答案 0 :(得分:1)
首先让我说的是,令我惊讶的是,有许多人认为这是使用函数进行数据修改的最佳方法。除了PL / pgSQL函数缓存计划(您也可以使用准备好的语句)计划之外,我看不到这一点。
除非绝对必要,否则切勿使用超级用户特权进行任何操作,这是不必要的,并且是安全问题。
要描述我的建议,请三个(普通!)用户a
,b
和c
:
a
是模式appschema
的所有者,该模式中的数据库对象(即a
)用于创建它们。 a
将对象的所有必要权限授予b
,但不授予c
。
b
拥有一组SECURITY DEFINER
函数,这些函数对appschema
中的表执行数据修改。 b
从EXECUTE
撤消对这些功能的PUBLIC
特权,并将其仅授予c
。
使用SET search_path = appschema
定义所有这些功能非常重要。
c
是应用程序使用的用户。除了对EXECUTE
的功能具有b
特权外,该用户除连接数据库的权限外没有其他权限。
现在,当c
执行任何功能时,它们将在b
的用户上下文中运行,也就是说,它们可以执行b
可以执行的所有操作。