Myślę, że łączysz uwierzytelnianie i autoryzację .
Całkowicie się zgadzam, że zachowanie modelu bezpieczeństwa w DB jest mądre, zwłaszcza, że LedgerSMB został zaprojektowany z myślą o dostępie wielu klientów. Jeśli nie planujesz przejścia 3-warstwowego z warstwą oprogramowania pośredniego, będzie to idealne rozwiązanie sens mieć użytkownikom jak role baz danych, zwłaszcza na coś aplikacji księgowych.
Ten sposób nie oznacza, że musisz uwierzytelniać użytkowników przeciwko bazy danych przy użyciu metody uwierzytelniania PostgreSQL obsługiwane. Użytkownicy bazy danych, role i granty mogą być używane do autoryzacji tylko, jeśli chcesz.
Oto jak to działa na przykład w interfejsie internetowym:
jane
łączy się z serwerem interfejsu WWW i uwierzytelnia się za pomocą dowolnej metody, powiedzmy handshake certyfikatu klienta HTTPS X.509 i autoryzację DIGEST. Serwer ma teraz połączenie od użytkownika, który akceptuje jane
.
Serwer łączy się z PostgreSQL przy użyciu stałej nazwy użytkownika / hasła (lub Kerberos lub cokolwiek innego), uwierzytelniając się na serwerze db jako użytkownik webui
. Serwer db ufa webui
uwierzytelnianiu swoich użytkowników, dlatego webui
otrzymał odpowiednie GRANT
s (patrz poniżej).
W przypadku tego połączenia serwer SET ROLE jane;
przyjmuje poziom autoryzacji użytkownika jane
. Dopóki RESET ROLE;
lub inny SET ROLE
jest prowadzony, połączenie działa z tych samych praw dostępu, jak jane
i SELECT current_user()
etc zgłosi jane
.
Serwer utrzymuje powiązanie między połączeniem bazy danych, z którym musi SET ROLE
się połączyć, jane
a sesją internetową dla użytkownika jane
, nie pozwalając, aby to połączenie PostgreSQL było używane przez inne połączenia z innymi użytkownikami bez nowej SET ROLE
przerwy między nimi.
Teraz uwierzytelniasz się poza serwerem, ale zachowujesz autoryzację na serwerze. Pg musi wiedzieć, którzy użytkownicy istnieją, ale nie potrzebuje dla nich haseł ani metod uwierzytelniania.
Widzieć:
Detale
Serwer webui kontroluje uruchamianie zapytań i nie pozwoli na jane
uruchomienie surowego SQL (mam nadzieję!), Więc jane
nie może RESET ROLE; SET ROLE special_admin_user;
za pośrednictwem interfejsu WWW. Dla większego bezpieczeństwa dodam filtr instrukcji do serwera, który odrzucił SET ROLE
i RESET ROLE
chyba, że połączenie było w puli nieprzypisanych połączeń lub nie wchodziło do niej.
Nadal możesz swobodnie korzystać z bezpośredniego uwierzytelniania Pg na innych klientach; możesz dowolnie mieszać i dopasowywać. Po prostu trzeba GRANT
na webui
użytkownika prawa do SET ROLE
użytkowników, którzy mogą logować się za pośrednictwem Internetu, a następnie dać tym użytkownikom żadnych normalnych CONNECT
praw, haseł, itp chcesz. Jeśli chcesz, aby były dostępne tylko w Internecie, REVOKE
ich CONNECT
prawa do bazy danych (i od public
).
Aby ułatwić podział uwierzytelnienia / autoryzacji, mam szczególną rolę assume_any_user
, do której GRANT
każdy nowo utworzony użytkownik. Ja wtedyGRANT assume_any_user
przechodzę do prawdziwej nazwy użytkownika używanej przez takie rzeczy, jak zaufany interfejs internetowy, dając im prawa do zostania dowolnym użytkownikiem, którego lubią.
Ważne jest, aby assume_any_user
na NOINHERIT
rolę, więc webui
użytkownik lub cokolwiek ma privilges przez jego własny i może działać tylko w bazie danych po to SET ROLE
do prawdziwego użytkownika. Pod żadnym pozorem nie powinien webui
być superużytkownikiem ani właścicielem bazy danych .
Jeśli korzystasz z puli połączeń, możesz użyć, SET LOCAL ROLE
aby ustawić rolę tylko w ramach transakcji, abyś mógł zwracać połączenia do puli po COMMIT
lub ROLLBACK
. Strzeż się, że RESET ROLE
nadal działa, więc nadal nie jest bezpieczne, aby klient mógł uruchamiać dowolny SQL, jaki chcą.
SET SESSION AUTHORIZATION
jest powiązaną, ale silniejszą wersją tego polecenia. Nie wymaga przynależności do roli, ale jest to tylko polecenie administratora. Nie chcesz, aby interfejs użytkownika sieci Web był łączony jako administrator. To może być odwrócone RESET SESSION AUTHORIZATION
, SET SESSION AUTHORIZATION DEFAULT
lub SET SESSION AUTHORIZATION theusername
odzyskać praw superużytkownika, więc nie jest to bariera bezpieczeństwa przywilej opada albo.
Polecenie, które działało jak SET SESSION AUTHORIZATION
ale było nieodwracalne i działałoby, gdybyś był członkiem roli, ale nie superużytkownikiem, byłoby świetne. W tym momencie nie ma jednego, ale nadal możesz całkiem dobrze rozdzielić uwierzytelnianie i autoryzację, jeśli jesteś ostrożny.
Przykład i wyjaśnienie
CREATE ROLE dbowner NOLOGIN;
CREATE TABLE test_table(x text);
INSERT INTO test_table(x) VALUES ('bork');
ALTER TABLE test_table OWNER TO dbowner;
CREATE ROLE assume_any_user NOINHERIT NOLOGIN;
CREATE ROLE webui LOGIN PASSWORD 'somepw' IN ROLE assume_any_user;
CREATE ROLE jane LOGIN PASSWORD 'somepw';
GRANT jane TO assume_any_user;
GRANT ALL ON TABLE test_table TO jane;
CREATE ROLE jim LOGIN PASSWORD 'somepw';
GRANT jim TO assume_any_user;
Teraz połącz jako webui
. Należy pamiętać, że nie można nic zrobić, test_table
ale może SET ROLE
się jane
i wtedy można uzyskać dostęp test_table
:
$ psql -h 127.0.0.1 -U webui regress
Password for user webui:
regress=> SELECT session_user, current_user;
session_user | current_user
--------------+--------------
webui | webui
(1 row)
regress=> SELECT * FROM test_table;
ERROR: permission denied for relation test_table
regress=> SET ROLE jane;
SET
regress=> SELECT session_user, current_user;
session_user | current_user
--------------+--------------
webui | jane
(1 row)
regress=> SELECT * FROM test_table;
x
------
bork
(1 row)
Należy pamiętać, że webui
puszka SET ROLE
do jim
, nawet gdy już SET ROLE
dni do jane
i chociaż jane
nie został GRANT
ed prawo przyjąć rolę jim
. SET ROLE
ustawia efektywny identyfikator użytkownika, ale nie usuwa twojej zdolności do SET ROLE
pełnienia innych ról, jest to właściwość roli, którą podłączyłeś, a nie twojej obecnej skutecznej roli. W związku z tym musisz dokładnie kontrolować dostęp do poleceń SET ROLE
i RESET ROLE
. Nie ma, AFAIK, żadnego sposobu na stałe SET ROLE
połączenie, naprawdę stając się docelowym użytkownikiem, choć na pewno byłoby miło mieć.
Porównać:
$ psql -h 127.0.0.1 -U webui regress
Password for user webui:
regress=> SET ROLE jane;
SET
regress=> SET ROLE jim;
SET
regress=> SELECT session_user, current_user;
session_user | current_user
--------------+--------------
webui | jim
(1 row)
do:
$ psql -h 127.0.0.1 -U jane regress
Password for user jane:
regress=> SET ROLE webui;
ERROR: permission denied to set role "webui"
regress=> SET ROLE jim;
ERROR: permission denied to set role "jim"
Oznacza to, że SET ROLE
nie jest to dokładnie to samo, co logowanie się w ramach określonej roli, o czym należy pamiętać.
webui
nie mogę tego SET ROLE
zrobić, dbowner
ponieważ nie zostało GRANT
to odpowiednio poprawione:
regress=> SET ROLE dbowner;
ERROR: permission denied to set role "dbowner"
więc sam w sobie jest dość bezsilny, może przejąć prawa innych użytkowników i tylko wtedy, gdy ci użytkownicy mają włączony dostęp do sieci.