我正在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;
但是当我用这个用户连接到数据库时,我能够读取所有表结构和所有函数源代码。有没有办法将其隐藏起来?
我有机会提出另一个问题:我想在这个用户上执行函数(可能包括对数据库表的选择,插入或更新),但我不想授予select,update或delete权限在桌子上。 我正在使用“安全定义器”,然后我批准执行,但我认为这可能有点不安全。我对吗?还有其他办法吗?
先谢谢。 Lamis
答案 0 :(得分:2)
无法在PostgreSQL中隐藏用户的系统目录。如果用户无法访问目录,则他们无法找到任何其他数据库对象。
如果你真的不能让他们看到db的结构,你需要阻止他们连接。使用调用db的简单API构建某种中间层。
SECURITY DEFINER是在更高权限级别提供有限访问的标准方法。您必须小心可能最终在动态查询中的任何函数参数。这与“任何动态sql构建”相同的“bobby表”问题。
答案 1 :(得分:0)
怎么样
REVOKE SELECT ON pg_namespace FROM my_user;
REVOKE SELECT ON pg_catalog.pg_database FROM my_user;
您将看不到任何内容,但如果您知道命名空间和表名,您就可以进行查询。