postgresql中实现三权分立

news/2025/2/23 17:48:33/文章来源:https://www.cnblogs.com/yldf/p/18732530

目录
  • 前言
  • 三权分立的目标:
  • 如何在 PostgreSQL 中实现三权分立:
  • 具体操作实例
    • 1. 创建角色
    • 2. 实现审计控制
    • 3. 授权管理
    • 4. 权限限制
    • 5. 监控和审计日志
  • 小结:
  • 说明

前言

在 PostgreSQL 中,三权分立(Separation of Duties, SoD)是一种控制机制,旨在确保系统中有不同的角色分别负责不同的任务和权限,以减少错误、欺诈和滥用的风险。实现三权分立的目标是将数据库中的权限和职责分配给多个角色,避免一个用户或角色拥有过多的权限,造成安全隐患。

三权分立的目标:

  1. 授权管理:限制谁有权授予数据库权限。
  2. 审计与监控:确保对关键操作进行审计,限制某些角色对数据库的修改和访问。
  3. 执行与访问控制:对操作数据库的权限进行严格分配,确保不同的角色只执行其特定任务。

如何在 PostgreSQL 中实现三权分立:

假设我们有以下三类用户和角色:

  1. 管理员db_admin):负责管理数据库和用户,但不能直接操作数据。
  2. 审计员auditor):负责数据库的审计和查看日志,但不能修改数据。
  3. 数据操作员data_operator):负责操作数据,如插入、更新、删除,但没有权限创建或删除表等。

具体操作实例

1. 创建角色

首先,创建这三种角色,并赋予它们不同的权限。

-- 创建 db_admin 角色
CREATE ROLE db_admin WITH LOGIN PASSWORD 'admin_pass';
GRANT CREATE, CONNECT ON DATABASE your_db TO db_admin;
-- db_admin 角色可以创建表、视图、索引等,但不能直接操作数据。-- 创建 auditor 角色
CREATE ROLE auditor WITH LOGIN PASSWORD 'auditor_pass';
GRANT CONNECT ON DATABASE your_db TO auditor;
GRANT USAGE ON SCHEMA public TO auditor;
-- auditor 角色只能查看数据,不能进行修改。我们不授予 INSERT, UPDATE, DELETE 权限。-- 创建 data_operator 角色
CREATE ROLE data_operator WITH LOGIN PASSWORD 'operator_pass';
GRANT CONNECT ON DATABASE your_db TO data_operator;
GRANT USAGE ON SCHEMA public TO data_operator;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO data_operator;
-- data_operator 角色可以操作数据,但不能进行表的创建和删除。

2. 实现审计控制

为了实现审计,我们可以使用 PostgreSQL 的 pg_audit 插件或依赖于日志和触发器来实现审计。下面是一个简单的审计实现:

-- 启用日志审计(假设已经配置好 logging)
ALTER SYSTEM SET log_statement = 'all'; -- 记录所有 SQL 语句
ALTER SYSTEM SET log_connections = on; -- 记录连接日志
ALTER SYSTEM SET log_disconnections = on; -- 记录断开连接日志
-- 重载配置使设置生效
SELECT pg_reload_conf();

你可以通过审计日志查看用户的操作,确保数据库的操作和变更都能被追踪。

3. 授权管理

在三权分立中,db_admin 角色通常是唯一有权限创建用户和授予权限的角色。为此,我们可以让 db_admin 角色具备管理权限,而不授予它执行数据操作的权限。

-- 授予 db_admin 创建角色和授权权限
GRANT CREATE ROLE, ALTER ROLE, DROP ROLE TO db_admin;
-- db_admin 可以创建、修改和删除其他角色,但不能直接操作数据。

4. 权限限制

  • db_admin:只能管理数据库结构和用户权限,不得操作数据。
  • auditor:只能查询数据,不能执行插入、更新或删除等操作。
  • data_operator:可以对数据进行增删改查操作,但不能管理数据库对象(如表、视图、角色等)。

为了保证权限分离的严格性,使用 REVOKE 来限制不必要的权限。

-- 确保 db_admin 角色不能直接操作数据
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM db_admin;
REVOKE ALL ON ALL SEQUENCES IN SCHEMA public FROM db_admin;-- 确保 auditor 角色不能修改数据
REVOKE INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public FROM auditor;-- 确保 data_operator 不能创建表等对象
REVOKE CREATE ON SCHEMA public FROM data_operator;

5. 监控和审计日志

可以使用 PostgreSQL 提供的日志功能来监控用户操作,并通过第三方工具来分析日志,进行合规性审查。

小结:

通过以上步骤,我们实现了一个简单的三权分立体系:

  • db_admin:负责数据库管理和用户权限控制。
  • auditor:负责审计和查看日志,但不能更改数据。
  • data_operator:负责操作数据,但无法管理数据库或授予权限。

这种分离可以有效减少滥用权限的风险,增强数据库的安全性。你还可以根据具体的安全需求,进一步细化权限控制,确保各个角色只能执行其授权的操作。

说明

该文章基于 chatgpt 提问生成 仅供记录笔记用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/888494.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt报错error: member access into incomplete type QTcpSocket

现象解决办法 在mainwindow.cpp文件中添加头文件。 #include <QTcpSocket>

Spring Boot中如何优雅地读取Jar包中的Resources目录下的文件

在Java的Spring Boot项目中,我们经常需要从resources目录下读取配置文件或其他资源文件。在本地开发环境中,我们可以轻松地使用绝对路径访问这些文件,但项目一旦打包成Jar包并部署到服务器上,这种访问方式就失效了。 因此,掌握在Jar包中读取resources目录下文件的方法至关…

开学测试总结owo

经过这次的小测,在这次测试中,我个人认为最大的变化,就是逻辑性增强,sql语句的要求更多了, 这就反应了对于web应用开发这门课对我们专业的用处,还有,前端页面的美化,我认为前端代码,多 数交给AI就可以了,但主要是你自己要明白需求到底是什么,你要完成的项目是什么,…

get current user

02 - 从SpringSecurity中获取当前用户 一行搞定 SecurityContextHolder.getContext().getAuthentication().getPrincipal();这里自定义了一个UserDetailsImpl类实现UserDetails接口, 此时loadUserByUsername方法的返回对象的类型也要改成自定义类型(01篇最后那样), 不然报错。测…

自编译Frp 实现二次开发

在使用过程中,我们都是利用作者打包好的包,直接使用。但是现实中,我们可能需要对其进行二开。 因而,本文简单的为大家介绍下frp的二次开发。以修改frps dashboard为例。现在让我们一起来学习吧。修改之前的界面修改后效果 安装GO环境 因为,Frp是基于GO开发的,所以我们需要…

从黑盒到透明:AI Agent 运行监控实战!

你是否遇到过这样的情况:辛辛苦苦开发的 AI Agent 突然失灵了,却不知道是哪个环节出了问题?今天给家人们分享一下如何让 AI Agent 的运行过程透明化。 一、为什么要监控 AI Agent? 传统的对话系统就像一张预先画好的地图,用户只能按照既定路线前进。而 AI Agent 则像是一位…

[2025.2.23] 周记

引言在这周的面试当中,我遇到了几个不是很清楚的题目,回家之后进行学习发现了一些比较有意思的事情,在这里记录一下 这周还发现了一个很有帮助的Java知识网站:Java 基础 - 面向对象 | Java 全栈知识体系1.字符串和常量池 在这次面试当中遇到的一个原题就是 String i = "i&…

YOLOv5 的量化及部署 - RGB 专题

技术背景 YOLOv5 是一种高效的目标检测算法,尤其在实时目标检测任务中表现突出。YOLOv5 通过三种不同尺度的检测头分别处理大、中、小物体;检测头共包括三个关键任务:边界框回归、类别预测、置信度预测;每个检测头都会逐像素地使用三个 Anchor,以帮助算法更准确地预测物体…

Java基础学习(十七)

Java基础学习(十七):网络编程 目录Java基础学习(十七):网络编程概念IP端口号协议UDP 通信TCP 通信 本文为个人学习记录,内容学习自 黑马程序员概念定义:在网络通信协议下,不同计算机上运行的程序进行的数据传输 常见的软件架构:C/S 和 B/SC/S:Client/Server,在用户…

最小费用最大流问题的 SSP 算法

我们已经了解最大流问题,其目标是通过网络中的各条边传输流量,尽可能地从源点流向汇点。通过经典的算法,如 Ford-Fulkerson 增广,我们能够找到一种方式,最大化从源点到汇点的流量。 然而,最大流问题的基本形式并没有考虑流动的成本。一个图的最大流值是一个固定数,可以由…

逆向软件设计-扫雷(C语言)

本人选用了舍友开发的C语言扫雷游戏用以学习逆向软件设计,环境为vs2022 在该程序中,代码被分成了三个部分,分别是game的头文件和源文件,以及test的源文件 在game的头文件中,代码主要包括了游戏的基本信息和函数 #include<stdio.h> #include<stdlib.h> #includ…

将一个数组旋转 k 步

题目:将一个数组旋转 k步。如输入一个数组[1,2,3,4,5,6,7] 和 k = 3, 即旋转 3步。输出 [5,6,7,1,2,3,4] 解题思路:思路1: 把k 后面的元素,挨个pop,然后unshif 到数组前面 思路2: 将 k 后面的所有数据拿出来作为 part1 将 k前面的所有数据拿出来作为part2 返回 part1.conca…