【问题标题】:PostgreSQL - Securing DB and hide structurePostgreSQL - 保护数据库和隐藏结构
【发布时间】:2013-07-11 16:25:58
【问题描述】:

我正在 postgreSQL 中部署一个数据库,并创建了一个能够执行某些功能的用户。

我撤销了刚刚创建的用户的所有权限,并授予执行连接权限:

REVOKE ALL PRIVILEGES ON DATABASE <database> FROM my_user;
REVOKE ALL PRIVILEGES ON SCHEMA public TO my_user;
GRANT CONNECT ON DATABASE <database> TO my_user;

但是当我用这个用户连接到数据库时,我能够读取所有的表结构和所有的函数源代码。有没有办法对这个用户隐藏它?

我借此机会提出另一个问题:我只想对这个用户执行功能(可能包括对数据库表的选择、插入或更新),但我不想授予选择、更新或删除的权限在桌子上。 我正在使用“SECURITY DEFINER”,然后我批准执行,但我认为它可能有点不安全。我对吗?还有其他方法吗?

提前致谢。 拉米斯

【问题讨论】:

  • 我发现以下隐藏函数源代码: REVOKE SELECT ON TABLE pg_proc FROM user; REVOKE SELECT ON TABLE pg_proc FROM public;

标签: database security function postgresql grant


【解决方案1】:

无法在 PostgreSQL 中对用户隐藏系统目录。如果用户无法访问目录,则他们无法找到任何其他数据库对象。

如果你真的不能让他们看到数据库的结构,你需要阻止他们连接。使用调用数据库的简单 API 构建某种中间层。

SECURITY DEFINER 是在更高权限级别提供有限访问的标准方法。但是,您必须小心可能以动态查询结尾的任何函数参数。不过,这与任何动态 sql 构建都存在相同的“bobby 表”问题。

【讨论】:

  • 感谢您的回复,理查德。如果我不在该函数上使用动态查询。使用“SECURITY DEFINER”并将执行权限授予“仅执行”用户是否安全?
  • 唯一的危险是如果恶意用户可以让它做一些你没有预料到的事情。功能越简单,你就越有信心。没有什么不安全的。
  • 再次感谢理查德。最后一个问题,我接受你的回答。根据官方文档,“SECURITY DEFINER 指定该函数将以创建它的用户的权限执行”。我认为使用“postgres”用户执行“CREATE FUNCTION”脚本会有潜在的危险。我想创建一个“部署者”用户。该用户应该拥有哪些 GRANTS?
  • 您至少需要在要创建函数的架构上创建 CREATE。加上函数需要的任何访问权限。
【解决方案2】:

怎么样

REVOKE SELECT ON pg_namespace FROM my_user;
REVOKE SELECT ON pg_catalog.pg_database FROM my_user;

您将看不到任何内容,但如果您知道命名空间和表名,就可以进行查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多