PostgreSQL教程FG080-PG系统角色:超级用户/普通用户/运维用户权限划分
本文档风哥主要介绍PostgreSQL的系统角色,包括超级用户、普通用户和运维用户的权限划分,以及生产环境中的实战案例和最佳实践。风哥教程参考PostgreSQL官方文档Server Administration内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 PostgreSQL系统角色的概念
PostgreSQL系统角色是数据库系统中用于管理和控制访问权限的实体。系统角色可以是用户(可以登录)或组(用于管理权限),是PostgreSQL权限管理的基础。更多视频教程www.fgedu.net.cn
- 系统角色是权限管理的基本单位
- 系统角色可以拥有数据库对象
- 系统角色可以被授予权限
- 系统角色可以是其他角色的成员
- 系统角色可以继承其他角色的权限
1.2 PostgreSQL系统角色的类型
PostgreSQL系统角色主要分为以下类型:
– 拥有所有权限
– 可以执行所有操作
– 可以创建和管理其他角色
– 通常是postgres用户
# 普通用户角色
– 只能执行被授予的权限
– 可以登录数据库
– 可以拥有自己的对象
– 通常是应用程序使用的角色
# 运维用户角色
– 拥有管理数据库的权限
– 可以执行维护操作
– 不能执行超级用户操作
– 通常是DBA使用的角色
# 系统内置角色
– 由系统创建的特殊角色
– 如pg_read_all_data、pg_write_all_data等
– 用于管理特定的系统权限
# 组角色
– 不能登录数据库
– 用于管理权限
– 其他角色可以成为其成员
– 权限可以通过继承传递给成员
1.3 PostgreSQL权限级别
PostgreSQL权限级别主要包括以下几个层次:
- 系统级权限:如CREATEDB、CREATEROLE、SUPERUSER等
- 数据库级权限:如CONNECT、CREATE、TEMP等
- 模式级权限:如CREATE、USAGE等
- 对象级权限:如SELECT、INSERT、UPDATE、DELETE等
- 列级权限:对表中特定列的权限
- 行级权限:通过行级安全策略实现
Part02-生产环境规划与建议
2.1 PostgreSQL系统角色规划
PostgreSQL系统角色规划要点:
– 超级用户:系统管理员
– 运维用户:数据库管理员
– 应用用户:应用程序使用
– 只读用户:只能查询数据
– 审计用户:用于审计和监控
# 角色命名规范
– 超级用户:pgsql – 运维用户:pg_admin_xxx
– 应用用户:fgapp_xxx
– 只读用户:read_xxx
– 审计用户:audit_xxx
# 角色职责分离
– 超级用户:系统级管理
– 运维用户:数据库管理
– 应用用户:应用访问
– 只读用户:数据查询
– 审计用户:监控审计
# 角色生命周期管理
– 创建:根据需求创建角色
– 修改:根据需要修改角色属性
– 删除:删除不再需要的角色
– 审计:定期审查角色权限
2.2 PostgreSQL权限规划
PostgreSQL权限规划要点:
from oracle:www.itpux.com学习交流加群风哥微信: itpux-com
– 所有系统级权限
– 所有数据库级权限
– 所有对象级权限
– 可以创建和管理其他角色
# 运维用户权限
– CREATEDB:创建数据库
– CREATEROLE:创建角色
– REPLICATION:复制权限
– 数据库管理权限
– 备份恢复权限
# 应用用户权限
– CONNECT:连接数据库
– 特定表的SELECT、INSERT、UPDATE、DELETE权限
– 特定视图的访问权限
– 特定函数的执行权限
# 只读用户权限
– CONNECT:连接数据库
– SELECT:查询权限
– 视图访问权限
# 审计用户权限
– CONNECT:连接数据库
– SELECT:查询系统视图
– 监控权限
2.3 PostgreSQL安全规划
PostgreSQL安全规划要点:
– 只授予必要的权限
– 避免过度授权
– 定期审查权限
# 权限分离
– 超级用户与运维用户分离
– 运维用户与应用用户分离
– 应用用户与只读用户分离
# 密码策略
– 使用强密码
– 设置密码有效期
– 定期更换密码
– 密码加密存储
# 审计监控
– 启用审计日志
– 监控角色活动
– 记录权限变更
– 定期审查审计日志
# 访问控制
– 限制连接来源
– 使用SSL加密连接
– 配置pg_hba.conf
– 限制并发连接数
Part03-生产环境项目实施方案
3.1 PostgreSQL超级用户管理
3.1.1 超级用户的创建与管理
$ psql -U pgsql
postgres=# \du
List of roles
Role name | Attributes | Member of
———–+————————————————————+———–
pgsql | Superfgedu, Create role, Create DB, Replication, Bypass RLS | {}
# 创建超级用户
postgres=# CREATE ROLE super_admin WITH
postgres-# SUPERUSER
postgres-# LOGIN
postgres-# PASSWORD ‘SuperPassword123’;
CREATE ROLE
# 验证超级用户
postgres=# \du
List of roles
Role name | Attributes | Member of
———–+————————————————————+———–
pgsql | Superfgedu, Create role, Create DB, Replication, Bypass RLS | {}
super_admin | Superfgedu, Create role, Create DB, Replication, Bypass RLS | {}
# 撤销超级用户权限
postgres=# ALTER ROLE super_admin WITH NOSUPERUSER;
ALTER ROLE
# 验证权限变更
postgres=# \du
List of roles
Role name | Attributes | Member of
———–+————————————————————+———–
pgsql | Superfgedu, Create role, Create DB, Replication, Bypass RLS | {}
super_admin | Create role, Create DB, Replication, Bypass RLS | {}
# 删除超级用户
postgres=# DROP ROLE super_admin;
DROP ROLE
3.1.2 超级用户的安全管理
# 只保留必要的超级用户,如pgsql # 超级用户密码管理
postgres=# ALTER ROLE pgsql WITH PASSWORD ‘StrongPassword123’;
ALTER ROLE
# 限制超级用户登录
# 修改pg_hba.conf,限制超级用户的登录来源
$ vi /postgresql/data/pg_hba.conf
# 添加以下内容
fgedu.net.cn all pgsql 192.168.1.0/24 md5
# 重新加载配置
$ pg_ctl reload -D /postgresql/data
# 监控超级用户活动
# 启用审计日志
$ vi /postgresql/data/postgresql.conf
# 修改以下配置
log_statement = ‘all’
log_connections = on
log_disconnections = on
# 重新加载配置
$ pg_ctl reload -D /postgresql/data
3.2 PostgreSQL普通用户管理
3.2.1 普通用户的创建与管理
postgres=# CREATE ROLE fgapp_fgedu WITH
postgres-# LOGIN
postgres-# PASSWORD ‘AppPassword123’
postgres-# NOSUPERUSER
postgres-# NOCREATEDB
postgres-# NOCREATEROLE
postgres-# INHERIT;
CREATE ROLE
# 创建应用数据库
postgres=# CREATE DATABASE fgedu_fgapp;
CREATE DATABASE
# 授予普通用户连接权限
postgres=# GRANT CONNECT ON DATABASE fgedu_fgapp TO fgapp_fgedu;
GRANT
# 切换到应用数据库
postgres=# \c fgedu_fgapp
# 创建测试表
fgedu_fgapp=# CREATE TABLE fgedu_fgedus (
id serial PRIMARY KEY,
name varchar(50),
email varchar(100)
);
CREATE TABLE fgedu_# 授予普通用户表权限
fgedu_fgapp=# GRANT SELECT, INSERT, UPDATE, DELETE ON fgedu_fgedus TO fgapp_fgedu;
GRANT
# 授予模式使用权限
fgedu_fgapp=# GRANT USAGE ON SCHEMA public TO fgapp_fgedu;
GRANT
# 测试普通用户权限
$ psql -U fgapp_fgedu -d fgedu_fgapp
fgedu_fgapp=> SELECT * FROM fgedu_fgedus;
id | name | email
—-+——+——-
(0 rows)
fgedu_fgapp=> INSERT INTO fgedu_fgedus (name, email) VALUES (‘风哥1号’, ‘zhangsan@fgedu.net.cn’);
INSERT 0 1
fgedu_fgapp=> SELECT * FROM fgedu_fgedus;
id | name | email
—-+——+———————–
1 | 风哥1号 | zhangsan@fgedu.net.cn
(1 row)
3.2.2 只读用户的创建与管理
postgres=# CREATE ROLE read_fgedu WITH
postgres-# LOGIN
postgres-# PASSWORD ‘ReadPassword123’
postgres-# NOSUPERUSER
postgres-# NOCREATEDB
postgres-# NOCREATEROLE
postgres-# INHERIT;
CREATE ROLE
# 授予只读用户连接权限
postgres=# GRANT CONNECT ON DATABASE fgedu_fgapp TO read_fgedu;
GRANT
# 授予只读用户表权限
fgedu_fgapp=# GRANT SELECT ON fgedu_fgedus TO read_fgedu;
GRANT
# 授予模式使用权限
fgedu_fgapp=# GRANT USAGE ON SCHEMA public TO read_fgedu;
GRANT
# 测试只读用户权限
$ psql -U read_fgedu -d fgedu_fgapp
fgedu_fgapp=> SELECT * FROM fgedu_fgedus;
id | name | email
—-+——+———————–
1 | 风哥1号 | zhangsan@fgedu.net.cn
(1 row)
# 尝试插入数据(应该失败)
fgedu_fgapp=> INSERT INTO fgedu_fgedus (name, email) VALUES (‘风哥2号’, ‘lisi@fgedu.net.cn’);
ERROR: permission denied for table fgedu_fgedus
3.3 PostgreSQL运维用户管理
3.3.1 运维用户的创建与管理
postgres=# CREATE ROLE pg_admin WITH
postgres-# LOGIN
postgres-# PASSWORD ‘AdminPassword123’
postgres-# NOSUPERUSER
postgres-# CREATEDB
postgres-# CREATEROLE
postgres-# REPLICATION
postgres-# INHERIT;
CREATE ROLE
# 授予运维用户系统权限
postgres=# GRANT pg_monitor TO pg_admin;
GRANT ROLE
# 授予运维用户数据库权限
postgres=# GRANT ALL PRIVILEGES ON DATABASE fgedu_fgapp TO pg_admin;
GRANT
# 测试运维用户权限
$ psql -U pg_admin -d pgsql # 创建新数据库
postgres=> CREATE DATABASE test_db;
CREATE DATABASE
# 创建新角色
postgres=> CREATE ROLE test_fgedu WITH LOGIN PASSWORD ‘fgfgfgtest123’;
CREATE ROLE
# 查看系统状态
postgres=> SELECT * FROM pg_stat_fgedudb LIMIT 5;
datid | datname | numbackends | xact_commit | xact_rollback | blks_read | blks_hit | tup_returned | tup_fetched | tup_inserted | tup_updated | tup_deleted | conflicts | temp_files | temp_bytes | deadlocks | checkpoints_timed | checkpoints_req | checkpoint_write_time | checkpoint_sync_time | pg_current_xlog_location | backend_xlog_location | oldest_xmin | oldest_active_xmin | oldest_multi_xid | oldest_multi_id | vacuum_count | analyze_count | last_vacuum | last_analyze | last_autovacuum | last_autoanalyze | size
——-+———-+————-+————-+—————+———–+———-+————–+————-+————–+————-+————–+———–+————+————+———-+——————+——————+————————+————————+————————-+————————-+————+——————-+——————+—————-+————-+—————+————-+————–+——————+——————-+——
1 | template1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0/16B2D88 | | 0 | 0 | 0 | 0 | 0 | 0 | | | | | 7935 kB
2 | template0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0/16B2D88 | | 0 | 0 | 0 | 0 | 0 | 0 | | | | | 7783 kB
3 | pgsql | 1 | 100 | 0 | 100 | 900 | 5000 | 4500 | 100 | 50 | 10 | 0 | 0 | 0 | 0 | 5 | 0 | 100 | 0 | 0/16B2D88 | 0/16B2D88 | 0 | 0 | 0 | 0 | 5 | 5 | 2026-04-02 | 2026-04-02 | 2026-04-02 | 2026-04-02 | 8191 kB
16384 | fgedu_fgapp | 0 | 50 | 0 | 50 | 450 | 2500 | 2250 | 50 | 25 | 5 | 0 | 0 | 0 | 0 | 2 | 0 | 50 | 0 | 0/16B2D88 | | 0 | 0 | 0 | 0 | 2 | 2 | 2026-04-02 | 2026-04-02 | 2026-04-02 | 2026-04-02 | 7935 kB
16385 | test_db | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0/16B2D88 | | 0 | 0 | 0 | 0 | 0 | 0 | | | | | 7935 kB
(5 rows)
3.4 PostgreSQL权限分配
3.4.1 基于角色的权限分配
# 1. 创建基础角色
postgres=# CREATE ROLE base_role WITH NOLOGIN;
CREATE ROLE
# 2. 创建功能角色
postgres=# CREATE ROLE db_admin WITH NOLOGIN;
CREATE ROLE
postgres=# CREATE ROLE fgapp_read WITH NOLOGIN;
CREATE ROLE
postgres=# CREATE ROLE fgapp_write WITH NOLOGIN;
CREATE ROLE
# 3. 建立继承关系
postgres=# GRANT base_role TO db_admin;
GRANT ROLE
postgres=# GRANT base_role TO fgapp_read;
GRANT ROLE
postgres=# GRANT base_role TO fgapp_write;
GRANT ROLE
# 4. 创建用户角色
postgres=# CREATE ROLE admin_fgedu WITH LOGIN PASSWORD ‘Admin123’;
CREATE ROLE
postgres=# CREATE ROLE fgapp_fgedu WITH LOGIN PASSWORD ‘App123’;
CREATE ROLE
postgres=# CREATE ROLE read_fgedu WITH LOGIN PASSWORD ‘Read123’;
CREATE ROLE
# 5. 分配角色
postgres=# GRANT db_admin TO admin_fgedu;
GRANT ROLE
postgres=# GRANT fgapp_read TO read_fgedu;
GRANT ROLE
postgres=# GRANT fgapp_read TO fgapp_fgedu;
GRANT ROLE
postgres=# GRANT fgapp_write TO fgapp_fgedu;
GRANT ROLE
# 6. 授予权限
# 授予基础角色权限
postgres=# GRANT CONNECT ON DATABASE fgedu_fgapp TO base_role;
GRANT
postgres=# GRANT USAGE ON SCHEMA public TO base_role;
GRANT
# 授予功能角色权限
postgres=# GRANT ALL PRIVILEGES ON DATABASE fgedu_fgapp TO db_admin;
GRANT
postgres=# GRANT SELECT ON ALL TABLES IN SCHEMA public TO fgapp_read;
GRANT
postgres=# GRANT INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO fgapp_write;
GRANT
Part04-生产案例与实战讲解
4.1 PostgreSQL超级用户管理案例
4.1.1 案例:超级用户安全管理
# 1. 限制超级用户数量
# 只保留postgres作为超级用户
# 2. 修改超级用户密码
postgres=# ALTER ROLE pgsql WITH PASSWORD ‘StrongSuperPassword123’;
ALTER ROLE
# 3. 限制超级用户登录来源
$ vi /postgresql/data/pg_hba.conf
# 修改以下内容
# 只允许本地和特定IP登录
fgedu.net.cn all pgsql 127.0.0.1/32 md5
fgedu.net.cn all pgsql 192.168.1.0/24 md5
# 4. 启用审计日志
$ vi /postgresql/data/postgresql.conf
# 修改以下配置
log_statement = ‘all’
log_connections = on
log_disconnections = on
log_line_prefix = ‘%t [%p]: [%l-1] fgedu=%u,db=%d,fgapp=%a,client=%h ‘
# 5. 重新加载配置
$ pg_ctl reload -D /postgresql/data
# 6. 监控超级用户活动
# 查看审计日志
$ tail -f /postgresql/data/log/postgresql-2026-04-02.log
2026-04-02 12:00:00 UTC [12345]: [1-1] fgedu=postgres,db=postgres,fgapp=psql,client=192.168.1.100 LOG: statement: SELECT * FROM pg_stat_fgedudb;
2026-04-02 12:00:05 UTC [12345]: [2-1] fgedu=postgres,db=postgres,fgapp=psql,client=192.168.1.100 LOG: statement: CREATE ROLE test_role;
# 7. 定期审查超级用户权限
# 每月审查一次超级用户列表和权限
postgres=# \du
4.2 PostgreSQL普通用户管理案例
4.2.1 案例:应用用户权限管理
# 1. 创建应用用户
postgres=# CREATE ROLE fgedu_fgfgapp_fgedu WITH
postgres-# LOGIN
postgres-# PASSWORD ‘AppPassword123’
postgres-# NOSUPERUSER
postgres-# NOCREATEDB
postgres-# NOCREATEROLE
postgres-# INHERIT;
CREATE ROLE
# 2. 创建应用数据库
postgres=# CREATE DATABASE fgedu_business;
CREATE DATABASE
# 3. 切换到应用数据库
postgres=# \c fgedu_business
# 4. 创建应用表
fgedu_business=# CREATE TABLE fgedu_customers (
id serial PRIMARY KEY,
name varchar(100),
email varchar(255),
phone varchar(20),
address varchar(255),
created_at timestamp DEFAULT now()
);
CREATE TABLE fgedu_
fgedu_business=# CREATE TABLE fgedu_orders (
id serial PRIMARY KEY,
customer_id integer REFERENCES fgedu_customers(id),
order_date date,
total_amount numeric(10,2),
status varchar(20),
created_at timestamp DEFAULT now()
);
CREATE TABLE fgedu_# 5. 授予应用用户权限
fgedu_business=# GRANT CONNECT ON DATABASE fgedu_business TO fgedu_fgfgapp_fgedu;
GRANT
fgedu_business=# GRANT USAGE ON SCHEMA public TO fgedu_fgfgapp_fgedu;
GRANT
fgedu_business=# GRANT SELECT, INSERT, UPDATE, DELETE ON fgedu_customers TO fgedu_fgfgapp_fgedu;
GRANT
fgedu_business=# GRANT SELECT, INSERT, UPDATE, DELETE ON fgedu_orders TO fgedu_fgfgapp_fgedu;
GRANT
fgedu_business=# GRANT USAGE ON SEQUENCE fgedu_customers_id_seq TO fgedu_fgfgapp_fgedu;
GRANT
fgedu_business=# GRANT USAGE ON SEQUENCE fgedu_orders_id_seq TO fgedu_fgfgapp_fgedu;
GRANT
# 6. 测试应用用户权限
$ psql -U fgedu_fgfgapp_fgedu -d fgedu_business
fgedu_business=> INSERT INTO fgedu_customers (name, email, phone, address) VALUES (‘风哥1号’, ‘zhangsan@fgedu.net.cn’, ‘13800138000’, ‘北京市朝阳区’);
INSERT 0 1
fgedu_business=> INSERT INTO fgedu_orders (customer_id, order_date, total_amount, status) VALUES (1, ‘2026-04-02’, 1000.00, ‘pending’);
INSERT 0 1
fgedu_business=> SELECT c.name, o.order_date, o.total_amount, o.status
FROM fgedu_customers c
JOIN fgedu_orders o ON c.id = o.customer_id;
name | order_date | total_amount | status
——+————+————–+——–
风哥1号 | 2026-04-02 | 1000.00 | pending
(1 row)
4.3 PostgreSQL运维用户管理案例
4.3.1 案例:运维用户权限管理
# 1. 创建运维用户
postgres=# CREATE ROLE pg_dba WITH
postgres-# LOGIN
postgres-# PASSWORD ‘DbaPassword123’
postgres-# NOSUPERUSER
postgres-# CREATEDB
postgres-# CREATEROLE
postgres-# REPLICATION
postgres-# INHERIT;
CREATE ROLE
# 2. 授予运维用户系统权限
postgres=# GRANT pg_monitor TO pg_dba;
GRANT ROLE
postgres=# GRANT pg_read_all_settings TO pg_dba;
GRANT ROLE
postgres=# GRANT pg_read_all_stats TO pg_dba;
GRANT ROLE
# 3. 授予运维用户数据库权限
postgres=# GRANT ALL PRIVILEGES ON DATABASE pgsql TO pg_dba;
GRANT
postgres=# GRANT ALL PRIVILEGES ON DATABASE fgedu_business TO pg_dba;
GRANT
# 4. 测试运维用户权限
$ psql -U pg_dba -d pgsql # 查看系统状态
postgres=> SELECT * FROM pg_stat_activity LIMIT 5;
# 查看数据库大小
postgres=> SELECT pg_size_pretty(pg_fgedudb_size(‘fgedu_business’));
pg_size_pretty
—————-
8192 kB
(1 row)
# 创建新数据库
postgres=> CREATE DATABASE test_db;
CREATE DATABASE
# 创建新角色
postgres=> CREATE ROLE test_fgedu WITH LOGIN PASSWORD ‘fgfgfgtest123’;
CREATE ROLE
# 执行真空操作
postgres=> VACUUM ANALYZE;
VACUUM
# 查看锁状态
postgres=> SELECT * FROM pg_locks LIMIT 5;
Part05-风哥经验总结与分享
5.1 PostgreSQL系统角色管理最佳实践
PostgreSQL系统角色管理最佳实践:
- 角色规划:
- 根据业务需求设计角色层次结构
- 使用组角色管理权限
- 遵循角色命名规范
- 分离不同职责的角色
- 权限管理:
- 遵循最小权限原则
- 通过组角色授予权限
- 定期审查权限分配
- 及时回收不必要的权限
- 超级用户管理:
- 限制超级用户数量
- 加强超级用户密码管理
- 限制超级用户登录来源
- 监控超级用户活动
- 普通用户管理:
- 为应用程序创建专用用户
- 只授予必要的权限
- 定期更换密码
- 监控用户活动
- 运维用户管理:
- 创建专门的运维用户
- 授予必要的管理权限
- 限制运维用户的操作范围
- 监控运维用户活动
5.2 PostgreSQL系统角色管理常见问题
PostgreSQL系统角色管理常见问题及解决方案:
- 权限不足:检查角色权限,确保已授予必要的权限
- 权限过度:审查权限分配,回收不必要的权限
- 密码管理:定期更换密码,使用强密码策略
- 角色过多:合并相似角色,减少角色数量
- 权限冲突:审查权限分配,避免权限冲突
- 继承问题:检查继承关系,确保权限正确继承
- 审计不足:启用审计日志,监控角色活动
- 安全漏洞:定期审查角色权限,修复安全漏洞
5.3 PostgreSQL系统角色安全建议
PostgreSQL系统角色安全建议:
- 最小权限原则:
- 只授予必要的权限
- 避免过度授权
- 定期审查权限
- 密码安全:
- 使用强密码
- 设置密码有效期
- 定期更换密码
- 密码加密存储
- 访问控制:
- 限制连接来源
- 使用SSL加密连接
- 配置pg_hba.conf
- 限制并发连接数
- 审计监控:
- 启用审计日志
- 监控角色活动
- 记录权限变更
- 定期审查审计日志
- 备份恢复:
- 定期备份角色和权限配置
- 测试备份恢复
- 确保备份安全存储
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
