Szukam dobrego wzorca do implementacji kontroli bezpieczeństwa na poziomie wiersza (za pośrednictwem np. Serwera proxy, usługi sieci pośredniej lub procedur składowanych) odpowiednich do użytku w środowisku klienta-> bazy danych. Kontroluję zarówno klienta, jak i bazę danych. Niektóre wymagania:Zabezpieczenia na poziomie wiersza w scenariuszu z klientem bazy danych
- Zakazanie użytkownikom wyświetlanie wierszy w zapytaniu wynika, że nie ma uprawnień, aby zobaczyć
- dzięki czemu użytkownicy mogą wstawiać i aktualizować swoje wiersze do tabeli, która daje im pozwolenie, aby zobaczyć je
- (wymóg miękki) umożliwiający użytkownikom udzielanie innym dostępu do odczytu lub zapisu wierszy
- Rozwiązanie typu open source lub tanie, działające pod kontrolą systemu Linux. Jak rozumiem, żadna bezpłatna baza danych nie implementuje zabezpieczeń na poziomie wiersza jako takich. Oracle obsługuje to, ale jest zbyt $$$$. Postgres might be implementing this in 9.4, ale pierwotnie był przeznaczony dla 9.3 i poślizgnął się i jest dyskusja na temat ML, że może on się poślizgnąć ponownie. Wstępnie myślę o używaniu Postgreas tylko dlatego, że wydają się być najdalej od tej funkcji.
Niektórzy (niezbyt dobrze) pomysły miałem:
- Używanie widoków PostgreSQL bariery bezpieczeństwa i odmówić użytkownikowi dostępu do tabeli podstawowej. Niestety istnieje no good way to insert a row into a security barrier view, więc niektóre uprzywilejowane proxy/usługa sieciowa musiałaby obsługiwać instrukcje wstawiania. Wydaje się, że trudno to naprawić.
- Użyj zwykłych widoków i odmów użytkownikom dostępu do tabeli podstawowej. To pozwala na
insert
, ale musiałbym zamknąć uprawnienia dość mocno (na przykład brak tworzenia funkcji) i there seem to be a lot of gotchas (like divide by zero) that leak information. - Zdefiniuj niektóre podzestawy SQL i utwórz serwer proxy, który jest jedynym punktem komunikacji z bazą danych. Serwer proxy analizuje zapytanie SQL i przepisuje je w celu wymuszenia wymagań bezpieczeństwa. Wydaje się, że trudno to zrobić w ogóle, ale być może uda mi się uciec z bardzo małym podzbiorem SQL, dopóki postgres nie zastosuje prawdziwego zabezpieczenia na poziomie wiersza.
- Po prostu różne tabele dla różnych użytkowników (lub nawet różnych DB). Jednak nie jestem pewien, jak dobrze to skaluje do wielu użytkowników. Wydaje się również, że nie spełnia to wymagań miękkich.
- Znajdź jakiś komercyjny, ale rozsądne DB-kosztowej, że faktycznie obsługuje tej
- Zastosowanie Veil ale nie wydaje się być utrzymane, a to ma większość ograniczeń innych rozwiązań
Zrobiłem dużo googlowania na ten temat, ale jeszcze nie widzę postmortem tego, jak ktoś rozwiązał ten problem w realnym scenariuszu. Jest some documentation for MS SQL, ale wydaje się być discouraged in MySQL, a zapisy są zasadniczo nieistniejące dla PostgreSQL.
Wydaje się, że jest to bardzo powszechny problem, ale wydaje mi się, że wiele osób pisze aplikacje internetowe i zadaje sobie kajdanki swoich użytkowników do pewnych wstępnie sprawdzonych zapytań, ale naprawdę muszę zapewnić moim użytkownikom jak największą elastyczność, przeszukuj dane za pomocą mojego klienta.
Tak, bezpieczeństwo rzędu dla PostgreSQL spadło do 9.4. Obecna łata jest całkiem niezła, ale wciąż muszę naprawić co najmniej jeden błąd związany z widokami barier bezpieczeństwa w istniejącej bazie kodu, naprawić testy regresji i wykonać pewne ogólne czyszczenie, aby umożliwić wywołanie. Na 9.4 jest już za późno. –
Byłoby jednak pomocne, gdybyś zamieścił dobre słowo na temat włączenia automatycznie aktualizowalnych widoków zabezpieczeń w 9.4. Użycie przez użytkownika tej funkcji może być różnicą między włączeniem a brakującym terminem. –
http://www.postgresql.org/docs/devel/static/ddl-rowsecurity.html – kzh