postgresql用戶與許可權管理
- 2022 年 8 月 20 日
- 筆記
- --500 PostgreSQL
pg使用角色的概念管理資料庫訪問許可權,角色是一系列相關許可權的集合。為了管理方便,通常把一系列先關的許可權賦予給一個角色,如果哪個用戶需要這些許可權,就把這些角色賦予給響應的用戶。 由於用戶也擁有一系列的相關許可權,為了簡化管理,在PG中,角色與用戶是沒有區別的,一個用戶也是一個角色,我們可以把一個用戶的許可權賦值給另一個用戶。
用戶和角色在整個資料庫實例中是全局的,在同一個實例的不同資料庫中,看到的用戶都是相同的。
資料庫初始化時會創建一個與作業系統同名的超級用戶postgres,也可以使用-U:指定超級用戶
(一)創建用戶和角色
創建用戶和角色的語法如下:
-- 創建用戶
CREATE USER name [[ WITH ] option [...]]
-- 創建角色
CREATE ROLE name [[ WITH ] option [...]]
備註:在PG中,用戶與角色是沒有區別的,角色默認沒有login許可權,無法登陸,如果授予login之後,也可以像用戶一樣登陸。
option常用選項如下:
- SUPERUSER | NOSUPERUSER:創建出來的用戶是否為超級用戶
- CREATEDB | NOCREATEDB:創建出來的用戶是否有create database的許可權
- CREATEROLE | NOCREATEROLE:創建出來的用戶是否有創建其它角色的許可權
- CREATEUSER | NOCREATEUSER:創建出來的用戶是否有創建其它用戶的許可權
- INHERIT | NOINHERIT:確定角色是否繼承其它角色的許可權
- LOGIN | NOLOGIN:創建出來的角色是否有登錄許可權
- CONNECTION LIMIT n:創建出來的角色並發連接數限制數量,默認值是「-1」,表示沒有限制
- VALID UNTIL 'timestamp':密碼失效時間
(二)許可權的管理
在postgresql資料庫中,任何邏輯對象(包括資料庫)都是有所有者的,也就是說資料庫對象都是屬於某個用戶的,所以,無需把對象的許可權賦予所有者,因為所有者默認就擁有所有的許可權,在PG資料庫中,刪除及其修改對象的許可權都不能賦予別的用戶,它是所有者的固有許可權,不能賦予或撤銷,所有者也隱式地擁有把操作該對象的許可權授予其他用戶的權利。
(2.1)兩類許可權
用戶的許可權分兩類,一類是在創建用戶時就指定的許可權,有:
- 超級用戶的許可權
- 創建資料庫的許可權
- 是否允許login的許可權
- 更多見
\help create role
這些許可權是創建用戶時指定的,後面可以使用alter role來修改。
另一類是有GRANT和REVOKE命令來管理的,有:
-
在資料庫中創建schema的許可權
-
在指定的資料庫中創建臨時表的許可權
-
連接某個資料庫的許可權
-
在某個資料庫中創建資料庫對象的許可權,如表、視圖、函數等
-
在一些表中做SELECT 、INSERT、UPDATE、DELETE等操作的許可權
-
在一張表的列上做 SELECT 、UPDATE、DELETE等操作的許可權
-
對序列進行查詢(執行序列的currval函數)、使用(執行序列的currval和nextval函數)、更新的許可權
-
在表上創建觸發器的許可權
-
把表、索引創建到指定表空間的許可權
(2.2)GRANT 和REVOKE許可權
(2.2.1)角色的授予與回收
-- 將角色授予給另外一個角色
GRANT role_name[,...] TO role_name[,...] WITH ADMIN OPTION;
-- 角色回收
REVOKE role_name[,...] FROM role_name[,...][CASCADE | RESTRICT]
(2.2.2)許可權的授予與回收
許可權的授予
db1=# \help grant
命令: GRANT
描述: 定義存取許可權
語法:
-- 表相關許可權
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[, ...] | ALL [ PRIVILEGES ] }
ON { [ TABLE ] 表名 [, ...]
| ALL TABLES IN SCHEMA 模式名稱 [, ...] }
TO role_specification [, ...] [ WITH GRANT OPTION ]
-- 列相關許可權
GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( 列名稱 [, ...] )
[, ...] | ALL [ PRIVILEGES ] ( 列名稱 [, ...] ) }
ON [ TABLE ] 表名 [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
-- 序列相關許可權
GRANT { { USAGE | SELECT | UPDATE }
[, ...] | ALL [ PRIVILEGES ] }
ON { SEQUENCE 序列名稱 [, ...]
| ALL SEQUENCES IN SCHEMA 模式名稱 [, ...] }
TO role_specification [, ...] [ WITH GRANT OPTION ]
-- 資料庫相關許可權
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
ON DATABASE 資料庫名稱 [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON DOMAIN 域_名稱 [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN DATA WRAPPER 外部數據封裝器的名稱 [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN SERVER 伺服器名稱 [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
-- 函數、存儲過程相關許可權
GRANT { EXECUTE | ALL [ PRIVILEGES ] }
ON { { FUNCTION | PROCEDURE | ROUTINE } 程式名稱 [ ( [ [ 參數模式 ] [ 參數名稱 ] 參數類型 [, ...
] ] ) ] [, ...]
| ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA 模式名稱 [, ...] }
(2.2.3)許可權授予回收總結
postgresql中的許可權是按照以下幾個層次進行管理的:
1.首先管理賦予用戶的特殊許可權,如超級用戶的許可權,創建資料庫的許可權、創建用戶的許可權、login許可權等
2.然後是在資料庫中創建schema的許可權
3.接著是在schema中創建資料庫對象(如表、索引)的許可權
4.之後是對錶進行操作(insert、update、delete、select)的許可權
5.最後是操作(update、delete、select)表中某些欄位的許可權
(2.3)許可權操作常用命令
(2.3.1)授予增刪查改許可權
GRANT update,delete,insert,select ON ALL TABLES IN SCHEMA public TO signalmap_rw;
(2.3.2)回收public許可權
在初始化資料庫實例後,資料庫中默認就會存在一個名稱為「public」的schema,任何用戶都有在public schema上的create 許可權,通常我們需要把這個許可權回收回來
revoke create on schema public from public;
(2.3.3)創建只讀用戶
-- 回收public模式的create許可權
revoke create on schema public from public;
-- 創建只讀用戶,密碼為readonly
create user readonly password 'readonly';
-- 授權public模式給readonly
grant usage on schema public to readonly;
-- 授權public模式的所有表許可權給readonly用戶
grant select on all tables in schema public to readonly;
-- 切換到readonly測試
\c - readonly
-- 切換到postgres用戶
\c - postgres
-- 將public模式的默認表查詢許可權授予readonly用戶
alter default privileges in schema public grant select on tables to readonly;
(2.3.4)查看用戶許可權
-- 查看某用戶的系統許可權
SELECT * FROM pg_roles WHERE rolname='postgres';
-- 查看某用戶的表級別許可權
select * from information_schema.table_privileges where grantee='postgres';
-- 查看某用戶的usage許可權
select * from information_schema.usage_privileges where grantee='postgres';
-- 查看某用戶在存儲過程函數的執行許可權
select * from information_schema.routine_privileges where grantee='postgres';
-- 查看某用戶在某表的列上的許可權
select * from information_schema.column_privileges where grantee='postgres';
-- 查看當前用戶能夠訪問的數據類型
select * from information_schema.data_type_privileges ;
-- 查看用戶自定義類型上授予的USAGE許可權
select * from information_schema.udt_privileges where grantee='postgres';
