PostgreSQL - 保护数据库并隐藏结构

Lam*_*nds 5 database security postgresql function sql-grant

我正在 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;
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢。拉米斯

Ric*_*ton 6

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

如果您确实无法让他们看到数据库的结构,则需要阻止他们连接。使用调用 db 的简单 API 构建某种中间层。

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