【发布时间】:2021-02-21 22:33:23
【问题描述】:
使用Vault 我正在尝试在 Postgres 11.8 实例中创建按需临时只读用户。
我会:
- 1000 多个数据库(每个客户(即租户)一个)
- 每个数据库都有一个
public和reporting架构。
所以我试图找到一种方法来授予这个只读用户对每个数据库以及两个架构中所有表的访问权限。
虽然我想出了以下 sn-p:
-- Create a new user
CREATE ROLE "my-readonly-user" WITH LOGIN PASSWORD 'test123';
-- Grant access to the two schema's we have
GRANT USAGE ON SCHEMA public TO "my-readonly-user";
GRANT USAGE ON SCHEMA reporting TO "my-readonly-user";
-- Grant access to all tables in our two schema's
GRANT SELECT ON ALL TABLES IN SCHEMA public TO "my-readonly-user";
GRANT SELECT ON ALL TABLES IN SCHEMA reporting TO "my-readonly-user";
-- Grant access to sequences
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO "my-readonly-user";
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA reporting TO "my-readonly-user";
-- Grant access to future tables
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO "my-readonly-user";
ALTER DEFAULT PRIVILEGES IN SCHEMA reporting GRANT SELECT ON TABLES TO "my-readonly-user";
它仅适用于 1 个单一数据库(当前数据库)。如果我使用只读用户登录并切换到某些数据库,除了第一个数据库之外,我看不到任何表。
一个集群包含许多数据库,其中包含许多模式。模式(甚至 同名)在不同的数据库中是不相关的。授予 架构的权限仅适用于 当前 DB(授予时的当前 DB)。 https://stackoverflow.com/a/24923877/1409047
由于该限制,似乎使上述授权 sn-p 更加复杂。我应该以某种方式迭代我的所有数据库并运行sn-p吗?我将如何进行数据库切换?甚至可以在普通 SQL 中使用(如Vault's API 所要求的那样)?以前有人这样做过吗?
注意:在 MySQL 中做同样的事情只需要 2 行代码,使用 Postgres afaik 不支持的通配符 *.*:
CREATE USER '{{name}}'@'10.0.0.0/255.0.0.0' IDENTIFIED BY '{{password}}';
GRANT SELECT, SHOW DATABASES, SHOW VIEW ON *.* TO '{{name}}'@'10.0.0.0/255.0.0.0';
【问题讨论】:
标签: postgresql grant