【发布时间】:2023-02-09 18:57:47
【问题描述】:
我已经跨越了 Digital Ocean 中的 PostgreSQL 数据库。我现在需要提供一组用户和数据库,我曾考虑为其创建多个数据库(production、staging 等)并为每个数据库设置 2 个关联角色,并具有只读和读写权限(production_ro、production_rw、staging_ro、staging_rw 等)。我的想法是,通过拥有这些角色,我现在可以创建个人用户并为他们分配其中一个角色,这样我就可以在发生违规情况时快速更改/删除他们。
我一直在研究这个,我能找到的所有页面都有一组类似于 in here 的说明:
-- Revoke privileges from 'public' role
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON DATABASE mydatabase FROM PUBLIC;
-- Read-only role
CREATE ROLE readonly;
GRANT CONNECT ON DATABASE mydatabase TO readonly;
GRANT USAGE ON SCHEMA myschema TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA myschema TO readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT ON TABLES TO readonly;
-- Read/write role
CREATE ROLE readwrite;
GRANT CONNECT ON DATABASE mydatabase TO readwrite;
GRANT USAGE, CREATE ON SCHEMA myschema TO readwrite;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA myschema TO readwrite;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO readwrite;
GRANT USAGE ON ALL SEQUENCES IN SCHEMA myschema TO readwrite;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT USAGE ON SEQUENCES TO readwrite;
-- Users creation
CREATE USER reporting_user1 WITH PASSWORD 'some_secret_passwd';
CREATE USER reporting_user2 WITH PASSWORD 'some_secret_passwd';
CREATE USER app_user1 WITH PASSWORD 'some_secret_passwd';
CREATE USER app_user2 WITH PASSWORD 'some_secret_passwd';
-- Grant privileges to users
GRANT readonly TO reporting_user1;
GRANT readonly TO reporting_user2;
GRANT readwrite TO app_user1;
GRANT readwrite TO app_user2;
我已经仔细按照这些说明进行了监控,没有一个失败,但是在成功运行它们之后,我剩下的应该是只读用户,实际上他们可以创建表,看不到其他用户创建的表,和切换数据库。
我究竟做错了什么?
- - 编辑 - -
这是 \dn+ 命令的结果:
List of schemas
Name | Owner | Access privileges | Description
--------+----------+----------------------+------------------------
public | postgres | postgres=UC/postgres+| standard public schema
| | =UC/postgres |
--- 编辑 2 ---
这是我所做的(出于安全原因,我将用户编辑为 <USER_A>、<USER_B> 等。这些编辑用户将与真实用户 1 对 1 匹配):
$ psql "postgresql://USER_A:<PASSWORD>@<DOMAIN>:<PORT>/<DEFAULT_DB>?sslmode=require"
psql (15.1, server 14.6)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.
<DEFAULT_DB>=> \connect production
psql (15.1, server 14.6)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
You are now connected to database "production" as user "USER_A"
production=> \du
List of roles
Role name | Attributes | Member of
-----------------+------------------------------------------------------------+---------------------------------------------------------------------------
USER_B | Superuser, Replication | {}
USER_A | Create role, Create DB, Replication, Bypass RLS | {pg_read_all_stats,pg_stat_scan_tables,pg_signal_backend,r_production_ro}
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
production_ro | Cannot login | {}
production=> REVOKE CREATE ON SCHEMA public FROM PUBLIC;
WARNING: no privileges could be revoked for "public"
REVOKE
production=>
--- 编辑 3 ---
与 DigitalOcean 取得了联系。这是他们的回应:
只是想让你知道我们正在调查这个问题,到目前为止我 能够重现该行为。似乎为了去除 从我们需要的用户的公共模式创建表 “REVOKE CREATE ON SCHEMA public FROM PUBLIC;”这是不允许的 doadmin 用户不是超级用户,撤销此权限会 影响其他角色。
【问题讨论】:
标签: postgresql digital-ocean privileges