【发布时间】:2014-03-16 10:15:31
【问题描述】:
我的目标是只允许特定用户执行特定模式中的函数,按名称列出可用的函数,但看不到函数的源代码或列出其他模式。
通过执行以下操作,可以在不列出可用函数名称的情况下实现上述目标:
首先创建一个测试用户角色:
CREATE ROLE test_user WITH LOGIN PASSWORD 'secret';
现在撤销公众对所有架构的所有权限:
REVOKE ALL PRIVILEGES ON DATABASE test_db FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM PUBLIC;
REVOKE ALL ON SCHEMA public FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA function_schema FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA function_schema FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA function_schema FROM PUBLIC;
REVOKE ALL ON SCHEMA function_schema FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA table_schema FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA table_schema FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA table_schema FROM PUBLIC;
REVOKE ALL ON SCHEMA table_schema FROM PUBLIC;
为测试用户设置限制访问:
GRANT CONNECT ON DATABASE test_db TO test_user;
GRANT USAGE ON SCHEMA function_schema TO test_user;
REVOKE ALL ON SCHEMA public FROM test_user;
REVOKE ALL ON SCHEMA table_schema FROM test_user;
GRANT EXECUTE ON FUNCTION function_schema.function1() TO test_user;
GRANT EXECUTE ON FUNCTION function_schema.function2(integer) TO test_user;
现在从测试用户和公众中隐藏模式结构和代码:
REVOKE SELECT ON TABLE pg_proc FROM public;
REVOKE SELECT ON TABLE pg_proc FROM test_user;
这一切都很好,测试用户可以执行函数,但他们看不到函数内部的代码,也看不到架构和表结构。
--
我想让测试用户现在在 test_functions 架构中按名称查看函数。我根据GRANT Postgresql 9.3 尝试了以下操作(这是在 pg_proc 中的每一列上授予选择):
GRANT SELECT (proname,pronamespace,proowner,prolang,procost,prorows,
provariadic,protransform,proisagg,proiswindow,prosecdef,proleakproof,
proisstrict,proretset,provolatile,pronargs,pronargdefaults,prorettype,
proargtypes,proallargtypes,proargmodes,proargnames,proargdefaults,prosrc,
probin,proconfig,proacl) ON TABLE pg_proc TO test_user;
这里的结果是测试用户没有获得所有相同的选择权限,就好像他们有权访问整个表一样。他们仍然看不到函数名称。
另一个测试是做相反的事情,将 select 授予 table,然后根据 REVOKE postgresql 9.3 撤销对所有列的 select:
GRANT SELECT ON TABLE pg_proc TO test_user;
REVOKE SELECT (proname,pronamespace,proowner,prolang,procost,prorows,
provariadic,protransform,proisagg,proiswindow,prosecdef,proleakproof,
proisstrict,proretset,provolatile,pronargs,pronargdefaults,prorettype,
proargtypes,proallargtypes,proargmodes,proargnames,proargdefaults,prosrc,
probin,proconfig,proacl) ON TABLE pg_proc FROM test_user;
这同样不起作用,他们现在可以看到所有架构、代码和表(在允许的架构上)。
似乎对特定列的授予/撤销不像文档建议的那样起作用。
广泛搜索产生了How to restrict access to code in a function,这表明仅撤销对 pg_proc.prosrc 列的访问权限,这在上述测试中显然不起作用。
我正在使用 postgresql 9.3
如果您想到任何其他解决方案,请随时提出建议。
【问题讨论】:
标签: sql database postgresql sql-grant