Mirosław Ziobro

Mirosław Ziobro Specjalista
informatyk, UX
Experience Designer,
Grafik Ko...

Temat: [POSTGRESQL] Jak nadać użytkownikowi np. uprawnienia...

Witam,

Potrzebuję pomocy w rozwiązaniu problemu z uprawnieniami w POSTGRES. Mam użytkownika w postgres Mirek i chce zrobić tak żeby ten użytkownik po zalogowaniu w pgadminie czy przez konsolę widział tylko konkretne ustalone przeze mnie 2 widoki stworzone z kilku tabel istniejących w bazie danych. Czy da się zrobić tak ani taki użytkownik nie widział tych i innych tabel istniejących w takiej bazie danych a miał dostęp do select z widoków w1 i w2 nic poza tym?

Pozdrawiam i dziękuję za każdą pomoc
Marcin Mackiewicz

Marcin Mackiewicz Programista JAVA, RS
Adware Polska

Temat: [POSTGRESQL] Jak nadać użytkownikowi np. uprawnienia...

User z założenia w PostgreSQL user widzi te obiekty które pozwala mu zobaczyć klient (pgAdmin, czy psql, etc.). Aby pokazać tyko te obiekty do których user ma dostęp klient musiałby sprawdzać uprawnienia do nich podczas logowania. Tańszym rozwiązaniem jest pokazać cały indeks obiektów i sprawdzać uprawnienia na żądanie użytkownika.

Jeżeli chodzi o widok to jest on tylko spojrzeniem na dane. User aby mieć możliwość skorzystania z widoku musi mieć uprawnienia do niego oraz uprawnienia do wszystkich obiektów z których ten obiekt korzysta.

-- Przykladowa rola
CREATE ROLE g_mirek NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;

-- Przykładowy user + uprawnienie do grupy
CREATE ROLE mirek LOGIN NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
GRANT g_mirek TO mirek;

-- Przykładowa tabela
CREATE TABLE ttable_tbl (
id int,
name text,
visible boolean default true
);

-- Przykładowy widok
CREATE OR REPLACE VIEW ttable_v AS
SELECT * FROM ttable_tbl WHERE visible IS TRUE;

Aby widok działał poprawnie dla usera mirek musisz mieć uprawnienia zarówno do widoku jak i do tabeli wykorzystywanej przez widok.
GRANT SELECT ON TABLE ttable_tbl TO g_mirek;
GRANT SELECT ON TABLE ttable_v TO g_mirek;


Jeżeli chcesz kontrolować usera i dane, które są mu serwowane to zrób może funkcję która zwróci SETOF TABLE z prawami działania SECURITY DEFINER. Dasz userowi GRANT EXECUTE do funkcji i to wszystko. Przykład:
CREATE OR REPLACE FUNCTION gettable_tbl() RETURNS SETOF ttable_tbl AS '
SELECT * FROM gettable_tbl WHERE visible IS TRUE;
' LANGUAGE sql VOLATILE SECURITY DEFINER;

GRANT EXECUTE ON FUNCTION gettable_tbl() TO dnd;
Mirosław Ziobro

Mirosław Ziobro Specjalista
informatyk, UX
Experience Designer,
Grafik Ko...

Temat: [POSTGRESQL] Jak nadać użytkownikowi np. uprawnienia...

Taka funkcja to jest jakieś rozwiązanie, ale zastanawiałem się jeszcze nad rozwiązaniem takim że tworząc usera nadaje mu prawa do np stworzonego dlatego celu schematu w którym umieszczam widoki do których ma mieć dostęp ten użytkownik. Widoki korzystały by z tabel umieszczonych w innym schemacie. Jeszcze tego nie testowałem ale powinno odpalić, jednak i tak te widoki żeby się wyświetliły muszą mieć dostęp do tych tabel w innym schemacie więc użytkownik który się zaloguje np do pg_admina będzie widział schemat z widokami i przynajmniej te tabele z drugiego schematu. Nie wiem czy dobrze myślę. Można jakoś ukryć widzialność tabel wpg_adminie z których korzysta widok? Jak narazie to po zalogowaniu na uzytkownika widzę widoki i wszystkie tabele w danym schemacie nie mogę zobaczyć danych ale pg_admin pokaże mi strukturę tabel czyli jakie pola ma ta tabela i jakiego typu a tego nie chce pokazywać. Tylko czy to da się ukryć przez uprawnienia postgesa?

konto usunięte

Temat: [POSTGRESQL] Jak nadać użytkownikowi np. uprawnienia...

Można zrobić:
REVOKE USAGE ON schema FROM user; 

W ten sposób nie będzie dostępu do obiektów z danego schematu. Jak się bardzo chce można kombinować z dostępem do PUBLIC_SCHEMA, ale to raczej dla chętnych i jak się dokładnie wie czego się chce.
Tu jest o revoke:
https://www.postgresql.org/docs/current/static/sql-revo...
A tu jest artykuł z przykładami:
https://www.ibm.com/developerworks/opensource/library/o...
Piszą, że >>total security<< trochę to chyba na wyrost, ale... przykłady sensowne, warto zajrzeć, np. żeby wiedzieć jak składnia wygląda - można sobie machnąć trochę skryptów do testowania, żeby się potem nie motać.
Marcin Mackiewicz

Marcin Mackiewicz Programista JAVA, RS
Adware Polska

Temat: [POSTGRESQL] Jak nadać użytkownikowi np. uprawnienia...

To tak nie zadziała. pgAdmin np nie sprawdza uprawnień do obiektu w object tree. Mogę zobaczyć listę obiektów nawet jak mam "revoke on schema form user". pgAdmin zwraca sobie error z tytułu permission denied ale i tak mogę przeglądać tree i mam dostęp do obiektów do których mam uprawneinia. Koledze chodziło o to, żeby pokazywać tylko te obiekty do których dany user ma uprawnienia a pozostałe uryć.

Zrobilem sobie tabele magazyn w schemacie public. Zrobilem widok magazyn_v w semacie t.
Zrobilem usera ttt z grant usage on t to ttt z grant select on magazyn_v to ttt;
Zrobilem revoke on schema public from ttt.

W pgadmin zalogowałem sie na usera ttt i mogłem przeglądać index obiektów, mialem dostep do tabel na ktorych miałem uprawnienia.
Mirosław Ziobro

Mirosław Ziobro Specjalista
informatyk, UX
Experience Designer,
Grafik Ko...

Temat: [POSTGRESQL] Jak nadać użytkownikowi np. uprawnienia...

Tak właśnie też myślałem że pg Admin i tak bedzie pokazywał. Zawsze w pg adminie pokaże strukture tabel i wszystkie jakie istnieją w danej bazie i schemacie. Hmmm gdyby działać na zapytaniach bez pg admina grand i revoke zdają egzamin ale większość programistów sprawdza i konstruuje sqlki w pg adminie bo to popularne narzedzie.
Marcin Mackiewicz

Marcin Mackiewicz Programista JAVA, RS
Adware Polska

Temat: [POSTGRESQL] Jak nadać użytkownikowi np. uprawnienia...

A powiedz. Do czego to zawezanie jest potrzebne?
Pgadmin to marzedzie dla programistow. Chcesz to daz userowi? On sie w tym zgubi...
Mirosław Ziobro

Mirosław Ziobro Specjalista
informatyk, UX
Experience Designer,
Grafik Ko...

Temat: [POSTGRESQL] Jak nadać użytkownikowi np. uprawnienia...

Potrzebuję zrobić widoki z kilku tabel w dużej bazie danych i wymogi są takie że reszty tabel nie powinno być widać. A na bazie z widokami bedzie pracował także zapewne programista uzywający jak przypuszczam np pg admina. On napewno zna takie narzędzia.
Marek Kubiś

Marek Kubiś programista c#

Temat: [POSTGRESQL] Jak nadać użytkownikowi np. uprawnienia...

Mirosław Z.:
Czy da się zrobić tak ani taki użytkownik nie widział tych i innych tabel istniejących w takiej bazie danych a miał dostęp do select z widoków w1 i w2 nic poza tym?
Definiowanie praw dostępu - polecenie GRANT
GRANT ALL ON employees TO miroslaw;

Cofnięcie uprawnień:
REVOKE privileges ON object FROM user;

Odczyt uprawnień:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO user;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO user;
#!/bin/bash

for table in `echo "SELECT schemaname || '.' || relname FROM pg_stat_user_tables;" | psql -A -t my_database_name`;
do
echo "GRANT SELECT ON TABLE $table to my_new_user;"
echo "GRANT SELECT ON TABLE $table to my_new_user;" | psql my_database_name
done
select 'grant all on '||schemaname||'.'||tablename||' to $foo;'
from pg_tables where schemaname in ('$bar', '$baz')
order by schemaname, tablename;

gdzie:
$foo - username któremu nadano uprawnienia,
$bar, $baz - schema w ramach których nadawano upawnienia, na przykład: "public".Ten post został edytowany przez Autora dnia 13.07.17 o godzinie 23:54



Wyślij zaproszenie do