2017-07-30 63 views
2

在Postgres中,如何創建具有CREATEROLE特權的用戶,但僅限於特定的DB/DB集合?Postgres CREATEROLE限制到特定分區

我試圖做:

CREATE ROLE user WITH LOGIN PASSWORD 'password' NOCREATEDB CREATEROLE; 

這是正確的嗎? +我如何將CREATEROLE授予多個分貝?

+1

「_小心使用CREATEROLE特權。對於CREATEROLE角色的權限沒有繼承的概念。這意味着即使角色沒有特定的權限但允許創建其他角色,也可以使用不同於自己的特權輕鬆創建另一個角色(除了使用超級用戶特權創建角色)。例如,如果角色「用戶」具有CREATEROLE特權但不具有CREATEDB特權,但它可以使用CREATEDB特權創建新角色。因此,將具有CREATEROLE特權的角色視爲幾乎是超級用戶角色。「 – Abelisto

回答

1

看來,這不是一個簡單的方法來做到這一點。但是你可以創建功能與security definer選項,以實現所需的行爲:

create or replace function fn_create_role(p_name text, p_password text, p_databases text[]) returns void 
    language plpgsql 
    security definer 
as $$ 
begin 
    execute format('create role %I with login password %L;', p_name, p_password); 
    execute format('grant connect on database %s to %I', array_to_string(p_databases, ','), p_name); 
    return; 
end $$; 

創建此功能的超級用戶。

然後,您可以使用NOCREATEROLE選項創建角色,但授予此功能EXECUTE權限並使用它創建其他角色。

注意:您需要從public角色撤銷connect選擇特定的DB不允許角色連接到它們的默認,例如:

revoke connect on database db1, db2 from public; 

測試:


作爲超級用戶( nd在我的情況下誰也擁有架構同名)

postgres=# create database db1; create database db2; 
CREATE DATABASE 
CREATE DATABASE 
postgres=# revoke connect on database db1, db2 from public; 
REVOKE 
postgres=# create role foo with login password 'bar' nocreatedb nocreaterole; 
CREATE ROLE 
postgres=# set role foo; 
SET 
postgres=> create role win with login password 'amp' nocreatedb nocreaterole; 
ERROR: permission denied to create role 
postgres=> set role nd; 
SET 
postgres=# grant usage on schema nd to foo; 
GRANT 
postgres=# grant execute on function nd.fn_create_role(text, text, text[]) to foo; 
GRANT 
postgres=# set role foo; 
SET 
postgres=> select nd.fn_create_role('win', 'amp', '{db1}'); 
┌────────────────┐ 
│ fn_create_role │ 
╞════════════════╡ 
│    │ 
└────────────────┘ 
(1 row) 

並在終端:

 
$ psql -h localhost -d db1 -U win 
Password for user win: 
psql (9.6.3) 
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off) 
Type "help" for help. 

[email protected]=> \q 
$ psql -h localhost -d db2 -U win 
Password for user win: 
psql: FATAL: permission denied for database "db2" 
DETAIL: User does not have CONNECT privilege. 
2

根據數據庫羣集創建角色,按照doc而不是數據庫創建角色。如果您將這種強大的權利授予用戶,他將能夠在集羣的每個數據庫中創建可用的角色。

由於您需要授予角色權限,因此您可以確保將來自單個數據庫的內容分配給該角色。