You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键细节说明

  1. 移除IN ROLE admin:从根源上避免reader继承admin的高权限,这是解决越权的核心
  2. FOR ROLE admin:指定默认权限只对admin创建的对象生效,不会影响其他用户的表
  3. Schema权限:PostgreSQL默认表都在public schema下,没有schema的使用权限,哪怕有表权限也无法访问数据
  4. 已有表权限:如果admin在初始化后提前创建了表,这条语句能直接给reader开放这些表的查询权限

验证方式

用reader用户连接数据库后,测试以下操作:

-- 尝试插入数据,应该抛出权限错误
INSERT INTO your_table (column) VALUES ('test');
-- 尝试查询数据,应该正常返回结果
SELECT * FROM your_table;

内容的提问来源于stack exchange,提问作者Anton Tretyakov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:19:58