0

我有一个项目,其中在 ci 测试服务器中使用 .sql 文件为 postgres db 播种。这将被构建并发布为 docker 镜像。

现在,我不会是唯一将这些 .sql 文件推送到服务器的人。因此,我需要检查所有 postgres 用户(可能还有未来用户)对该文件引入的所有数据库的权限。

示例:用户 A 和 B。用户 A 是超级用户,拥有所有数据库。用户 B 应该只能读取能够读取数据库 X。等等

有没有办法以编程方式测试这个?除了'尝试从 Y 读取为 B -> 错误?

到目前为止,我发现的所有其他解决方案要么是手动解决方案,要么是“尝试/错误”解决方案。

4

1 回答 1

0

您可以通过访问权限查询功能检查各种类型的数据库对象的授权。这些都在单个对象的级别上工作,因此对于任何类型的数据库范围检查,您都需要将它们与目录查询结合起来。您还需要查阅目录以获取任何所有权信息。在编写这些查询时,OID 类型非常有用。

要检查用户b是否对 schema 中的所有表具有只读访问权限p

SELECT EVERY(
  has_table_privilege('b', oid, 'SELECT') AND
  NOT has_table_privilege('b', oid, 'INSERT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER')
)
FROM pg_class
WHERE relkind = 'r'
  AND relnamespace = 'p'::regnamespace

(请注意,表权限被列级授权所取代,因此您可能也需要检查这些权限。)

检查是否a是超级用户:

SELECT rolsuper
FROM pg_roles
WHERE rolname = 'a'

要检查是否a拥有所有数据库(由 创建的数据库除外initdb):

SELECT EVERY(datdba = 'a'::regrole)
FROM pg_database
WHERE datname NOT IN ('postgres', 'template0', 'template1')
于 2017-02-07T02:31:28.087 回答