天天看點

PostgreSQL · 特性分析 · 邏輯結構和權限體系

本文旨在幫助使用者了解postgresql的邏輯結構和權限體系,幫助使用者快速的了解和管理資料庫的權限。

最上層是執行個體,執行個體中允許建立多個資料庫,每個資料庫中可以建立多個schema,每個schema下面可以建立多個對象。

對象包括表、物化視圖、操作符、索引、視圖、序列、函數、… 等等。

PostgreSQL · 特性分析 · 邏輯結構和權限體系

在資料庫中所有的權限都和角色(使用者)挂鈎,public是一個特殊角色,代表所有人。

超級使用者是有允許任意操作對象的,普通使用者隻能操作自己建立的對象。

另外有一些對象是有賦予給public角色預設權限的,是以建好之後,是以人都有這些預設權限。

PostgreSQL · 特性分析 · 邏輯結構和權限體系

執行個體級别的權限由pg_hba.conf來控制,例如 :

以上配置的解釋:

允許任何本地使用者無密碼連接配接任何資料庫;

不允許postgres使用者從任何外部位址連接配接任何資料庫;

允許其他任何使用者從外部位址通過密碼連接配接任何資料庫。

資料庫級别的權限,包括允許連接配接資料庫,允許在資料庫中建立schema。

預設情況下,資料庫在建立後,允許public角色連接配接,即允許任何人連接配接。

預設情況下,資料庫在建立後,不允許除了超級使用者和owner之外的任何人在資料庫中建立schema。

預設情況下,資料庫在建立後,會自動建立名為public 的schema,這個schema的all權限已經賦予給public角色,即允許任何人在裡面建立對象。

schema級别的權限,包括允許檢視schema中的對象,允許在schema中建立對象。

預設情況下建立的schema的權限不會賦予給public角色,是以除了超級使用者和owner,任何人都沒有權限檢視schema中的對象或者在schema中建立對象。

according to the sql standard, the owner of a schema always owns all objects within it. postgresql allows schemas to contain objects owned by users other than the schema owner. this can happen only if the schema owner grants the create privilege on his schema to someone else, or a superuser chooses to create objects in it.

千萬不要把自己的對象建立到别人的schema下面,那很危險。

本文後面的例子中會提及。

以表為例,可以有select | insert | update | delete | truncate | references | trigger這些權限。

簡單介紹一下grant的一些通用選項

with admin option表示被賦予權限的使用者,拿到對應的權限後,還能将對應的權限賦予給其他人,否則隻能自己有這個權限,但是不能再賦予給其他人。

使用者,角色在postgresql是一個概念。

public角色,代表所有人的意思。

以表為例 :

或者執行

權限說明如下

解釋一下 access privileges

rolename=xxx 其中rolename就是被賦予權限的使用者名,即權限被賦予給誰了?

=xxx 表示這個權限賦予給了public角色,即所有人

/yyyy 表示是誰賦予的這個權限?

權限的含義如下

例子

賦予權限的人是postgres使用者, sbtest2表的select權限被賦予給了digoal使用者。

回收權限一定要針對已有的權限來,如果你發現這裡的權限還在,那照着權限回收即可。

例如

postgresql還支援淩駕于基本權限體系之上的安全政策,這些安全政策一般在企業級的商業資料庫中才有。

<a href="https://yq.aliyun.com/articles/4271" target="_blank">行安全政策</a>

schema的owner預設是該schema下的所有對象的owner。

同時postgresql還允許使用者在别人的schema下建立對象,是以一個對象可能屬于”兩個”owner。

更”糟糕”的是schema 的owner有 drop該schema下面的所有對象的權限。

是以千萬不要把自己的對象建立到别人的schema下面,那很危險。

看個例子:

r1建立了一個schema r1, 并把這個schema的寫權限給了r2;

然後r2和超級使用者postgres分别在r1這個schema下面建立了一個表;

然後r1可以把r2和postgres在r1 schema下建立的表删掉,然後就沒有然後了。

對于database的owner也存在這個問題,它同樣具有删除database中任何其他使用者建立的對象的權力。

例子:

介于此,我建議使用者使用超級使用者建立schema和database,然後再把schema和database的讀寫權限給普通使用者,這樣就不怕被誤删了。因為超級使用者本來就有所有權限。

還有一種方法是建立事件觸發器,當執行drop 指令時,隻有owner和超級使用者能删對應的對象。

在一些企業裡面,通常會在資料庫中建立一些隻讀使用者,這些隻讀使用者可以檢視某些使用者的對象,但是不能修改或删除這些對象的資料。

這種使用者通常可以給開發人員,營運人員使用,或者資料分析師 等角色的使用者使用。

因為他們可能關注的是資料本身,并且為了防止他們誤操作修改或删除線上的資料,是以限制他們的使用者隻有隻讀的權限。

mysql這塊的管理應該非常友善。

其實postgresql管理起來也很友善。

使用者可以先參考我前面寫的兩篇文章

<a href="https://yq.aliyun.com/articles/41210" target="_blank">postgresql 邏輯結構 和 權限體系 介紹</a>

<a href="https://yq.aliyun.com/articles/41512" target="_blank">postgresql 批量權限 管理方法</a>

<a href="https://yq.aliyun.com/articles/41514" target="_blank">postgresql schema,database owner 的高危注意事項</a>

建議使用者使用超級使用者建立schema和database,然後再把schema和database的讀寫權限給普通使用者,這樣就不怕被誤删了。因為超級使用者本來就有所有權限。

為了滿足本文的需求, 建立讀寫使用者的隻讀影子使用者

假設tbl2是敏感資訊表,需要加密後給隻讀使用者看

因為前面已經排除賦予了,是以不需要回收

權限檢查

希望本文對postgresql使用者有所幫助。