sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL - uživatel DB by měl mít povoleno pouze volat funkce

SELECT nemá žádné "privilegium". Vše, co potřebujete, je oprávnění EXECUTE funkcí. Příslušnou funkci lze spustit s SECURITY DEFINOVAČ zdědit všechna privilegia vlastníka. Chcete-li a priori omezit možnou eskalaci oprávnění na minimum, udělejte roli démona vlastní relevantní funkce pouze s nezbytnými oprávněními – nikoli superuživatel!

Recept

Jako superuživatel ...

Vytvořte roli bez superuživatele myuser .

CREATE ROLE myuser PASSWORD ...;

Vytvořte skupinovou roli mygroup a udělejte myuser členem.

CREATE ROLE mygroup;
GRANT mygroup TO myuser;

Možná budete chtít přidat další uživatele, jako je myuser později.

Neudělujte vůbec žádná oprávnění na myuser .
Udělte je pouze mygroup :

  • UDĚLEJTE PŘIPOJENÍ NA DATABÁZI mydb TO mygroup;
  • UDĚLEJTE POUŽITÍ NA SCHÉMATU veřejné skupině mygroup;
  • GRANT EXECUTE ON FUNCTION foo() TO mygroup;

Odebrat vše oprávnění pro veřejné že myuser neměl.

REVOKE ALL ON ALL TABLES IN SCHEMA myschema FROM public;

Může jich být víc. Cituji manuál:

Vytvořte roli démona vlastnit relevantní funkce.

CREATE ROLE mydaemon;

mydaemon udělte pouze oprávnění nezbytná k provádění těchto funkcí , (včetně EXECUTE ON FUNCTION aby bylo možné volat jinou funkci). Opět můžete použít skupinové role k seskupení oprávnění a jejich udělení mydaemon

GRANT bundle1 TO mydaemon;

Kromě toho můžete použít VÝCHOZÍ PRIVILEGIA k automatickému udělení určitých oprávnění pro budoucí objekty přímo balíčku nebo démonu:

ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT SELECT ON TABLES    TO bundle1;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema GRANT USAGE  ON SEQUENCES TO bundle1;

To platí pouze pro roli, pro kterou je vykonáván. Podle dokumentace:

Chcete-li také pokrýt již existující objekty ve schématu (viz robův komentář ):

GRANT SELECT ON ALL TABLES    IN SCHEMA public TO bundle1;
GRANT USAGE  ON ALL SEQUENCES IN SCHEMA public TO bundle1;

Vytvořte mydaemon vlastní relevantní funkce. Mohlo by to vypadat takto:

CREATE OR REPLACE FUNCTION foo()
  ...
SECURITY DEFINER SET search_path = myschema, pg_temp;

ALTER FUNCTION foo() OWNER TO mydaemon;
REVOKE EXECUTE ON FUNCTION foo() FROM public;
GRANT  EXECUTE ON FUNCTION foo() TO mydaemon;
GRANT  EXECUTE ON FUNCTION foo() TO mygroup;
-- possibly others ..

###Note
Kvůli této chybě v aktuální verzi 1.16.1 pgAdmin potřebný příkaz

REVOKE EXECUTE ON FUNCTION foo() FROM public;

chybí v reverzním inženýrství skriptu DDL. Nezapomeňte ji přidat při opětovném vytváření.
Tato chyba je opravena v aktuální verzi pgAdmin 1.18.1.




  1. Při fulltextovém vyhledávání se shoduje více slovník synonym

  2. Kdy nebo proč použít SET DEFINE OFF v databázi Oracle

  3. Upozornění:mysql_num_rows() očekává, že parametr 1 bude zdrojem, daným objektem

  4. Připravený výpis s ON DUPLICATE KEY