Chcę migrować dość prostą, wewnętrzną aplikację bazodanową z SQLite3 do PostgreSQL 9.3 i za każdym razem zaostrzać uprawnienia w DB.
Aplikacja składa się obecnie z polecenia aktualizacji danych; i jeden do zapytania. Oczywiście będę także musiał utrzymywać bazę danych w inny sposób (tworzyć nowe tabele, widoki, wyzwalacze itp.).
Chociaż ta aplikacja będzie początkowo jedyna hostowana na serwerze, wolałbym piec w założeniu, że w przyszłości może ona być hostowana na serwerze z innymi bazami danych, niż później musieć szyfrować, jeśli stanie się to konieczne w przyszłość.
Myślę, że byłby to dość powszechny zestaw wymagań, ale mam problem ze znalezieniem prostego samouczka wyjaśniającego, jak skonfigurować nową bazę danych w PostgreSQL, z tego rodzaju separacją użytkowników / uprawnień. Odnoszone są obszerne odniesienia do grup, użytkowników, ról, baz danych, schematów i domeny; ale uważam je za mylące.
Oto, co do tej pory próbowałem (od wewnątrz psql
jako „postgres”):
CREATE DATABASE hostdb;
REVOKE ALL ON DATABASE hostdb FROM public;
\connect hostdb
CREATE SCHEMA hostdb;
CREATE USER hostdb_admin WITH PASSWORD 'youwish';
CREATE USER hostdb_mgr WITH PASSWORD 'youwish2';
CREATE USER hostdb_usr WITH PASSWORD 'youwish3';
GRANT ALL PRIVILEGES ON DATABASE hostdb TO hostdb_admin;
GRANT CONNECT ON DATABASE hostdb TO hostdb_mgr, hostdb_usr;
ALTER DEFAULT PRIVILEGES IN SCHEMA hostdb GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO hostdb_mgr;
ALTER DEFAULT PRIVILEGES IN SCHEMA hostdb GRANT SELECT ON TABLES TO hostdb_usr;
Ale nie otrzymuję zamierzonej semantyki. Chcę to skonfigurować, aby tylko hostdb_admin
tabele mogły tworzyć (upuszczać i zmieniać); hostdb_mgr
mogą czytać, wstawianie, aktualizowanie i usuwanie wszystkich tabelach domyślnie; i hostdb_usr
może czytać tylko wszystkie tabele (i widoki).
Kiedy spróbowałem, okazało się, że jestem w stanie tworzyć tabele hostdb
jako dowolny z tych użytkowników; ale dla każdego użytkownika mogłem tylko czytać lub modyfikować tabele utworzone przez tego użytkownika - chyba że użyję jawnego GRANT
.
Zgaduję, że czegoś brakuje między CREATE DATABASE
i CREATE SCHEMA
coś, co można zastosować SCHEMA
do DATABASE
?
(W miarę postępu rzeczy będę mieć pytania dotyczące podobnych ograniczeń TRIGGERS
, procedur przechowywanych VIEWS
i być może innych obiektów).
Gdzie mogę znaleźć porządny przewodnik, samouczek lub serię filmów na ten temat?
źródło
public
pseudorolą. Można to uznać za rolę, do której należy każda inna rola (użytkownik, grupa - wszystkie są takie same). Spróbuj usunąć z niego uprawnienia, na przykładREVOKE CREATE ON SCHEMA hostdb FROM public
. Odwoływanie uprawnień na poziomie bazy danych, tak jak Ty, wyłącza tylko niektóre uprawnienia na poziomie bazy danych, bez wpływu na schematy lub tabele.public
Zdarza się tylko domyślny schemat z przywilejamiPUBLIC
. Poza tym nie ma domyślnych uprawnień do nowych schematów. Nie wpływa to więc na pokazany przypadek użycia. Zobacz rozdział w mojej odpowiedzi.Odpowiedzi:
Znajdziesz wszystko w podręczniku. Linki poniżej.
To prawda, że sprawa nie jest trywialna, a czasem myląca. Oto przepis na przypadek użycia:
Przepis
Jako administrator
postgres
:Jeśli chcesz mieć silniejszego administratora, który może również zarządzać bazami danych i rolami, dodaj atrybuty roli
CREATEDB
iCREATEROLE
wyżej.Przydziel każdą rolę do następnego wyższego poziomu, aby wszystkie poziomy „dziedziczyły” co najmniej zestaw uprawnień z następnego niższego poziomu (kaskadowanie):
Nazywam ten schemat
schma
(hostdb
co nie byłoby mylące). Wybierz dowolne imię. Opcjonalnie ustawschma_admin
właściciela schematu:Do
and drop and alter
notatek patrz poniżej.Widoki są wyjątkowe. Po pierwsze:
I dla widoków, które można aktualizować :
Wyzwalacze też są wyjątkowe. Potrzebujesz
TRIGGER
przywileju na stole i:Ale już nadmiernie rozszerzamy zakres tego pytania ...
Ważne notatki
Własność
Jeśli chcesz pozwolić
schma_admin
(samemu) na upuszczanie i modyfikowanie tabel, ustaw rolę jako własność wszystkich obiektów. Dokumentacja:Lub utwórz wszystkie obiekty z rolą
schma_admin
na początek, wtedy nie musisz jawnie ustawiać właściciela. Upraszcza to także domyślne uprawnienia, które należy ustawić tylko dla jednej roli:Wcześniej istniejące obiekty
Domyślne uprawnienia dotyczą tylko nowo utworzonych obiektów i tylko dla określonej roli, w której zostały utworzone. Będziesz także chciał dostosować uprawnienia do istniejących obiektów:
To samo dotyczy tworzenia obiektów z nieokreśloną rolą
DEFAULT PRIVILEGES
, takich jak administratorpostgres
. Przypisz do własnościschma_admin
i ustawić uprawnienia ręcznie - lub zestawDEFAULT PRIVILEGES
dopostgres
jak również (gdy podłączony do prawego DB!):Domyślne uprawnienia
Brakowało ważnego aspektu
ALTER DEFAULT PRIVILEGES
polecenia. Ma zastosowanie do bieżącej roli, chyba że określono inaczej:Domyślne uprawnienia dotyczą tylko bieżącej bazy danych. Więc nie zadzieraj z innymi bazami danych w klastrze DB. Dokumentacja:
Państwo może również chcesz ustawić domyślne przywilejów
FUNCTIONS
iTYPES
(nie tylkoTABLES
aSEQUENCES
), ale te nie mogą być potrzebne.Domyślne uprawnienia dla
PUBLIC
Domyślne przywileje przyznane
PUBLIC
są przez niektórych szczątkowe i zawyżone. Dokumentacja:Odważny nacisk moje. zazwyczaj jedno z powyższych poleceń wystarcza, aby objąć wszystko:
W szczególności nie przyznaje się żadnych domyślnych uprawnień do
PUBLIC
nowych schematów. Może być mylące, że domyślny schemat o nazwie „public” zaczyna się odALL
uprawnień dlaPUBLIC
. To tylko funkcja ułatwiająca rozpoczęcie pracy z nowo utworzonymi bazami danych. Nie wpływa w żaden sposób na inne schematy. Państwo może unieważnić te przywileje w bazie szablonutemplate1
, a następnie wszystkich nowo tworzonych baz danych w tej grupie zacząć bez nich:Przywilej
TEMP
Ponieważ cofnęliśmy wszystkie uprawnienia
hostdb
zPUBLIC
, zwykli użytkownicy nie mogą tworzyć tabel tymczasowych, chyba że wyraźnie na to zezwalamy. Możesz lub nie chcesz dodać tego:search_path
Nie zapomnij ustawić
search_path
. Jeśli masz tylko jedną bazę danych w klastrze, możesz po prostu ustawić globalną wartość domyślną wpostgresql.conf
. W przeciwnym razie (bardziej prawdopodobne) ustaw ją jako właściwość bazy danych lub po prostu dla zaangażowanych ról lub nawet kombinacji obu. Detale:Możesz to ustawić,
schma, public
jeśli używasz również schematu publicznego, a nawet (mniej prawdopodobne)$user, schma, public
...Alternatywą byłoby użycie domyślnego schematu „public”, który powinien działać z ustawieniami domyślnymi,
search_path
chyba że to zmieniłeś. Pamiętaj, abyPUBLIC
w tym przypadku cofnąć uprawnienia .Związane z
źródło
this
wygląda jak instrukcja dla statku kosmicznego ...