Chciałbym uchwycić najlepszy sposób użycia nowej funkcji bezpieczeństwa na poziomie wiersza w bazie danych dla wielu dzierżawców, która obsługuje aplikację internetową.PostgreSQL 9.5 - Bezpieczeństwo na poziomie wiersza/Najlepsze praktyki ROLE
Obecnie aplikacja ma kilka różnych ROLE, w zależności od podejmowanej akcji.
Gdy aplikacja nawiąże połączenie przy użyciu własnej ROLI, aplikacja przekazuje parametry uwierzytelniania (dostarczone przez użytkownika) do różnych funkcji, które odfiltrowują wiersze na podstawie dostarczonych przez użytkownika parametrów uwierzytelniania. System jest przeznaczony do pracy z tysiącami użytkowników i wygląda na to, że działa; jednak jest wyzywająco niezgrabny (i powolny).
Wygląda na to, że gdybym chciał skorzystać z nowej funkcji bezpieczeństwa na poziomie wiersza, musiałbym utworzyć nową ROLĘ dla każdego użytkownika w świecie rzeczywistym (nie tylko dla aplikacji internetowej), aby uzyskać dostęp do bazy danych.
Czy to prawda? a jeśli tak, to czy dobrze jest stworzyć tysiące ROLE w bazie danych?
Aktualizacja z a_horse_with_no_name „s link w komentarzach (dzięki, że gwint jest na miejscu):
CREATE USER application;
CREATE TABLE t1 (id int primary key, f1 text, app_user text);
INSERT INTO t1 VALUES(1,'a','bob');
INSERT INTO t1 VALUES(2,'b','alice');
ALTER TABLE t1 ENABLE ROW LEVEL SECURITY;
CREATE POLICY P ON t1 USING (app_user = current_setting('app_name.app_user'));
GRANT SELECT ON t1 TO application;
SET SESSION AUTHORIZATION application;
SET app_name.app_user = 'bob';
SELECT * FROM t1;
id | f1 | app_user
----+----+----------
1 | a | bob
(1 row)
SET app_name.app_user = 'alice';
SELECT * FROM t1;
id | f1 | app_user
----+----+----------
2 | b | alice
(1 row)
SET app_name.app_user = 'none';
SELECT * FROM t1;
id | f1 | app_user
----+----+----------
(0 rows)
Teraz jestem zdezorientowany przez current_setting('app_name.app_user')
jak byłem pod wrażenie było tylko dla parametrów konfiguracyjnych ... gdzie zdefiniowano app_name
?
http://www.postgresql.org/message-id/[email protected] –
@a_horse_with_no_name - przybity to, dzięki; jednakże przykład podany w wątku jest nieco zagadkowy ... Zaktualizowałem to pytanie. – losthorse
It ** jest ** dla parametrów "konfiguracyjnych". Używanie ich w tym celu jest zasadniczo "hack". Nie musisz ich definiować przed ręką - można to zrobić dynamicznie. Zauważ, że 'current_setting ('nazwa_aplikacji.app_user')' spowoduje błąd, jeśli parametr nie został wcześniej zdefiniowany. Aby temu zapobiec, możesz zdefiniować fałszywą wartość w 'postgresql.conf' –