我在理解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
。我必须去特权兔子洞多远才能执行此看似简单的任务?而且,如果我直接在这些表上向该用户授予INSERT
,UPDATE
,DELETE
特权,那么就无法达到目的。是否不应该向用户授予功能的
EXECUTE
权限,使其不能在该功能范围内执行任何操作?
除非绝对必要,否则您绝对不应对任何人使用超级用户特权,这是不必要的,并且是安全问题。
为了描述我的建议,请三个(普通!)用户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
可以执行的所有操作。