Debian 上 PostgreSQL 权限管理实操指南
一 核心概念与默认安全模型
sudo -u postgres psql。如需密码登录,可在 psql 中执行:ALTER USER postgres WITH PASSWORD 'new_password';。以上机制决定了日常权限管理应以“角色—数据库/模式—表/序列”的层级进行精细化授权。二 用户与角色管理常用命令
CREATE ROLE app_user WITH LOGIN PASSWORD 'StrongPass!';ALTER USER app_user WITH PASSWORD 'NewPass!';DROP ROLE IF EXISTS app_user;createuser / dropuser 可快速创建/删除角色(需具备相应权限)。SELECT * FROM pg_user WHERE usename = 'app_user';GRANT ALL PRIVILEGES ON DATABASE mydb TO app_user;、REVOKE ALL PRIVILEGES ON DATABASE mydb FROM app_user;-c 方式批量执行。三 数据库与模式级权限配置
-- 1) 连接与模式使用
GRANT CONNECT ON DATABASE mydb TO read_only;
GRANT USAGE ON SCHEMA public TO read_only;
-- 2) 现有表只读
GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only;
-- 3) 未来新建表自动继承只读(关键!)
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO read_only;
-- 应用角色
CREATE ROLE app_rw WITH LOGIN PASSWORD 'AppPass!';
-- 库级连接
GRANT CONNECT ON DATABASE mydb TO app_rw;
-- 模式使用
GRANT USAGE ON SCHEMA public TO app_rw;
-- 现有对象(示例:对单表授予增改查,不含删)
GRANT SELECT, INSERT, UPDATE ON TABLE public.orders TO app_rw;
-- 序列(如自增主键依赖)
GRANT USAGE, SELECT ON SEQUENCE public.orders_id_seq TO app_rw;
-- 未来对象默认授权(按需选择表/序列)
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT, INSERT, UPDATE ON TABLES TO app_rw;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT USAGE, SELECT ON SEQUENCES TO app_rw;
REVOKE DELETE ON TABLE public.customers FROM sales_team;四 连接与认证控制
listen_addresses = '*'(或指定内网地址)以允许远程监听。# 本地 Unix 域套接字:保持 peer(或 local)更安全
local all all peer
# 本机回环:使用 SCRAM-SHA-256 或 md5 密码
host all all 127.0.0.1/32 scram-sha-256
# 内网办公网段:仅允许特定网段密码登录
host mydb app_rw 192.168.10.0/24 scram-sha-256
# 其他来源:拒绝
host all all 0.0.0.0/0 reject
sudo ufw allow 5432/tcp。sudo systemctl restart postgresql。trust;为应用创建最小权限专用角色,避免长期使用超级用户直连应用。五 审计与权限核查
log_statement = 'all' -- 或 'mod' / 'ddl'
log_connections = on
log_disconnections = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
重启后生效,用于追踪登录与关键操作。-- 表级权限清单
SELECT grantee, table_name, privilege_type
FROM information_schema.table_privileges
WHERE grantee = 'app_user';
-- 角色继承关系(组/角色成员)
SELECT roleid::regrole AS role, member::regrole AS member
FROM pg_auth_members;
sudo apt-get install pgbadger),便于发现异常连接与慢查询。