2013-06-27 83 views
52

我想第一次創建一個Postgres數據庫,所以這可能是一個愚蠢的問題。我分配的基本只讀的權限,必須從我的PHP腳本訪問數據庫的數據庫角色,和我有好奇心:如果我執行什麼GRANT用戶對SCHEMA的確切做法是什麼?

GRANT some_or_all_privileges ON ALL TABLES IN SCHEMA schema TO role; 

有什麼需要也執行

GRANT USAGE ON SCHEMA schema TO role; 

documentation

用法:對於模式,允許訪問包含在 指定模式(假設對象自身的特權 要求都滿足)的對象。從本質上講,這允許被授權者在模式中「查找」對象 。

我認爲,如果我可以選擇或操作模式中包含的任何數據,我可以訪問模式本身的任何對象。我錯了嗎?如果不是,GRANT USAGE ON SCHEMA用於什麼?那麼這些文檔究竟意味着什麼?「假設對象的特權要求也得到了滿足」?

回答

62

GRANT s在不同的物體上是分開的。在數據庫中的GRANT不對GRANT的權限。類似地,GRANT在模式上不會授予其中的表的權限。

如果您有權利從SELECT從表中,但沒有權利在包含它的模式中看到它,那麼您無法訪問表。

權利試驗是爲了完成:

Do you have `USAGE` on the schema? 
    No: Reject access. 
    Yes: Do you also have the appropriate rights on the table? 
     No: Reject access. 
     Yes: Check column privileges. 

你的困惑可能與public架構中有一個默認的所有角色權限public,其中每個用戶/組的成員GRANT事實出現的。所以每個人都已經在該模式上使用過。

的階段:

(假設該對象的所有權要求也達到了)

是說,你必須在架構內,它使用對象有USAGE,但有模式上的USAGE並不足以使用模式中的對象,您還必須擁有對象本身的權限。

它就像一個目錄樹。如果您創建一個目錄somedir並在其中包含文件somefile,那麼將其設置爲只有您自己的用戶可以訪問目錄或文件(目錄上的模式,文件上的模式rw-------),則其他人無法列出目錄以查看該目錄該文件存在。

如果您要授予文件(模式rw-r--r--)的全局讀取權限,但不更改目錄權限,則不會有任何區別。沒有人可以看到該文件爲了讀取它,因爲他們沒有權限列出目錄。

如果改爲設置rwx-r-xr-x上的目錄,將它使人們可以列出並遍歷目錄,但不改變文件的權限,人們可以列表文件,但不能它,因爲他們會不訪問該文件。

您需要設置這兩個權限才能真正能夠查看該文件。

Pg。您需要架構USAGE權限和對象權限才能在對象上執行操作,例如從表中獲取SELECT

(比喻跌倒在PostgreSQL中,絲毫沒有行級安全性還沒有,因此用戶仍然可以「看到」,該表在架構中存在的SELECTpg_class荷蘭國際集團直接它們不能。與它進行交互以任何方式,雖然如此,它只是在「名單」部分是不完全一樣)

+1

現在是非常用目錄示例清楚:)如果您使用超級用戶插入某些表或行,例如當您使用CREATE EXTE添加postGIS時,我必須說這是一個問題NSION'。這與你在'su'時在Linux上創建的文件差不多。如果在pqsl中有語句的'sudo -e',那將會很好。 –

+1

@LucasMalor那麼,有'ALTER DEFAULT PRIVILEGES' ... –

+0

無論如何,現在我意識到,'GRANT'不是特定於表格的聲明不是我想要的,因爲它們影響所有數據庫...:s –

37

對於生產系統,您可以使用此配置:

--ACCESS DB 
REVOKE CONNECT ON DATABASE nova FROM PUBLIC; 
GRANT CONNECT ON DATABASE nova TO user; 

--ACCESS SCHEMA 
REVOKE ALL  ON SCHEMA public FROM PUBLIC; 
GRANT USAGE ON SCHEMA public TO user; 

--ACCESS TABLES 
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM PUBLIC ; 
GRANT SELECT       ON ALL TABLES IN SCHEMA public TO read_only ; 
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO read_write ; 
GRANT ALL       ON ALL TABLES IN SCHEMA public TO admin ; 
+0

不應該'管理'也被授予'CREATE'在架構上? – Dan

+1

根據分層模型分配訪問權限:** BD - > SCHEMA - > TABLES **。 通過'GRANT USAGE ON SCHEMA',管理員用戶不能創建表,但他可以通過'ALL GRANT ALL ON SCHEMA'完成它.... – bilelovitch

相關問題