天天看點

RDS for PostgreSQL無法建隻讀使用者的問題讨論

 在阿裡雲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中建立表或其它權限,他都可以直接賦權了。