如何管理PostgreSQL的角色?

PostgreSQL

1 基础知识

1.1 角色的概念

– PostgreSQL使用角色概念管理数据库访问权限
– PostgreSQL的角色可视为数据库用户或一组用户
– PostgreSQL的角色可以拥有数据库对象(例如,表和函数)
– PostgreSQL的对象权限可分配给其他角色(控制谁有权限访问某个对象)
– PostgreSQL允许一个角色将权限授予给另外一个角色

1.2 角色的属性

– 数据库角色的属性决定数据库角色的权限
– 数据库角色的属性控制使用数据库角色定义的客户端身份与验证系统的交互权限

1.3 角色的权限属性

1.3.1 Login privilege

登录权限,
– 授权角色有连接数据库的权限
– 角色创建时默认具备连接数据库的权限
创建命令范例如下,

CREATE ROLE name LOGIN;
CREATE USER name;

注:CREATE ROLE等效于CREATE USER,CREATE USER默认带LOGIN,而CREATE ROLE没有

1.3.2 Superuser

超级用户,
– 该角色可绕过除了登录权限外的所有权限检查
– 授予角色此权限非常危险,请慎重使用
创建命令范例如下,

CREATE ROLE name SUPERUSER

1.3.3 Create role

创建角色,
– 授权此角色有更改或删除其他角色的权限
– 授权此角色有授予或取消其他角色的成员身份
– 超级用户的权限只能由超级用户修改
创建命令范例如下,

CREATE ROLE name CREATEROLE

1.3.4 Create DB

数据库创建,
– 授权角色有创建数据库的权限
创建命令范例如下,

CREATE ROLE name CREATEDB

1.3.5 Replication

复制,
– 授权角色有复制数据库的权限
– 流复制的角色必须同时具备login权限
创建命令范例如下,

CREATE ROLE name REPLICATION LOGIN

1.3.6 Bypass RLS

密码,
– 启用角色连接数据库时的需要输入密码验证的功能
创建命令范例如下,

CREATE ROLE name PASSWORD 'string'

1.4 管理角色组

1.4.1 添加成员到角色组

GRANT group_role TO role1, ... ;

1.4.2 撤销角色组成员

REVOKE group_role FROM role1, ... ;

1.4.3 角色组的权限继承

CREATE ROLE joe LOGIN INHERIT;
CREATE ROLE admin NOINHERIT;
CREATE ROLE wheel NOINHERIT;
GRANT admin TO joe;
GRANT wheel TO admin;

注:如以上命令范例,
– 第一行命令,创建一个具有登录权限的角色joe并声明可以继承他所加入的组的权限
– 第二行命令,创建一个没有任何权限的角色admin并声明不可以继承他所加入的组的权限
– 第三行命令,创建一个没有任何权限的角色wheel并声明不可以继承他所加入的组的权限
– 第四行命令,将joe加入admin组
– 第五行命令,将admin加入wheel组

1.4.4 角色组的权限切换

SET ROLE joe;

注:使用以上命令后,则切换到joe的角色执行,使用joe所拥有的权限

1.5 默认角色

1.5.1 角色的概念

– 默认角色允许用户或其他角色访问某些常用的特权功能和信息

1.1.5.2 默认角色

Role Allowed Access
pg_read_all_settings Read all configuration variables, even those normally visible
only to superusers.
pg_read_all_stats Read all pg_stat_* views and use various statistics related
extensions, even those normally visible only to superusers.
pg_stat_scan_tables Execute monitoring functions that may take ACCESS SHARE locks on tables, potentially for a
long time.
pg_signal_backend Send signals to other backends (eg: cancel query,
terminate).
pg_monitor Read/execute various monitoring views and functions. This role
is a member of pg_read_all_settings,
pg_read_all_stats and pg_stat_scan_tables.

1.5.3 默认角色配置范例

GRANT pg_signal_backend TO admin_user;

2 最佳实践

2.1 系统环境

如果你是初次接触PostgreSQL,建议你先阅读此章节,了解基本的操作后在阅读后面的章节,
https://www.cmdschool.org/archives/3803

2.2 管理角色

2.2.1 列出角色

\du

可见如下显示,

                                  List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

2.2.2 创建角色

create role myrole;

由于该命令支持shell,所以你可以在Linux shell使用如下命令操作,

createuser myrole;

2.2.3 删除角色

drop role myrole;

由于该命令支持shell,所以你可以在Linux shell使用如下命令操作,

dropuser myrole;

2.2.4 查询支持的角色集

SELECT rolname FROM pg_roles;

命令显示如下,

       rolname
----------------------
 postgres
 pg_monitor
 pg_read_all_settings
 pg_read_all_stats
 pg_stat_scan_tables
 pg_signal_backend
(6 rows)

2.2.5 创建带权限的角色

create role myrole login createdb;

注:
– 以上角色具备登录和创建数据库的权限
– 其他权限请参考角色属性

2.2.6 添加角色组

create role role_group;

注:角色与角色组本质上无区别

2.2.6 将成员加入角色组

grant role_group to myrole;

验证操作,

\du

可见如下提示,

                                            List of roles
 Role name  |                         Attributes                         |  Member of   | Description
------------+------------------------------------------------------------+--------------+-------------
 myrole     | Create DB                                                  | {role_group} |
 postgres   | Superuser, Create role, Create DB, Replication, Bypass RLS | {}           |
 role_group | Cannot login                                               | {}           |

2.2.6 撤销角色组成员

revoke role_group from myrole;

2.2.7 角色的继承

刚才我们已经撤销了角色组,我们继续删除数据库和以下两个角色,

\c postgres
drop database mydb;
drop role myrole;
drop role role_group;

创建角色role并声明有登录权限和继承的属性,

create role myrole login inherit;

创建角色role_group并声明有创建数据库的权限,

create role role_group createdb;

将成员myrole加入角色组role_group

grant role_group to myrole;

切换到myrole的角色,使用它的权限测试,

set role myrole;
create database mydb;

注:以上并没有像预想中的继承创建数据库的权限,原因未明O(∩_∩)O哈哈~
切换到role_group的角色,使用它的权限测试,

set role role_group;
create database mydb;

切换回postgres角色,

set role postgres;

参阅文档
===========================

管理角色
—————-
https://www.postgresql.org/docs/10/database-roles.html

管理员使用教程
https://www.postgresql.org/docs/10/admin.html

数据库使用教程
—————-
https://www.postgresql.org/docs/10/index.html

没有评论

发表回复

PostgreSQL
如何使用yum部署PostgreSQL 9?

1 基础知识 1.1 PostgreSQL简介 PostgreSQL是一个功能强大的开源对象关系数据 …

PostgreSQL
如何管理PostgreSQL的库?

1 基础知识 1.1 数据仓库的概念 – 数据库是SQL对象的命名集合,即数据对象 &# …

PostgreSQL
如何熟悉PostgreSQL的基本操作?

1 前言 以下是笔者初学PostgreSQL的笔记,此章节适合初学者熟悉PostgreSQL的基本操 …