1. 首页 > PostgreSQL教程 > 正文

PostgreSQL教程FG086-PG权限回收与重置:常见场景实操

本文档风哥主要介绍PostgreSQL的权限回收与重置操作,包括常见场景的实操方法、权限回收与重置的规划、实施和审计等内容。风哥教程参考PostgreSQL官方文档Server Administration内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 PostgreSQL权限回收的概念

PostgreSQL权限回收是指从用户或角色中移除已授予的权限的过程。权限回收是权限管理的重要组成部分,可以确保用户只拥有必要的权限,防止权限滥用和安全漏洞。更多视频教程www.fgedu.net.cn

PostgreSQL权限回收的主要特点:

  • 可以回收特定对象的权限
  • 可以回收特定操作的权限
  • 可以回收所有权限
  • 权限回收会级联到继承的角色
  • 权限回收需要相应的权限

1.2 PostgreSQL权限重置的概念

PostgreSQL权限重置是指将用户或角色的权限恢复到初始状态或重新分配权限的过程。权限重置通常在以下场景中使用:权限误分配、安全事件、系统升级或迁移等。

# PostgreSQL权限重置的主要场景
– 权限误分配:当权限被错误授予时
– 安全事件:当发生安全事件需要重置权限时
– 系统升级:当系统升级后需要重新配置权限时
– 权限混乱:当权限管理混乱需要重新整理时
– 角色变更:当用户角色变更时

# PostgreSQL权限重置的方法
– 回收所有权限后重新授予
– 删除并重新创建角色
– 使用脚本批量重置权限
– 从备份恢复权限配置

1.3 权限回收与重置的常见场景

权限回收与重置的常见场景包括:

  • 员工离职:回收离职员工的所有权限
  • 权限误分配:回收错误授予的权限
  • 角色变更:根据新角色重新分配权限
  • 安全事件:重置受影响用户的权限
  • 系统升级:重新配置权限以适应新系统
  • 权限审计:根据审计结果调整权限

Part02-生产环境规划与建议

2.1 PostgreSQL权限回收规划

PostgreSQL权限回收规划要点:

# 权限回收规划步骤
1. 分析权限需求:确定哪些权限需要回收
2. 识别影响范围:确定权限回收对系统和用户的影响
3. 制定回收策略:确定如何回收权限
4. 测试回收方案:在测试环境中测试权限回收
5. 实施回收操作:在生产环境中实施权限回收
6. 验证回收结果:验证权限回收是否成功

# 权限回收策略
– 逐步回收:分阶段回收权限,减少对系统的影响
– 批量回收:批量回收多个用户的相同权限
– 选择性回收:只回收特定对象或操作的权限
– 完全回收:回收用户的所有权限

# 权限回收注意事项
– 确保回收操作不会影响系统的正常运行
– 确保回收操作不会影响其他用户的权限
– 记录权限回收的原因和时间
– 通知相关用户权限回收的情况

2.2 PostgreSQL权限重置规划

PostgreSQL权限重置规划要点:

# 权限重置规划步骤
1. 分析重置原因:确定为什么需要重置权限
2. 制定重置方案:确定如何重置权限
3. 备份现有权限:备份当前的权限配置
4. 测试重置方案:在测试环境中测试权限重置
5. 实施重置操作:在生产环境中实施权限重置
6. 验证重置结果:验证权限重置是否成功

# 权限重置方案
– 完全重置:删除并重新创建角色
– 部分重置:回收特定权限后重新授予
– 批量重置:批量重置多个用户的权限
– 从备份恢复:从备份中恢复权限配置

# 权限重置注意事项
– 确保重置操作不会影响系统的正常运行
– 确保重置操作不会影响其他用户的权限
– 记录权限重置的原因和时间
– 通知相关用户权限重置的情况
– 测试重置后的系统功能

2.3 PostgreSQL权限管理流程

PostgreSQL权限管理流程:

# 权限管理流程
1. 权限申请:用户提交权限申请
2. 权限审批:相关人员审批权限申请
3. 权限授予:DBA授予权限
4. 权限使用:用户使用授予的权限
5. 权限审计:定期审计权限分配
6. 权限回收:回收不必要的权限
7. 权限重置:在必要时重置权限

# 权限变更流程
1. 变更申请:提交权限变更申请
2. 变更审批:相关人员审批变更申请
3. 变更实施:实施权限变更
4. 变更验证:验证变更结果
5. 变更记录:记录变更情况

# 权限事件处理流程
1. 事件识别:识别权限相关的事件
2. 事件分析:分析事件的原因和影响
3. 事件响应:采取相应的措施
4. 事件记录:记录事件处理情况
5. 事件回顾:回顾事件处理过程,总结经验

风哥提示:权限回收与重置是权限管理的重要组成部分,需要制定合理的规划和流程,确保操作的安全性和有效性。学习交流加群风哥微信: itpux-com

Part03-生产环境项目实施方案

3.1 PostgreSQL权限回收操作

3.1.1 回收表权限

# 以超级用户登录
$ psql -U pgsql

# 创建测试数据库
postgres=# CREATE DATABASE fgedu_test;

CREATE DATABASE

# 切换到测试数据库
postgres=# \c fgedu_test

# 创建测试表
fgedu_test=# CREATE TABLE fgedu_employees (
id serial PRIMARY KEY,
name varchar(50),
department varchar(50),
salary numeric(10,2)
);

CREATE TABLE fgedu_# 创建测试角色
fgedu_test=# CREATE ROLE test_fgedu1 WITH LOGIN PASSWORD ‘fgfgfgtest123’;

CREATE ROLE

fgedu_test=# CREATE ROLE test_fgedu2 WITH LOGIN PASSWORD ‘fgfgfgtest123’;

CREATE ROLE

# 授予表权限
fgedu_test=# GRANT SELECT, INSERT, UPDATE, DELETE ON fgedu_employees TO test_fgedu1, test_fgedu2;

GRANT

fgedu_test=# GRANT USAGE, SELECT ON SEQUENCE fgedu_employees_id_seq TO test_fgedu1, test_fgedu2;

GRANT

# 查看表权限
fgedu_test=# \dp fgedu_employees

Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
——–+————-+——-+——————-+——————-+———-
public | fgedu_employees | table | test_fgedu1=arwd/__pgsql | | | test_fgedu2=arwd/__pgsql | |

# 回收test_fgedu1的DELETE权限
fgedu_test=# REVOKE DELETE ON fgedu_employees FROM test_fgedu1;

REVOKE

# 查看表权限
fgedu_test=# \dp fgedu_employees

Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
——–+————-+——-+——————-+——————-+———-
public | fgedu_employees | table | test_fgedu1=arw/__pgsql | | | test_fgedu2=arwd/__pgsql | |

# 回收test_fgedu2的所有权限
fgedu_test=# REVOKE ALL PRIVILEGES ON fgedu_employees FROM test_fgedu2;

REVOKE

# 查看表权限
fgedu_test=# \dp fgedu_employees

Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
——–+————-+——-+——————-+——————-+———-
public | fgedu_employees | table | test_fgedu1=arw/__pgsql | | | test_fgedu2=__pgsql | |

3.1.2 回收数据库权限

# 授予数据库权限
fgedu_test=# GRANT CONNECT, CREATE ON DATABASE fgedu_test TO test_fgedu1, test_fgedu2;

GRANT

# 查看数据库权限
fgedu_test=# \l+

List of fgedudbs
Name | Owner | Encoding | Collate | Ctype | Access privileges | Size | Tablespace | Description
———–+———-+———-+———+———+———————–+———+————+——————————————–
pgsql | pgsql | UTF8 | C | C | | 8857 kB | pg_default | default administrative connection fgedudb
fgedu_test | pgsql | UTF8 | C | C | =Tc/pgsql +| 8857 kB | pg_default |
| | | | | postgres=CTc/postgres+| | |
| | | | | test_fgedu1=CTc/postgres+| | |
| | | | | test_fgedu2=CTc/pgsql | | |

# 回收test_fgedu1的CREATE权限
fgedu_test=# REVOKE CREATE ON DATABASE fgedu_test FROM test_fgedu1;

REVOKE

# 查看数据库权限
fgedu_test=# \l+

List of fgedudbs
Name | Owner | Encoding | Collate | Ctype | Access privileges | Size | Tablespace | Description
———–+———-+———-+———+———+———————–+———+————+——————————————–
pgsql | pgsql | UTF8 | C | C | | 8857 kB | pg_default | default administrative connection fgedudb
fgedu_test | pgsql | UTF8 | C | C | =Tc/pgsql +| 8857 kB | pg_default |
| | | | | postgres=CTc/postgres+| | |
| | | | | test_fgedu1=c/pgsql +| | |
| | | | | test_fgedu2=CTc/pgsql | | |

# 回收test_fgedu2的所有权限
fgedu_test=# REVOKE ALL PRIVILEGES ON DATABASE fgedu_test FROM test_fgedu2;

REVOKE

# 查看数据库权限
fgedu_test=# \l+

List of fgedudbs
Name | Owner | Encoding | Collate | Ctype | Access privileges | Size | Tablespace | Description
———–+———-+———-+———+———+———————–+———+————+——————————————–
pgsql | pgsql | UTF8 | C | C | | 8857 kB | pg_default | default administrative connection fgedudb
fgedu_test | pgsql | UTF8 | C | C | =Tc/pgsql +| 8857 kB | pg_default |
| | | | | postgres=CTc/postgres+| | |
| | | | | test_fgedu1=c/pgsql | | |

3.2 PostgreSQL权限重置操作

3.2.1 重置用户权限

# 以超级用户登录
$ psql -U pgsql

# 创建测试角色
postgres=# CREATE ROLE reset_test WITH LOGIN PASSWORD ‘reset123’;

CREATE ROLE

# 授予权限
postgres=# GRANT CONNECT ON DATABASE fgedu_test TO reset_test;

GRANT

postgres=# \c fgedu_test

fgedu_test=# GRANT USAGE ON SCHEMA public TO reset_test;

GRANT

fgedu_test=# GRANT SELECT, INSERT, UPDATE, DELETE ON fgedu_employees TO reset_test;

GRANT

# 查看权限
fgedu_test=# \dp fgedu_employees

Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
——–+————-+——-+——————-+——————-+———-
public | fgedu_employees | table | test_fgedu1=arw/__pgsql | | | reset_test=arwd/__pgsql | |

# 重置权限:回收所有权限后重新授予
fgedu_test=# REVOKE ALL PRIVILEGES ON fgedu_employees FROM reset_test;

REVOKE

fgedu_test=# GRANT SELECT ON fgedu_employees TO reset_test;

GRANT

# 查看权限
fgedu_test=# \dp fgedu_employees

Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
——–+————-+——-+——————-+——————-+———-
public | fgedu_employees | table | test_fgedu1=arw/__pgsql | | | reset_test=r/__pgsql | |

3.2.2 批量重置权限

# 创建多个测试角色
fgedu_test=# CREATE ROLE batch_fgedu1 WITH LOGIN PASSWORD ‘batch123’;

CREATE ROLE

fgedu_test=# CREATE ROLE batch_fgedu2 WITH LOGIN PASSWORD ‘batch123’;

CREATE ROLE

fgedu_test=# CREATE ROLE batch_fgedu3 WITH LOGIN PASSWORD ‘batch123’;

CREATE ROLE

# 批量授予权限
fgedu_test=# GRANT CONNECT ON DATABASE fgedu_test TO batch_fgedu1, batch_fgedu2, batch_fgedu3;

GRANT

fgedu_test=# GRANT USAGE ON SCHEMA public TO batch_fgedu1, batch_fgedu2, batch_fgedu3;

GRANT

fgedu_test=# GRANT SELECT, INSERT, UPDATE, DELETE ON fgedu_employees TO batch_fgedu1, batch_fgedu2, batch_fgedu3;

GRANT

# 查看权限
fgedu_test=# \dp fgedu_employees

Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
——–+————-+——-+——————-+——————-+———-
public | fgedu_employees | table | test_fgedu1=arw/__pgsql | | | reset_test=r/__pgsql | |
| | | batch_fgedu1=arwd/__pgsql | |
| | | batch_fgedu2=arwd/__pgsql | |
| | | batch_fgedu3=arwd/__pgsql | |

# 批量回收权限
fgedu_test=# REVOKE ALL PRIVILEGES ON fgedu_employees FROM batch_fgedu1, batch_fgedu2, batch_fgedu3;

REVOKE

# 批量重新授予权限
fgedu_test=# GRANT SELECT ON fgedu_employees TO batch_fgedu1, batch_fgedu2, batch_fgedu3;

GRANT

# 查看权限
fgedu_test=# \dp fgedu_employees

Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
——–+————-+——-+——————-+——————-+———-
public | fgedu_employees | table | test_fgedu1=arw/__pgsql | | | reset_test=r/__pgsql | |
| | | batch_fgedu1=r/__pgsql | |
| | | batch_fgedu2=r/__pgsql | |
| | | batch_fgedu3=r/__pgsql | |

3.3 权限回收与重置后的审计

3.3.1 审计权限回收结果

# 查看用户权限
fgedu_test=# SELECT
grantee,
table_schema,
table_name,
privilege_type
FROM
information_schema.role_table_grants
WHERE
table_schema = ‘public’ AND
grantee IN (‘test_fgedu1’, ‘test_fgedu2’, ‘reset_test’, ‘batch_fgedu1’, ‘batch_fgedu2’, ‘batch_fgedu3’)
ORDER BY
grantee, table_name, privilege_type;

grantee | table_schema | table_name | privilege_type
—————+————–+——————+—————-
batch_fgedu1 | public | fgedu_employees | SELECT
batch_fgedu2 | public | fgedu_employees | SELECT
batch_fgedu3 | public | fgedu_employees | SELECT
reset_test | public | fgedu_employees | SELECT
test_fgedu1 | public | fgedu_employees | INSERT
test_fgedu1 | public | fgedu_employees | REFERENCES
test_fgedu1 | public | fgedu_employees | SELECT
test_fgedu1 | public | fgedu_employees | TRIGGER
test_fgedu1 | public | fgedu_employees | UPDATE
test_fgedu2 | public | fgedu_employees |

# 测试用户权限
$ psql -U test_fgedu1 -d fgedu_test

fgedu_test=> INSERT INTO fgedu_employees (name, department, salary) VALUES (‘风哥1号’, ‘HR’, 8000);

INSERT 0 1

fgedu_test=> SELECT * FROM fgedu_employees;

id | name | department | salary
—-+——+————+——–
1 | 风哥1号 | HR | 8000
(1 row)

# 尝试删除数据(应该失败)
fgedu_test=> DELETE FROM fgedu_employees WHERE id = 1;

ERROR: permission denied for relation fgedu_employees

# 测试reset_test用户
$ psql -U reset_test -d fgedu_test

fgedu_test=> SELECT * FROM fgedu_employees;

id | name | department | salary
—-+——+————+——–
1 | 风哥1号 | HR | 8000
(1 row)

# 尝试插入数据(应该失败)
fgedu_test=> INSERT INTO fgedu_employees (name, department, salary) VALUES (‘风哥2号’, ‘IT’, 9000);

ERROR: permission denied for relation fgedu_employees

3.3.2 生成权限审计报告

#!/bin/bash
# permission_audit_after.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# from:www.itpux.com.qq113257174.wx:itpux-com
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# web: `http://www.fgedu.net.cn`
# web: `http://www.fgedu.net.cn`
# 权限回收与重置后的审计脚本
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

PG_HOST=”localfgedu.net.cn”
PG_PORT=”5432″
PG_USER=”pgsql”
PG_DATABASE=”fgedu_test”
OUTPUT_FILE=”permission_audit_after_$(date +%Y%m%d).txt”

# 连接数据库执行权限审计
psql -h $PG_HOST -p $PG_PORT -U $PG_USER -d $PG_DATABASE << EOF > $OUTPUT_FILE
\echo “=== PostgreSQL权限审计报告(回收/重置后) ===”
\echo “审计时间: $(date)”
\echo “”

\echo “=== 1. 表权限 ===”
SELECT
grantee,
table_schema,
table_name,
privilege_type
FROM
information_schema.role_table_grants
WHERE
table_schema = ‘public’
ORDER BY
grantee, table_name, privilege_type;
\echo “”

\echo “=== 2. 数据库权限 ===”
SELECT
grantee,
privilege_type
FROM
information_schema.role_fgedudb_grants
WHERE
fgedudb_name = ‘fgedu_test’
ORDER BY
grantee, privilege_type;
\echo “”

\echo “=== 3. 模式权限 ===”
SELECT
grantee,
privilege_type
FROM
information_schema.role_schema_grants
WHERE
schema_name = ‘public’
ORDER BY
grantee, privilege_type;
\echo “”
EOF

echo “权限审计完成,报告已保存到 $OUTPUT_FILE”

Part04-生产案例与实战讲解

4.1 员工离职权限回收案例

4.1.1 案例描述

场景:一个企业的员工离职,需要回收该员工的所有数据库权限,确保数据安全。

4.1.2 实施方案

# 1. 识别离职员工的角色

# 以超级用户登录
$ psql -U pgsql

# 查看所有角色
postgres=# \du

List of roles
Role name | Attributes | Member of
———–+————————————————————+———–
pgsql | Superfgedu, Create role, Create DB, Replication, Bypass RLS | {}
fgedu_fgedu | | {}
employee1 | | {}
employee2 | | {}

# 2. 回收离职员工的权限

# 查看employee1的权限
postgres=# \c fgedu_enterprise

fgedu_enterprise=# \dp

Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
——–+————-+——-+——————-+——————-+———-
public | fgedu_employees | table | hr_fgedu=arwd/__pgsql | | | employee1=arwd/__pgsql | |
public | fgedu_finances | table | finance_fgedu=arwd/__pgsql | |
public | fgedu_fgfgfgfgsales | table | fgfgfgfgsales_fgedu=arwd/__pgsql | |

# 回收employee1的所有表权限
fgedu_enterprise=# REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM employee1;

REVOKE

# 回收employee1的序列权限
fgedu_enterprise=# REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM employee1;

REVOKE

# 回收employee1的模式权限
fgedu_enterprise=# REVOKE ALL PRIVILEGES ON SCHEMA public FROM employee1;

REVOKE

# 回收employee1的数据库权限
fgedu_enterprise=# REVOKE ALL PRIVILEGES ON DATABASE fgedu_enterprise FROM employee1;

REVOKE

# 3. 禁用离职员工的角色

fgedu_enterprise=# ALTER ROLE employee1 NOLOGIN;

ALTER ROLE

# 4. 验证权限回收

# 查看employee1的权限
fgedu_enterprise=# \dp

Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
——–+————-+——-+——————-+——————-+———-
public | fgedu_employees | table | hr_fgedu=arwd/__pgsql | | | employee1=__pgsql | |
public | fgedu_finances | table | finance_fgedu=arwd/__pgsql | |
public | fgedu_fgfgfgfgsales | table | fgfgfgfgsales_fgedu=arwd/__pgsql | |

# 测试employee1登录(应该失败)
$ psql -U employee1 -d fgedu_enterprise
Password for fgedu employee1:
psql: error: connection to server on socket “/var/run/postgresql/.s.PGSQL.5432” failed: FATAL: role “employee1” is not permitted to log in

4.2 权限误分配重置案例

4.2.1 案例描述

场景:一个用户被错误地授予了过多的权限,需要重置该用户的权限,只保留必要的权限。

4.2.2 实施方案

# 1. 识别误分配的权限

# 以超级用户登录
$ psql -U pgsql

# 查看用户权限
postgres=# \c fgedu_enterprise

fgedu_enterprise=# \dp

Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
——–+————-+——-+——————-+——————-+———-
public | fgedu_employees | table | hr_fgedu=arwd/__pgsql | | | finance_fgedu=r/__pgsql | |
| | | fgfgfgfgsales_fgedu=r/__pgsql | |
public | fgedu_finances | table | finance_fgedu=arwd/__pgsql | |
| | | hr_fgedu=r/__pgsql | |
| | | fgfgfgfgsales_fgedu=r/__pgsql | |
public | fgedu_fgfgfgfgsales | table | fgfgfgfgsales_fgedu=arwd/__pgsql | |
| | | hr_fgedu=r/__pgsql | |
| | | finance_fgedu=r/__pgsql | |

# 发现fgfgfgfgsales_fgedu被错误授予了所有表的读取权限

# 2. 重置用户权限

# 回收fgfgfgfgsales_fgedu的所有权限
fgedu_enterprise=# REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM fgfgfgfgsales_fgedu;

REVOKE

# 重新授予fgfgfgfgsales_fgedu必要的权限
fgedu_enterprise=# GRANT SELECT, INSERT, UPDATE, DELETE ON fgedu_fgfgfgfgsales TO fgfgfgfgsales_fgedu;

GRANT

fgedu_enterprise=# GRANT USAGE, SELECT ON SEQUENCE fgedu_fgfgfgfgsales_id_seq TO fgfgfgfgsales_fgedu;

GRANT

# 3. 验证权限重置

# 查看fgfgfgfgsales_fgedu的权限
fgedu_enterprise=# \dp

Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
——–+————-+——-+——————-+——————-+———-
public | fgedu_employees | table | hr_fgedu=arwd/__pgsql | | | finance_fgedu=r/__pgsql | |
public | fgedu_finances | table | finance_fgedu=arwd/__pgsql | |
| | | hr_fgedu=r/__pgsql | |
public | fgedu_fgfgfgfgsales | table | fgfgfgfgsales_fgedu=arwd/__pgsql | |
| | | hr_fgedu=r/__pgsql | |

# 测试fgfgfgfgsales_fgedu的权限
$ psql -U fgfgfgfgsales_fgedu -d fgedu_enterprise

fgedu_enterprise=> SELECT * FROM fgedu_fgfgfgfgsales;

id | employee_id | sale_date | customer_name | amount | status
—-+————-+———–+—————+——–+——–
(0 rows)

# 尝试访问其他表(应该失败)
fgedu_enterprise=> SELECT * FROM fgedu_employees;

ERROR: permission denied for relation fgedu_employees

4.3 安全事件权限重置案例

4.3.1 案例描述

场景:发生安全事件,需要重置所有用户的权限,确保系统安全。

4.3.2 实施方案

# 1. 备份现有权限配置

# 以超级用户登录
$ psql -U pgsql

# 备份角色信息
postgres=# \o role_backup.sql

postgres=# SELECT ‘CREATE ROLE ‘ || rolname || ‘ WITH ‘ ||
CASE WHEN rolsuper THEN ‘SUPERUSER ‘ ELSE ” END ||
CASE WHEN rolauditadmin THEN ‘AUDITADMIN ‘ ELSE ” END ||
CASE WHEN rolcreaterole THEN ‘CREATEROLE ‘ ELSE ” END ||
CASE WHEN rolcreatedb THEN ‘CREATEDB ‘ ELSE ” END ||
CASE WHEN rolcanlogin THEN ‘LOGIN ‘ ELSE ‘NOLOGIN ‘ END ||
CASE WHEN rolreplication THEN ‘REPLICATION ‘ ELSE ” END ||
CASE WHEN rolbypassrls THEN ‘BYPASSRLS ‘ ELSE ” END ||
CASE WHEN rolpassword IS NOT NULL THEN ‘PASSWORD ”md5password” ‘ ELSE ” END ||
CASE WHEN rolvaliduntil IS NOT NULL THEN ‘VALID UNTIL ”’ || rolvaliduntil || ”’ ‘ ELSE ” END ||
‘;’
FROM pg_authid
WHERE rolname NOT IN (‘postgres’, ‘pg_signal_backend’);

postgres=# \o

# 备份权限信息
postgres=# \o permission_backup.sql

postgres=# SELECT ‘GRANT ‘ || privilege_type || ‘ ON ‘ || table_schema || ‘.’ || table_name || ‘ TO ‘ || grantee || ‘;’
FROM information_schema.role_table_grants
WHERE table_schema = ‘public’ AND grantee NOT IN (‘postgres’, ‘public’);

postgres=# \o

# 2. 重置所有用户权限

# 禁用所有非超级用户角色
postgres=# ALTER ROLE hr_fgedu NOLOGIN;

ALTER ROLE

postgres=# ALTER ROLE finance_fgedu NOLOGIN;

ALTER ROLE

postgres=# ALTER ROLE fgfgfgfgsales_fgedu NOLOGIN;

ALTER ROLE

# 回收所有非超级用户的权限
postgres=# \c fgedu_enterprise

fgedu_enterprise=# REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM hr_fgedu, finance_fgedu, fgfgfgfgsales_fgedu;

REVOKE

fgedu_enterprise=# REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM hr_fgedu, finance_fgedu, fgfgfgfgsales_fgedu;

REVOKE

fgedu_enterprise=# REVOKE ALL PRIVILEGES ON SCHEMA public FROM hr_fgedu, finance_fgedu, fgfgfgfgsales_fgedu;

REVOKE

fgedu_enterprise=# REVOKE ALL PRIVILEGES ON DATABASE fgedu_enterprise FROM hr_fgedu, finance_fgedu, fgfgfgfgsales_fgedu;

REVOKE

# 3. 重新授予权限

# 重新启用角色
fgedu_enterprise=# ALTER ROLE hr_fgedu LOGIN;

ALTER ROLE

fgedu_enterprise=# ALTER ROLE finance_fgedu LOGIN;

ALTER ROLE

fgedu_enterprise=# ALTER ROLE fgfgfgfgsales_fgedu LOGIN;

ALTER ROLE

# 重新授予权限
fgedu_enterprise=# GRANT CONNECT ON DATABASE fgedu_enterprise TO hr_fgedu, finance_fgedu, fgfgfgfgsales_fgedu;

GRANT

fgedu_enterprise=# GRANT USAGE ON SCHEMA public TO hr_fgedu, finance_fgedu, fgfgfgfgsales_fgedu;

GRANT

fgedu_enterprise=# GRANT SELECT, INSERT, UPDATE, DELETE ON fgedu_employees TO hr_fgedu;

GRANT

fgedu_enterprise=# GRANT USAGE, SELECT ON SEQUENCE fgedu_employees_id_seq TO hr_fgedu;

GRANT

fgedu_enterprise=# GRANT SELECT, INSERT, UPDATE, DELETE ON fgedu_finances TO finance_fgedu;

GRANT

fgedu_enterprise=# GRANT USAGE, SELECT ON SEQUENCE fgedu_finances_id_seq TO finance_fgedu;

GRANT

fgedu_enterprise=# GRANT SELECT, INSERT, UPDATE, DELETE ON fgedu_fgfgfgfgsales TO fgfgfgfgsales_fgedu;

GRANT

fgedu_enterprise=# GRANT USAGE, SELECT ON SEQUENCE fgedu_fgfgfgfgsales_id_seq TO fgfgfgfgsales_fgedu;

GRANT

# 4. 验证权限重置

# 查看权限
fgedu_enterprise=# \dp

Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
——–+————-+——-+——————-+——————-+———-
public | fgedu_employees | table | hr_fgedu=arwd/__pgsql public | fgedu_finances | table | finance_fgedu=arwd/__pgsql | |
public | fgedu_fgfgfgfgsales | table | fgfgfgfgsales_fgedu=arwd/__pgsql | |

# 测试用户权限
$ psql -U hr_fgedu -d fgedu_enterprise

fgedu_enterprise=> SELECT * FROM fgedu_employees;

id | name | department | position | salary | hire_date
—-+——+————+———-+——–+————
(0 rows)

$ psql -U finance_fgedu -d fgedu_enterprise

fgedu_enterprise=> SELECT * FROM fgedu_finances;

id | employee_id | transaction_date | amount | description | type
—-+————-+——————+——–+————-+——
(0 rows)

$ psql -U fgfgfgfgsales_fgedu -d fgedu_enterprise

fgedu_enterprise=> SELECT * FROM fgedu_fgfgfgfgsales;

id | employee_id | sale_date | customer_name | amount | status
—-+————-+———–+—————+——–+——–
(0 rows)

风哥教程针对风哥教程针对风哥教程针对生产环境建议:在生产环境中,建议建立完善的权限回收与重置流程,确保操作的安全性和有效性。同时,需要定期审计权限分配情况,及时发现和解决权限相关的问题。更多学习教程公众号风哥教程itpux_com

Part05-风哥经验总结与分享

5.1 PostgreSQL权限回收最佳实践

PostgreSQL权限回收最佳实践:

from oracle:www.itpux.com

  • 明确回收原因:记录权限回收的原因和时间
  • 分析影响范围:确定权限回收对系统和用户的影响
  • 逐步回收:分阶段回收权限,减少对系统的影响
  • 验证回收结果:确保权限回收成功,且不会影响其他用户
  • 通知相关用户:及时通知用户权限回收的情况
  • 记录操作:记录权限回收的详细信息,便于审计
  • 定期审查:定期审查权限分配情况,及时回收不必要的权限

5.2 PostgreSQL权限重置最佳实践

PostgreSQL权限重置最佳实践:

  • 备份现有权限:在重置权限前备份当前的权限配置
  • 制定重置方案:根据具体情况制定合理的重置方案
  • 测试重置方案:在测试环境中测试权限重置
  • 实施重置操作:在生产环境中实施权限重置
  • 验证重置结果:确保权限重置成功,且系统功能正常
  • 通知相关用户:及时通知用户权限重置的情况
  • 记录操作:记录权限重置的详细信息,便于审计
  • 定期审查:定期审查权限分配情况,避免权限混乱

5.3 权限回收与重置常见问题

权限回收与重置常见问题及解决方案:

学习交流加群风哥QQ113257174

  • 权限回收不彻底:使用REVOKE ALL PRIVILEGES命令回收所有权限
  • 权限重置影响其他用户:在重置权限前分析影响范围
  • 权限重置后系统功能异常:在重置权限后测试系统功能
  • 权限回收后用户无法登录:确保用户仍有数据库连接权限
  • 权限重置后权限配置丢失:在重置权限前备份权限配置
  • 权限回收与重置操作复杂:使用脚本自动化权限回收与重置操作
  • 权限审计不足:定期审计权限分配情况,及时发现问题
  • 权限管理流程不明确:建立明确的权限管理流程和责任分工
风哥提示:权限回收与重置是权限管理的重要组成部分,需要制定合理的规划和流程,确保操作的安全性和有效性。定期审计权限分配情况,及时发现和解决权限相关的问题,提高数据库的安全性和可管理性。from PostgreSQL:www.itpux.com

持续改进:权限管理是一个持续的过程,需要根据业务需求和安全要求不断调整和优化。建议建立定期审查机制,持续改进权限管理策略和方法。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息