天天看點

資料庫核心月報 - 2015 / 11-PgSQL · 答疑解惑 · PostgreSQL 使用者組權限管理

rds上的pg沒有開放超級使用者,這給很多雲上的客戶使用pg帶來了困難。是以有必要給大家講講pg的使用者權限管理的一些小知識,它可以很好的幫助使用者順利的從之前的 db 管理方式過度到雲上。

pg 的 superuser 擁有幾乎全部的資料庫權限,甚至可以直接修改系統表,潛在風險相當大;

rds pg 使用 superuser 運維 db,例如管理用、管理流複制、備份等,這些操作使用者是不需要關心的,換句話說它應該完全的交給雲服務來處理;

對于使用者而言,pg 的普通使用者權限是完全夠用的。使用普通使用者,可以管理自己在雲上的資料(對表進行ddl、dml、建立修改和管理其他資料庫對象)。

之前的 pg 使用者習慣使用 superuser 進行日常運維,一方面 superuser 完全不用做任何的授權,使用友善;另一方面這樣的操作帶來了潛在的風險,容易誤操作。

最近碰到了較多的使用者回報,沒有了超級使用者,無法使用 rds 的普通使用者,管理其他普通使用者建立的對象,經常出現操作對象無權限的問題,尤其存在多使用者的情況下。通常情況下:

一個普通使用者隻能在自己 owner 的db下建立 schema;

db 下的對象有一個所屬的 schema,普通使用者可以在 public 下建立對象(如 table),在其他 schema 下建立對象需要 schema 的 owner 是目前使用者或特别的授權;

管理一個資料庫對象,需要是超級使用者、或對象的 owner 是目前使用者(在使用者組權限之外)。

很多使用者,使用了很多個 user 在 public 模式下建立了多張表,但是單個使用者卻沒有權限同時管理他們, 更沒有權限切換他們的 owner 到一個統一的使用者下做統一處理,十分惱火。

在這裡,我們提供一種通用的方法,可以使用 pg 的使用者組和繼承特性,做到使用一個普通使用者管理多個其他使用者。

使用 rds 的根賬号建立一個用于管理資料庫和使用者的管理者賬号,他具有建立使用者和建立 db 的權限

使用這個 admin 登陸 postgres,建立用于存放資料的db

建立子賬戶subuser1 subuser2,并把他們的權限給admin

我們看到 admin 使用者組管理了下列2個使用者,也就是admin 擁有 subuser1,subuser2 的所有權限

使用 subuser1 或 subuser2 登陸資料庫 dbadmin,public schema上建立 owner 是自己的表對象和其他對象。分别用3個使用者建立3張表a b c用作測試,另外也可以使用 admin 使用者建立分别屬于 subuser1 和 subuser2 的 schema ,再建立 table

使用 admin 使用者,可以對這3張表做管理,例如:

但是 subuser1 無法删除 t_admin 和 t_subuser2,同理 subuser2 也無法删除 t_admin 和 t_subuser1

同理,可以使用 admin 使用者,重置這3張表的 owner 到3個使用者中的一個,而使用 subuser1 和 subuser2 則沒有權限操作,例如:

最後,提一個完成上述功能的假設,admin 使用者預設具有 inherit 權限,inherit 權限決定一個角色是否“繼承”它所在組的角色的權限。一個帶有 inherit 屬性的角色可以自動使用已經賦與它直接或間接所在組的任何權限。沒有 inherit,其它角色的成員關系隻賦與該角色 set role 成其它角色的能力;其它角色的權限隻是在這麼做了之後才能獲得。如果沒有聲明,預設是 inherit。通過系統表, pg_roles 可以獲得該使用者的權限資訊

使用 pg 使用者組可以做到使用一個 pg 使用者組管理所在組内的所有其他普通使用者和他們的對象。rds 使用者設定一個使用者組,既可以管理多個使用者的對象,又可以實作一定程度上的權限隔離,同時權限又不會過大,推薦在雲上使用該方式管理自己的資料庫。