【问题标题】:Revoking access to specific columns not working in postgresql on table pg_proc撤销对表 pg_proc 上的 postgresql 中不工作的特定列的访问
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-06-27
      • 2022-01-07
      • 1970-01-01
      • 2020-09-30
      • 2013-12-31
      • 2019-09-29
      • 2019-04-12
      • 2015-03-06
      • 1970-01-01
      相关资源
      最近更新 更多