撤销对表 pg_proc 上 postgresql 中不起作用的特定列的访问

2024-02-09

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

通过执行以下操作,无需列出可用函数名称即可实现上述目的:

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

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 模式中按名称查看函数。我已经根据以下内容尝试了以下操作授予 Postgresql 9.3 http://www.postgresql.org/docs/9.3/static/sql-grant.html(这是在 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;

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

另一个测试是执行相反的操作,向表授予选择权,然后根据以下条件撤销所有列上的选择撤销 postgresql 9.3 http://www.postgresql.org/docs/9.3/static/sql-revoke.html:

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;

同样,这不起作用,他们现在可以看到所有模式、代码和表(在允许的模式上)。

似乎特定列上的授予/撤销并不按照文档建议的方式工作。

广泛搜索得出如何限制对函数中代码的访问 https://stackoverflow.com/questions/3651720/postgresql-how-can-i-restrict-access-to-code-in-a-function-for-a-userwich 建议仅撤销对 pg_proc.prosrc 列的访问,从上面的测试来看,该列显然不起作用。

我正在使用 postgresql 9.3

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


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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

撤销对表 pg_proc 上 postgresql 中不起作用的特定列的访问 的相关文章

随机推荐

  • 如何在 WordPress 中运行 mysql 查询?

    这个查询可以工作并返回我想要在 MySQL 中的结果 但是如何让它在 WordPress 中工作 SELECT FROM wp usermeta WHERE meta key points AND user id 1 我希望能够看到用户 1
  • terraform 文件中的展开运算符

    我想简化这样的构造 variable google type object project string region string zone string provider google project var google projec
  • JSF 中的应用程序作用域和 Spring 中的单例作用域之间的区别

    谁能解释一下 ApplicationScope JSF 和 Singleton Spring MVC 之间的区别 我有一个用 jsf 编写的应用程序 其中一个类使用应用程序范围 在转换为 spring 时 我使用了 Singleton 范围
  • 简单的任务:连接到数据库,执行存储过程,断开连接

    我不一定需要从 VBScript 向存储过程传递任何变量 我只需要在服务器上运行存储过程 我还没有找到任何明确的示例来说明如何执行此操作 只有很多人解释如何将变量从 SP 传递回 VBScript 任何帮助将不胜感激 看起来我必须打开一个连
  • Google Colab 消耗过多互联网数据

    最近 google colab 消耗了太多的互联网数据 单笔记本 6 小时训练约 4GB 可能是什么问题 是的 我有同样的问题 它通常工作正常 但互联网数据突然激增 检查这个 https i stack imgur com Ms9QI pn
  • ViewModel 在视图中无法识别

    我在不同项目 类库 中的视图模型 我添加了参考 但是当我从我的 mvc4 视图中调用它时 例如 model Fancy Management Model Home IndexModel 查看未识别它 我不知道是什么问题 我的视图如下所示 m
  • 控制 Kubernetes 中单个 pod 中容器终止的顺序

    我的一个容器内有两个容器 第一个是我的应用程序容器 第二个是 CloudSQL 代理容器 基本上我的应用程序容器依赖于这个 CloudSQL 容器 问题是 当 pod 终止时 CloudSQL 代理容器首先终止 并且仅在几秒钟后我的应用程序
  • 从命令行启动时出现 MacVim 颜色问题

    我对 Vim 比较陌生 到目前为止一直在使用它 没有出现任何问题 我要么从我的扩展坞启动 MacVim 要么使用mvim从命令行 到目前为止效果很好 但现在我遇到了一个问题 没有明显的原因 从命令行启动 MacVim 开始创建一个所有颜色都
  • 在Java中忽略你自己的UDP广播

    在我的程序中 我发送 UDP 广播并对它们做出反应 我需要一种方法来忽略 UDP 广播I发送出去 但对那些不是来自我的机器的做出反应 我确实尝试使用 if NetworkInterface getByInetAddress packet g
  • Vue JS - 访问组件内的根计算属性

    我正在尝试从根 Vue 实例访问计算属性并在组件内部访问它 这 p class currency 在组件模板外部输出的元素正确输出 currency 但是当尝试访问组件内部的 currency 时 不会输出任何内容 我尝试过将货币设置为道具
  • 使用 R 在坐标系中绘制节点和边

    我实施了FR测试here http itee uq edu au zxf papers ACMMM08 distributionn pdf现在我想通过可视化 R 中生成的最小生成树来测试它 顶点和边应该在坐标系中绘制 此外 我想为每个点设置
  • MongoDB 嵌入 Java

    我从文档中得到的是 它在其他计算机上作为单独的进程运行 我可以使用 java 的 mongo db 客户端驱动程序与它进行通信 并且我可以执行正常操作 但我怀疑我是否可以在我的java应用程序中使用MongoDB作为嵌入式数据库 我的意思是
  • 带有 UIImage 的 Swift 游乐场

    我正在使用 Xcode 6 并且正在尝试重新创建在会话 401 Xcode 6 中的新增功能 期间演示的代码 我已将图像添加到 Images xcassets 称为 Sample 并在游乐场文件中我尝试访问此图像 如演示的那样 我的代码如下
  • 为什么 React devtools Profiler 不向我显示组件属性?

    我开始学习React的优化 并看到一些学习资源 在它们上 我可以在探查器中看到组件道具 但在我的 Profiler 中 我没有看到任何道具 为什么 如何在 Profiler 中查看当前渲染组件的 props A make screensho
  • 方法:python-pdfkit 将网页(JS生成)转换为PDF

    views py def download as pdf request some stuff function call to get updated with data and JS template and render it ret
  • Laravel Eloquent:SQL 注入预防是自动完成的吗?

    给出示例代码 Message是一个雄辩的模型 public function submit Request request this gt validate request name gt required email gt require
  • 从 cypress 中的函数返回一个值[重复]

    这个问题在这里已经有答案了 import StudentDetails from Department let studentInfo new StudentDetails let studName any it Get Student N
  • 为什么我的 Qt 4.5 应用程序在 Windows 下打开控制台窗口?

    我一直在 Linux 下使用 Qt Creator 4 5 我的应用程序在 Linux 下构建得很好 但如果我在 Windows 中构建 该应用程序总是在启动时打开一个控制台窗口 我可以阻止它这样做吗 我正在使用默认的 MinGW 设置进行
  • 如何提高JPictureBox大图像的绘制速度?

    我有一个 JPictureBox 从 java awt Component 扩展 请参阅此处的代码http pastebin com SAJc6Sht http pastebin com SAJc6Sht 但只有在没有图像拉伸的情况下它才有
  • 撤销对表 pg_proc 上 postgresql 中不起作用的特定列的访问

    我的目标是仅允许特定用户执行特定模式中的函数 按名称列出可用的函数 但看不到函数的源代码或列出其他模式 通过执行以下操作 无需列出可用函数名称即可实现上述目的 首先创建一个测试用户角色 CREATE ROLE test user WITH