Docker中PostgreSQL初始化默认权限配置异常问题
解决PostgreSQL只读用户越权操作问题
问题出在你把reader用户加入了admin角色——PostgreSQL里角色继承的权限优先级远高于直接撤销的权限,所以哪怕你后续撤销了reader的权限,它依然会通过admin角色拿到INSERT/UPDATE/DELETE等高权限。
正确的初始化脚本
删掉IN ROLE admin的设置,单独配置两个用户的权限,同时确保默认权限的作用范围精准:
#!/bin/bash set -e # 先在默认postgres库创建数据库和用户 psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL CREATE DATABASE db; REVOKE CONNECT ON DATABASE db FROM PUBLIC; CREATE USER admin; ALTER USER admin PASSWORD '$ADMIN_PASS'; CREATE USER reader; ALTER USER reader PASSWORD '$READER_PASS'; EOSQL # 切换到目标db配置具体权限 psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname db <<-EOSQL # 给admin授予数据库全权限 GRANT ALL PRIVILEGES ON DATABASE db TO admin; # 让admin创建的表默认拥有读写权限 ALTER DEFAULT PRIVILEGES FOR ROLE admin GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO admin; # 给reader仅授予数据库连接权限 GRANT CONNECT ON DATABASE db TO reader; # 让admin创建的表默认给reader开放SELECT权限 ALTER DEFAULT PRIVILEGES FOR ROLE admin GRANT SELECT ON TABLES TO reader; # 必须给reader授予public schema的使用权限,否则连表都看不到 GRANT USAGE ON SCHEMA public TO reader; # 如果初始化阶段已经有表(或者后续admin提前建表),直接给已有表加SELECT权限 GRANT SELECT ON ALL TABLES IN SCHEMA public TO reader; EOSQL
关键细节说明
- 移除
IN ROLE admin:从根源上避免reader继承admin的高权限,这是解决越权的核心 FOR ROLE admin:指定默认权限只对admin创建的对象生效,不会影响其他用户的表- Schema权限:PostgreSQL默认表都在
publicschema下,没有schema的使用权限,哪怕有表权限也无法访问数据 - 已有表权限:如果
admin在初始化后提前创建了表,这条语句能直接给reader开放这些表的查询权限
验证方式
用reader用户连接数据库后,测试以下操作:
-- 尝试插入数据,应该抛出权限错误 INSERT INTO your_table (column) VALUES ('test'); -- 尝试查询数据,应该正常返回结果 SELECT * FROM your_table;
内容的提问来源于stack exchange,提问作者Anton Tretyakov
相关产品推荐
相关产品推荐

