Postgresql

為什麼允許新使用者創建表?

  • August 19, 2016

我想知道為什麼允許新創建的使用者在連接到數據庫後創建表。我有一個數據庫,project2_core

postgres=# \l
                                         List of databases
    Name      |    Owner     | Encoding  |   Collate   |    Ctype    |       Access privileges       
---------------+--------------+-----------+-------------+-------------+-------------------------------
postgres      | postgres     | SQL_ASCII | C           | C           | 
project2_core | atm_project2 | UTF8      | de_DE.UTF-8 | de_DE.UTF-8 | project2=CTc/project2
template0     | postgres     | SQL_ASCII | C           | C           | =c/postgres                  +
              |              |           |             |             | postgres=CTc/postgres
template1     | postgres     | SQL_ASCII | C           | C           | =c/postgres                  +
              |              |           |             |             | postgres=CTc/postgres
(5 rows)

到目前為止,一切都很好。現在我創建一個使用者:

postgres=# CREATE ROLE dietrich ENCRYPTED PASSWORD 'md5XXX' LOGIN NOCREATEROLE NOCREATEDB NOSUPERUSER

好的。當我嘗試連接到數據庫時,不允許使用者這樣做:

$ psql -h localhost -p 5432 -U dietrich -W project2_core
Password for user dietrich: 
psql: FATAL:  permission denied for database "project2_core"
DETAIL:  User does not have CONNECT privilege.

這是我所期望的。現在奇怪的事情開始了。我授予使用者CONNECT

postgres=# GRANT CONNECT ON DATABASE project2_core TO dietrich;
GRANT
postgres=# \l
                                         List of databases
    Name      |    Owner     | Encoding  |   Collate   |    Ctype    |       Access privileges       
---------------+--------------+-----------+-------------+-------------+-------------------------------
postgres      | postgres     | SQL_ASCII | C           | C           | 
project2_core | atm_project2 | UTF8      | de_DE.UTF-8 | de_DE.UTF-8 | project2=CTc/project2+
              |              |           |             |             | dietrich=c/project2
template0     | postgres     | SQL_ASCII | C           | C           | =c/postgres                  +
              |              |           |             |             | postgres=CTc/postgres
template1     | postgres     | SQL_ASCII | C           | C           | =c/postgres                  +
              |              |           |             |             | postgres=CTc/postgres
(5 rows)

並且無需任何進一步的授權,使用者就可以創建一個表:

$ psql -h localhost -p 5432 -U dietrich -W project2_core
Password for user dietrich: 
psql (9.2.3)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.

project2_core=> create table adsf ();
CREATE TABLE
project2_core=> \d
       List of relations
Schema | Name | Type  |  Owner   
--------+------+-------+----------
public | adsf | table | dietrich
(1 row)

GRANT USAGE我本來希望在我明確地對模式然後GRANT SELECT對錶執行任何操作之前,不允許使用者執行任何操作。

我的錯誤在哪裡?我究竟做錯了什麼?我怎樣才能實現我想要的(在明確授予她適當的權限之前,不允許新使用者做任何事情。

我迷路了,非常感謝您的幫助:)

編輯按照@daniel-verite 的建議,我現在在創建數據庫後立即撤銷所有內容。使用者dietrich不再被允許創建表。好的。但是:現在,數據庫的所有者project2也不允許創建表。即使在發出GRANT ALL PRIVILEGES ON DATABASE project2_core TO project2and之後GRANT ALL PRIVILEGES ON SCHEMA public TO project2,我也會收到錯誤ERROR: no schema has been selected to create in,當我特別嘗試這樣做時CREATE TABLE public.WHATEVER ();,我會收到ERROR: permission denied for schema public。我究竟做錯了什麼?

創建新數據庫時,允許任何角色在public模式中創建對象。要消除這種可能性,您可以在創建數據庫後立即發出:

REVOKE ALL ON schema public FROM public;

編輯:在上述命令之後,只有超級使用者可以在public模式內創建新對象,這是不切實際的。foo_user假設應授予非超級使用者此權限,應通過以下方式完成:

GRANT ALL ON schema public TO foo_user;

要了解ALL模式的含義,我們必須參考文件中的 GRANT(在 PG 9.2 中,有不少於 14 種形式的 GRANT 語句適用於不同的事物……)。似乎對於模式來說,它意味著CREATEUSAGE

另一方面,GRANT ALL PRIVILEGES ON DATABASE...將授予CONNECTandCREATETEMP,但CREATE在此上下文中涉及模式,而不是永久表。

關於這個錯誤:ERROR: no schema has been selected to create in,當試圖創建一個沒有模式限定的對象時(如create table foo(...)),而缺乏在search_path.

引用自:https://dba.stackexchange.com/questions/35316