gpt4 book ai didi

sql - 撤销对表 pg_proc 上的 postgresql 中不工作的特定列的访问

转载 作者:太空狗 更新时间:2023-10-30 01:49:34 25 4
gpt4 key购买 nike

我的目标是只允许特定用户在特定模式中执行函数,按名称列出可用的函数,但看不到函数的源代码或列出其他模式。

通过执行以下操作,可以在不列出可用函数名称的情况下实现上述目标:

首先创建一个测试用户角色:

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;

这里的结果是测试用户没有获得所有相同的选择权限,就好像他们可以访问整个表一样。他们仍然看不到函数名称。

另一个测试是做相反的事情,将选择授予表,然后根据 REVOKE postgresql 9.3 撤销对所有列的选择。 :

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

请随时提出想到的任何其他解决方案。

最佳答案

使用列权限应该可行,但可能不是这里的最佳方法。以这种方式维护权限在 PostgreSQL 中相当繁重。使用这种方法,您必须针对所有受影响的系统目录关系为单个用户设置和跟踪您的安全策略。想象一下,当您拥有多个用户时必须更新您的安全策略。

与其在关系上应用详细的安全角色,我建议您锁定系统目录中的所有内容(就像您所做的那样),然后创建 View 以有选择地公开部分系统目录(标准设置中已经如此) ,但显然对你的情况不够严格)。将这些 View 上的 GRANT SELECT 授予组角色,然后将该组角色授予登录角色(应具有 INHERIT 属性)。通过这种方式,可以更轻松地跟踪您所做的事情并更新您的安全策略,因为所有策略都包含在一组 View (内容)和组角色(可访问性)中。如果您使用的是 PostgreSQL-9.2+,请检查 View 上的 with security-barrier 选项,因为这将防止恶意用户进行优化器欺骗。

关于sql - 撤销对表 pg_proc 上的 postgresql 中不工作的特定列的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22266859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com