在Postgres中,如何創建具有CREATEROLE
特權的用戶,但僅限於特定的DB/DB集合?Postgres CREATEROLE限制到特定分區
我試圖做:
CREATE ROLE user WITH LOGIN PASSWORD 'password' NOCREATEDB CREATEROLE;
這是正確的嗎? +我如何將CREATEROLE
授予多個分貝?
在Postgres中,如何創建具有CREATEROLE
特權的用戶,但僅限於特定的DB/DB集合?Postgres CREATEROLE限制到特定分區
我試圖做:
CREATE ROLE user WITH LOGIN PASSWORD 'password' NOCREATEDB CREATEROLE;
這是正確的嗎? +我如何將CREATEROLE
授予多個分貝?
看來,這不是一個簡單的方法來做到這一點。但是你可以創建功能與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.
根據數據庫羣集創建角色,按照doc而不是數據庫創建角色。如果您將這種強大的權利授予用戶,他將能夠在集羣的每個數據庫中創建可用的角色。
由於您需要授予角色權限,因此您可以確保將來自單個數據庫的內容分配給該角色。
「_小心使用CREATEROLE特權。對於CREATEROLE角色的權限沒有繼承的概念。這意味着即使角色沒有特定的權限但允許創建其他角色,也可以使用不同於自己的特權輕鬆創建另一個角色(除了使用超級用戶特權創建角色)。例如,如果角色「用戶」具有CREATEROLE特權但不具有CREATEDB特權,但它可以使用CREATEDB特權創建新角色。因此,將具有CREATEROLE特權的角色視爲幾乎是超級用戶角色。「 – Abelisto