没有“特权SELECT
”。您所需要的只是EXECUTE
功能的特权。相关函数可以运行SECURITY DEFINER
以继承所有者的所有权限。要将可能的特权升级限制在最低限度,请让守护程序角色拥有相关功能,仅具有必要的特权 - 而不是超级用户!
食谱
作为超级用户...
创建一个非超级用户角色myuser
。
CREATE ROLE myuser PASSWORD ...;
创建一个组角色mygroup
并使其成为myuser
成员。
CREATE ROLE mygroup;
GRANT mygroup TO myuser;
您可能想像myuser
以后一样添加更多用户。
根本不授予myuser
.
仅将这些授予mygroup
:
GRANT CONNECT ON DATABASE mydb TO mygroup;
GRANT USAGE ON SCHEMA public TO mygroup;
GRANT EXECUTE ON FUNCTION foo() TO mygroup;
删除不应该拥有的所有特权。public
myuser
REVOKE ALL ON ALL TABLES IN SCHEMA myschema FROM public;
可能还有更多。我引用手册:
PostgreSQL 将某些类型的对象的默认权限授予
PUBLIC
. 默认情况下,PUBLIC 不会对表、列、模式或表空间授予任何权限。CONNECT
对于其他类型,授予CREATE TEMP
TABLE
PUBLIC的默认权限如下:EXECUTE
功能特权;和USAGE
语言的特权。当然,对象所有者REVOKE
既可以默认也可以明确授予权限。(为了获得最大的安全性,请REVOKE
在创建对象的同一事务中发出 ;然后没有其他用户可以使用该对象的窗口。)此外,可以使用ALTER DEFAULT PRIVILEGES
命令更改这些初始默认权限设置。
创建守护程序角色以拥有相关功能。
CREATE ROLE mydaemon;
仅授予执行这些函数所需的权限mydaemon
,(包括EXECUTE ON FUNCTION
允许调用另一个函数)。同样,您可以使用组角色来捆绑权限并将它们授予mydaemon
GRANT bundle1 TO mydaemon;
此外,您可以使用DEFAULT PRIVILEGES
自动将未来对象的某些特权直接授予捆绑包或守护程序:
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT ON TABLES TO bundle1;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT USAGE ON SEQUENCES TO bundle1;
这仅适用于执行它的角色。根据文档:
如果FOR ROLE
省略,则假定当前角色。
还要涵盖架构中预先存在的对象(请参阅rob 的评论):
GRANT SELECT ON ALL TABLES IN SCHEMA public TO bundle1;
GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO bundle1;
制作mydaemon
自己的相关功能。可能看起来像这样:
CREATE OR REPLACE FUNCTION foo()
...
SECURITY DEFINER SET search_path = myschema, pg_temp;
ALTER FUNCTION foo() OWNER TO mydaemon;
REVOKE EXECUTE ON FUNCTION foo() FROM public;
GRANT EXECUTE ON FUNCTION foo() TO mydaemon;
GRANT EXECUTE ON FUNCTION foo() TO mygroup;
-- possibly others ..
###Note
由于pgAdmin的当前版本 1.16.1 中的这个错误,必要的命令
REVOKE EXECUTE ON FUNCTION foo() FROM public;
is missing in the reverse engineered DDL script. Remember to add it, when recreating.
This bug is fixed in the current version pgAdmin 1.18.1.