RDSforPostgreSQL無法建只讀使用者的問題討論

yxdev發表於2016-11-11
 在阿里雲RDS中的PostgreSQL資料庫中,超級使用者是沒有給到終端使用者的,而是給了一個比較大許可權的使用者,這個使用者可以建立資料庫,可以建立使用者,在通常情況下都是夠用的。最近業務方給我提了一個需求,需要建一個只讀使用者,這個只讀使用者不能有DDL的許可權。目前發現在阿里雲RDS提供的PostgreSQL資料庫中,無法滿足此需要,原因是,任何使用者都能建立表,無法禁止使用者建立表的許可權,更深層次的原因為:
1. 模板資料庫template1中的有一個名稱為“public”的schema,這個“public”的schema的屬主是超級使用者,而這個超級使用者阿里雲沒有給到終端使用者。而使用者自己建立出來的資料庫都是從template1拷貝的,所以使用者建立出來的資料庫中也有一個名稱為“public”的schema,而這個“public”的schema的屬主仍然是原先的超級使用者,而任何人都有在這個“public”的schema中建立表的許可權,而因為我們這些RDS使用使用者沒有超級使用者的許可權,所以無法用“revoke create on schema public from public”的方法取消任何使用者在此schema建表的許可權。而又因為這個“public”的schema的屬主是超級使用者,我們也無法刪除掉這個schema。
目前我們自己是無法解決此問題,只能由阿里雲來解決,解決的建議方法如下:
1. 建議阿里雲預設建立出來的例項把在schema “public”中建立表的許可權回收。
2.  再建立一個的模板資料,如名稱為template2,)然把這個模板資料庫中的public schema刪除掉。
   create database template2;
  UPDATE pg_database SET datistemplate=`true` WHERE datname=`template2`;
  drop schema public;
  這樣使用者可以從template2複製出一個資料庫:
  create database userdb01 template template2;
 這樣建出來的資料庫userdb01中是沒有“public”這個schema的,使用者如果想使用“public”這個schema,可以自己建,因為是使用者自己建的“public”的這個schema,這個“public”的屬主是使用者自己,而不是阿里雲的超級使用者,這樣使用者想讓誰能在這個“public”的schema中建立表或其它許可權,他都可以直接賦權了。


相關文章