【postgresql初级使用】用户与角色的关系,搭建数据库安全体系中的分权管理

news2024/11/16 18:25:41

用户角色管理

专栏内容

  • postgresql使用入门基础
  • 手写数据库toadb
  • 并发编程

个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

文章目录

  • 用户角色管理
  • 概述
  • 信息查看
    • 查看用户信息
    • 查看角色信息
  • 创建删除
    • 创建角色
    • 删除角色
    • 创建和删除用户
  • 案例
    • 场景分析
    • 管理员用户
      • 创建管理员用户
      • 创建数据库
      • 创建业务表
      • 创建角色
      • 创建用户
    • 数据导入业务
    • 数据分析业务
  • 总结
  • 结尾

概述


在数据库中有一套严格的访问控制策略,它是基于数据库用户,也就是说一个数据库对象,如database,可以给不同用户没的访问权限,如用户user1,有只读访问权限,用户user2有创建表的权限等等,通过这一套访问权限来保证数据的安全。

在postgresql中,访问数据的前提是以用户的形式登陆数据库,不同的用户被赋予不同的权限。拥有相同权限的一组用户,可以被标记为同一种角色,这与现实社会是类似的,如保管员角色,工人角色,它们访问生产资料的权限和使用方式也是不同的。

本节就来分享一下postgresql中用户(user),角色(role)的用法,以及它们的特点。

信息查看


在postgresql数据库中,如何查看已经存在的用户和角色呢,以及不同用户和角色有什么样的权限,下面我们分别来看一下。

查看用户信息

用户信息存储在pg_user这张系统视图中,用户都可以查看。

postgres=> select * from pg_user;
 usename  | usesysid | usecreatedb | usesuper | userepl | usebypassrls |  passwd  | valuntil |       useconfig
----------+----------+-------------+----------+---------+--------------+----------+----------+------------------------
 postgres |       10 | t           | t        | t       | t            | ******** |          |
 senllang |    16682 | f           | f        | f       | f            | ******** |          | {search_path=senlleng}
(2 rows)

可以看到有两个用户,一个是当前登陆的senllang用户,另一个是postgres是数据库的管理员账户,是在集簇创建时创建的,是默认的超级管理员;它们在数据库内部使用的是usersysid来标识。

可以看到用户级信息有:

  • usecreatedb, 创建database权限,该用户是否可以创建database;
  • usesuper,超级用户权限,该用户是否有超级用户权限;
  • userepl,流复制的权限;
  • usebypassrls,是否对行级安全策略旁路的权限;
  • valuntil,密码过期时间;
  • useconfig,其它运行时配置 ;

当拥有上述权限时,显示为 t, 否则显示为f, passwd此处只显示为*,并不是实际的密码。

查看角色信息

在postgresql数据库创建后,系统默认创建了很多角色,可以通过pg_roles这个系统视图来查看。

postgres=> select * from pg_roles;
           rolname           | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolconnlimit | rolpassword | rolvaliduntil | rolbypassrls |       rolconfig        |  oid
-----------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+-------------+---------------+--------------+------------------------+-------
 postgres                    | t        | t          | t             | t           | t           | t              |           -1 | ********    |               | t            |                        |    10
 pg_database_owner           | f        | t          | f             | f           | f           | f              |           -1 | ********    |               | f            |                        |  6171
 pg_read_all_data            | f        | t          | f             | f           | f           | f              |           -1 | ********    |               | f            |                        |  6181
 pg_write_all_data           | f        | t          | f             | f           | f           | f              |           -1 | ********    |               | f            |                        |  6182
 pg_monitor                  | f        | t          | f             | f           | f           | f              |           -1 | ********    |               | f            |                        |  3373
 pg_read_all_settings        | f        | t          | f             | f           | f           | f              |           -1 | ********    |               | f            |                        |  3374
 pg_read_all_stats           | f        | t          | f             | f           | f           | f              |           -1 | ********    |               | f            |                        |  3375
 pg_stat_scan_tables         | f        | t          | f             | f           | f           | f              |           -1 | ********    |               | f            |                        |  3377
 pg_read_server_files        | f        | t          | f             | f           | f           | f              |           -1 | ********    |               | f            |                        |  4569
 pg_write_server_files       | f        | t          | f             | f           | f           | f              |           -1 | ********    |               | f            |                        |  4570
 pg_execute_server_program   | f        | t          | f             | f           | f           | f              |           -1 | ********    |               | f            |                        |  4571
 pg_signal_backend           | f        | t          | f             | f           | f           | f              |           -1 | ********    |               | f            |                        |  4200
 pg_checkpoint               | f        | t          | f             | f           | f           | f              |           -1 | ********    |               | f            |                        |  4544
 pg_use_reserved_connections | f        | t          | f             | f           | f           | f              |           -1 | ********    |               | f            |                        |  4550
 pg_create_subscription      | f        | t          | f             | f           | f           | f              |           -1 | ********    |               | f            |                        |  6304
 senllang                    | f        | t          | f             | f           | t           | f              |           -1 | ********    |               | f            | {search_path=senlleng} | 16682
(16 rows)

可以看到数据库中已经默认创建了很多角色,特别是刚才的看到的两个用户也列在其中,这是为什么呢?

在postgresql 中用户和角色在内部实现是一样的,只是在创建时,用户默认有登陆权限,而角色默认没有。

这是postgresql 实现时的一样简化处理,实际使用中,我们还是按SQL标准中对它们的定义来使用,即用户用来实际登陆数据,而角色是权限的集合,用来赋予用户。

角色是权限的集合,那么它又会延伸出几项权限:

  • rolinherit,权限是否可以由成员角色继承;
  • rolcreaterole,创建更多角色的权限;
  • rolcanlogin,是否可以登陆;如果可以登陆时,就和用户是一样了,建议不要混合使用;
  • rolconnlimit,最大连接数的限制;-1 表示没有限制,此时由配置文件中的max_connections控制;

创建删除


在数据库设计时,对业务表设计完成后,需要规划有那几类访问的角色,确定维护和管理用户。

特别要注意,实际使用中千万不能用默认的超级管理员用户postgres,它拥有所有权限。

下面我们来看一下创建和删除用户的SQL语法。

创建角色

创建角色的SQL语法如下:

CREATE ROLE role_name WITH option;

这里的option可以有以下单一或者组合:

  • SUPERUSER
  • CREATEDB
  • CREATEROLE
  • INHERIT
  • LOGIN
  • REPLICATION
  • BYPASSRLS
  • CONNECTION LIMIT connlimit
  • PASSWORD ‘password’
  • VALID UNTIL ‘timestamp’
  • IN ROLE role_name [, …], 新创建的角色成为 role_name的成员,这里可以写多个;
  • ROLE role_name [, …], 同上面相反,将指定的已存在的role_name加入新建角色的组中,也就是新建了一个组;
  • ADMIN role_name [, …],将role_name加入新建角色的组中,同时将role_name设置为分组中的管理角色,它可以将分组授于其它角色;

角色的权限除了在创建时指定的权限外,数据库对象的操作权限可以使用grant赋予对应的角色。

角色使用中关于权限的继承,在postgresql16之中grant语句也增加了WITH INHERIT对承继的控制,所以优先是grant子句,如果没有指定时使用角色的inherit控制;在postgresql16版本以前,只能通过角色的inherit来控制,但是当中间有不需要继承的处理时,就非常麻烦。

删除角色

删除角色的SQL语法如下:

DROP ROLE [IF EXISTS] role_name;

当然,这是一个非常危险的操作,尤其该角色已经被赋予了其它角色,或者已经创建了数据库对象时,此时先要转移所有者,再删除。

创建和删除用户

用户的创建与删除,与角色是一样的SQL语法,只是用户创建后默认会带有登陆权限,所以这里不再赘述。

案例


下面我们通过一个案例,来使用角色和用户保障数据库的用户数据安全。

场景分析

在这里插入图片描述

在大数据分析业务应用中,一般会分为三种角色:

  • dba管理员

创建其它角色,将权限分配到不同角色中;
根据业务数据创建不同的数据库以及数据表,分配权限;
同时根据业务接入,创建和删除用户,以角色形式分配权限;

  • 数据导入角色

将收集到的数据源源不断的导入指定数据的表中;
此类角色只有对应表的查询,插入,更新权限,不能对表drop 和 数据的delete操作;

  • 数据分析角色

数据分析业务接入时的用户拥有的权限;
它们只有数据表的select权限,没有其它任务权限

管理员用户

系统中只设定一个管理员用户,所以以user的形式直接创建。

管理员用户主要做以下几件事情:

  1. 创建database;
  2. 创建数据表;
  3. 创建角色,以及赋予它们权限;
  4. 创建业务应用使用的user用户;

创建管理员用户

先要切换到超级管理员用户postgres,由它来创建其它角色,因为当前用户不具有创建角色的权限;

postgres=> \c postgres postgres
You are now connected to database "postgres" as user "postgres".
postgres=#

通过\c database user这个命令进行切换登陆的数据库和用户;
之后可以看到命令行提示符变为=#,这表示在超级管理员用户下了。

postgres=# CREATE USER dba WITH PASSWORD '123456' CREATEDB CREATEROLE;
CREATE ROLE

这里可以看到,用户创建成功,具有createdbcreaterole权限。

下面由此dba用户开始工作。

创建数据库

以dba用户登陆postgres数据库,再创建自己的数据为mydb;

postgres=# \c postgres dba
You are now connected to database "postgres" as user "dba".
postgres=> create database mydb;
CREATE DATABASE

注意,此时还在postgres数据库中,还没有权限操作,需要切换到自己的数据库mydb中,才能行使dba权限。

创建业务表

下面在mydb中创建两张业务表。

需要先用dba用户登陆到mydb数据库中。

postgres=> \c mydb dba
You are now connected to database "mydb" as user "dba".
mydb=> 

可以看到提示符已经变更为mydb=>,说明当前已经在mydb数据中了。

mydb=> CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    price NUMERIC
);
CREATE TABLE
mydb=> CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100)
);
CREATE TABLE
mydb=>

创建了两张业务表来模拟数据分析业务。

创建角色

下面创建业务应用对应的角色,一是数据导入角色;另一个是数据分析的只读角色;

mydb=> CREATE ROLE data_maintainer_role ;
CREATE ROLE
mydb=> CREATE ROLE read_only_role ;
CREATE ROLE

给角色分配数据对象的权限,角色其实是权限的集合;

mydb=> GRANT SELECT, INSERT, UPDATE ON TABLE users, products TO data_maintainer_role;
GRANT
mydb=> GRANT SELECT ON TABLE users, products TO read_only_role;
GRANT
  • 数据导入data_maintainer_role,拥有两张表的select,update,insert权限,但不能delete数据,一般也不会直接delete,只是在数据上打个删除标记。
  • 数据分析read_only_role,只有select权限,它只有读数据分析即可。
  • 当有新的业务表时,将权限加到角色上即可,对应的用户也会自动具有权限,节省了大量工作;

创建用户

权限架构分配结束后,准备应用的接入了。

给不同的应用准备登陆用户,先准备两个用户,当然也可以根据应用的多少,准备多个用户。

mydb=> CREATE USER data_maintainer WITH PASSWORD '123456';
CREATE ROLE
mydb=> CREATE USER analyst WITH PASSWORD '123456';
CREATE ROLE

给用户赋予对应的角色,也就是权限的集合,类似于给一张门禁卡,那些门可以打开,那些不能打开。

mydb=> GRANT data_maintainer_role TO data_maintainer;
GRANT ROLE
mydb=> GRANT read_only_role TO analyst;
GRANT ROLE

当然后续有更多应用的用户创建时,也是根据类型赋予不同角色的权限集就可以。

数据导入业务

数据导入业务以data_maintainer登陆,可以数据导入动作。

mydb=> \c mydb data_maintainer
You are now connected to database "mydb" as user "data_maintainer".
mydb=> \d
              List of relations
 Schema |      Name       |   Type   | Owner
--------+-----------------+----------+-------
 public | products        | table    | dba
 public | products_id_seq | sequence | dba
 public | users           | table    | dba
 public | users_id_seq    | sequence | dba
(4 rows)

mydb=> select * from products;
 id | name | price
----+------+-------
(0 rows)

mydb=> insert into products values(1,'pen',10);
INSERT 0 1
mydb=> insert into users values(1, 'senllang','study@senllang.onaliyun.com');
INSERT 0 1
mydb=> select * from products;
 id | name | price
----+------+-------
  1 | pen  |    10
(1 row)

mydb=> select * from users;
 id | username |            email
----+----------+-----------------------------
  1 | senllang | study@senllang.onaliyun.com
(1 row)

每张表中插入了一条数据。

数据分析业务

数据分析业务以analyst用户登陆,只能有数据查看的权限。

mydb=> \c mydb analyst
You are now connected to database "mydb" as user "analyst".
mydb=> select * from products;
 id | name | price
----+------+-------
  1 | pen  |    10
(1 row)

mydb=> insert into products values(2,'rule',10);
ERROR:  permission denied for table products

对数据的修改不会被拒绝,保障数据的安全。

总结


postgresql 数据库中通过角色和用户来维护权限集的分配,以及权限的传递继承,使得DBA可以轻松的维护权限赋予,变更。

结尾


非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

注:未经同意,不得转载!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 Smart-doc 记录 Spring REST API

如果您正在使用 Spring Boot 开发 RESTful API,您希望让其他开发人员尽可能容易地理解和使用您的 API。文档是必不可少的,因为它为将来的更新提供了参考,并帮助其他开发人员与您的 API 集成。很长一段时间以来,记录 REST API 的方…

Toshiba东芝TB67S109AFNAG:步进电机控制的强大解决方案

与我司合作的工程师客户不断寻求稳健、高效且精确的元件来提升他们的产品设计。东芝的TB67S109AFNAG步进电机驱动IC具备这些优点,是从工业机械到消费电子等广泛应用的理想选择。本文将深入探讨TB67S109AFNAG的特性、优势和应用。 主要特性 TB67S109AFNAG是一款采用…

《人生苦短,我用python·七》各种报错问题解决及C++调用python的接口

1、VS的debug版本正常可以调用python的release版本(python安装完只有release版本的dll和lib),在项目——附加依赖项中加入python39.lib然后编译debug版本报错,无法打开python39_d.lib,我在项目属性配置的是调用release…

少儿编程 2024年6月电子学会图形化编程等级考试Scratch一级真题解析(选择题)

2024年6月scratch编程等级考试一级真题 选择题(共25题,每题2分,共50分) 1、音乐Video Game1的时长将近8秒,点击一次角色,下列哪个程序不能完整地播放音乐两次 A、 B、 C、 D、 答案:D 考…

Redis基础教程(十一):Redis 发布订阅

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…

【FFmpeg】avcodec_open2函数

目录 1. avcodec_open21.1 编解码器的预初始化(ff_encode_preinit & ff_decode_preinit)1.2 编解码器的初始化(init)1.3 释放编解码器(ff_codec_close) FFmpeg相关记录: 示例工程&#xff…

vue H5页面video 视频流自动播放, 解决ios不能自动播放问题

视频组件 <videostyle"width: 100%; height: 100%;object-fit: fill"class"player"refplayer_big_boxcontrolspreloadautoplay //自动播放muted //是否静音playsinline"true"x5-playsinline""webkit-playsinline"tru…

麒麟服务器操作系统漏洞补丁包怎么快速下载

第一种方案:【建议方案】 1、将漏洞公告里的“受影响的软件包”全部复制出来到文本文件中 2、在对应版本的服务器系统中修改好repo文件,如果在x86系统中下载aarch64的补丁包,可以将repo中的$basearch替换为aarch64. [root@localhost ~]# vim package.txt #将第一步的软件…

澳大利亚新闻.科技.汽车.旅行.商业类单发媒体

每日简报Daily Bulletin 澳大利亚西部时间ModernAustralian.com 澳大利亚垂直新闻.科技.汽车.旅行.商业类媒体&#xff0c;ModernAustralian.com是澳大利亚西部地区的一家权威媒体平台&#xff0c;提供全面的新闻报道、科技资讯、汽车信息、旅行指南、商业动态等内容。每日简报…

横截面数据回归

横截面数据回归 一些笔记 观测值一定要比参数值多 p值<0.05,拒绝H0. 参数显著&#xff0c;不能说明模型对 AIC与BIC准则&#xff0c;越小越好的指标值AIC 回归分析一定要进行残差的正态性检验。所有的残差都大于0&#xff0c;小于0&#xff0c;都不正常。残差正常应该是分…

p2p、分布式,区块链笔记:试用ZeroTier组网

ZeroTier 是一种用于创建和管理虚拟局域网&#xff08;Virtual Local Area Network&#xff0c;VLAN&#xff09;的软件定义网络&#xff08;SDN&#xff09;解决方案。它可以通过互联网将多个设备安全地连接在一起&#xff0c;就像它们在同一个本地网络上一样。主要开发语言为…

rust + mingw安装教程

0. 说明 windows上安装rust时&#xff0c;需要在电脑上安装C/C构建工具。推荐的的两种工具链可以选择&#xff1a; visual studio build toolsmingw 官方推荐使用visual studio&#xff0c;若你的电脑上已经安装了visual studio&#xff0c;则无需再安装&#xff0c;直接安装…

GPT Prompt冠军调教技巧CO-STAR

新加坡政府科技局 (GovTech) 举办的首届 GPT-4 提示工程大赛冠军Sheila Teo分享了她的一些提示撰写技巧及案例分析。 使用 CO-STAR 框架撰写Prompt CO-STAR是结构化的Prompt模版六大要素的首字母缩写&#xff0c;即&#xff1a; © Context 上下文&#xff1a;为任务提供背…

vue3进阶,渲染函数使用

目录 渲染函数使用场景 h() 渲染函数 渲染函数基础写法 渲染函数的组件传参&#xff0c;事件传递 渲染函数的插槽使用 结语 渲染函数使用场景 在写这篇文章之前&#xff0c;我会先简单说一下渲染函数&#xff0c;并且我会在第一个渲染函数的介绍中&#xff0c;标名渲染函数…

算法力扣刷题记录 二十八【225. 用队列实现栈】

前言 栈和队列篇。 记录 二十八【225. 用队列实现栈】 一、题目阅读 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void p…

单片机关键任务优先级的实现学习

与总体产品联调时&#xff0c;需要各个单机系统严格按照总体要求&#xff0c;进行数据输出&#xff0c;时间的偏差将出现系统异常&#xff0c;控制失败等不稳定情况产生&#xff0c;甚至影响到产品安全。 因此必须确保某些关键任务的优先执行。单片机任务优先级一般有两种方式…

My sql 安装,环境搭建

以下以MySQL 8.0.36为例。 一、下载软件 1.下载地址官网&#xff1a;https://www.mysql.com 2. 打开官网&#xff0c;点击DOWNLOADS 然后&#xff0c;点击 MySQL Community(GPL) Downloads 3. 点击 MySQL Installer for Windows 4.点击Archives选择合适版本 5.选择后下载…

【国产开源可视化引擎Meta2d.js】锚点

国产开源 乐吾乐潜心研发&#xff0c;自主可控&#xff0c;持续迭代优化 Github&#xff1a;GitHub - le5le-com/meta2d.js: The meta2d.js is real-time data exchange and interactive web 2D engine. Developers are able to build Web SCADA, IoT, Digital twins and so …

神经网络入门:从零到训练

想要认识神经网络&#xff0c;个人认为还是需要先从回归开始理解 线性回归 回归&#xff08;regression&#xff09;是能为一个或多个自变量与因变量之间关系建模的一类方法。 在自然科学和社会科学领域&#xff0c;回归经常用来表示输入和输出之间的关系。 在机器学习领域中…

【Python机器学习】算法链与管道——构建管道

目录 1、首先&#xff0c;我们构建一个由步骤列表组成的管道对象。 2、向任何其他scikit-learn估计器一样来拟合这个管道 3、调用pipe.score 我们来看下如何使用Pipeline类来表示在使用MinMaxScaler缩放数据后&#xff0c;再训练一个SVM的工作流程&#xff08;暂时不用网格搜…