Czy kiedykolwiek dobrą praktyką jest używanie odrębnego konta bazy danych dla każdego użytkownika aplikacji?

13

Aplikacje, do których jestem przyzwyczajony, są oparte na serwerze i używają jednego konta bazy danych dla wielu użytkowników, a kod aplikacji kontroluje, co użytkownik może zrobić, lub dla jednego użytkownika.

Czy są jakieś udane złożone aplikacje biznesowe, w których każda osoba potrzebuje własnego konta bazy danych, a serwer bazy danych polega na egzekwowaniu zasad polityki dotyczących tego, co każdy użytkownik powinien mieć prawo, a co nie?

Myślę o aplikacjach, w których wiele osób przyczynia się do informacji w jednej bazie danych i może uzyskiwać dostęp do informacji przechowywanych przez inne osoby - np. Współpracowników w organizacji, którzy wszyscy potrzebują dostępu do danych klientów.

Czy jest też nazwa tego typu konfiguracji?

bdsl
źródło
1
Rzućmy to na głowę, czy to dobra praktyka, żeby tego nie robić?
Stevetech
Z pewnością jest to standardowa praktyka, również w niektórych sytuacjach. Wiele aplikacji ma wielu użytkowników końcowych, ale tylko jednego użytkownika bazy danych - na przykład wordpress, drupal, roundcube, redmine. O ile wiem, zalecana instalacja dla każdej z tych aplikacji ma tylko jedno konto użytkownika na poziomie bazy danych, ale z łatwością mogą istnieć setki lub tysiące użytkowników.
bdsl
@Stevetech wygląda na to, że twoja odpowiedź na moje pytanie brzmi „tak”. czy możesz rozwinąć to do pełnej odpowiedzi?
bdsl

Odpowiedzi:

6

Jeśli potrzebujesz naprawdę ścisłej kontroli egzekwowanej na poziomie danych. Na przykład obszerny audyt. Kontrola nie jest zbyt dobra, jeśli kilku użytkowników korzysta z tego samego konta. Jeśli masz użytkowników, którzy potrzebują bezpośredniego dostępu do bazy danych.

Jeśli bezpieczeństwo jest tak ścisłe, zazwyczaj nawet nie ujawniasz bezpośrednio bazy danych. Masz usługę, a klient musi uzyskać dane z usługi.

W aplikacji internetowej baza danych (np. Port 1433) zazwyczaj nie jest narażona bezpośrednio, więc masz pewien poziom bezpieczeństwa. Nawet jeśli aplikacja internetowa uzyskuje bezpośredni dostęp do bazy danych, użytkownicy nadal nie mają bezpośredniego dostępu do bazy danych.

Jeśli login i hasło znajdują się w aplikacji klienckiej, można je zhakować. Jeśli domena może korzystać ze zintegrowanych zabezpieczeń.

W bazie danych możesz mieć całkiem niezłą kontrolę. Ale kontrola na poziomie wiersza to trochę pracy. Baza danych nie jest dobrym narzędziem do reguł biznesowych. Reguły biznesowe i szczegółowe zabezpieczenia są zwykle egzekwowane na poziomie aplikacji.

Możesz mieć tryb mieszany, w którym administratorzy korzystają z niektórych procedur przechowywanych i chcesz śledzić, który administrator. I możesz przyznać dostęp tylko do odczytu użytkownikom, którzy generują raport bezpośrednio.

paparazzo
źródło
5

Wyzwanie polega na tym, że dostępem do bazy danych zarządza abstrakcja. Zamiast użytkowników łączących się jak oni, w zasadzie przyjmują tożsamość jakiejś uogólnionej roli aplikacji. Nie tylko tracisz widoczność poszczególnych połączeń, ale także tracisz szczegółowość definiowania różnych rodzajów dostępu dla wszystkich indywidualnych użytkowników.

Głównym powodem zastosowania tego podejścia jest prostota. Wiele aplikacji zaprojektowano tak, aby użytkownik aplikacji nie miał wiedzy o bazie danych. Naprawdę tego nie potrzebują, zwłaszcza jeśli aplikacja zarządza własnym bezpieczeństwem wewnętrznym. Większość indywidualnych użytkowników nigdy nie łączy się bezpośrednio z bazą danych, więc zdefiniowanie dla nich jawnego loginu nie jest konieczne.

Jedynym momentem, w którym powinieneś rozważyć umożliwienie bazie danych zarządzania bezpieczeństwem, jest to, że masz użytkowników, którzy będą się łączyć bezpośrednio z bazą danych. Oznacza to, że omijają twoją aplikację i nie mogą już same egzekwować bezpieczeństwa. Zaletą jest to, że możesz bardziej szczegółowo określić swoje bezpieczeństwo. Wadą jest wyższy koszt zarządzania użytkownikami i ich uprawnieniami.

wprowadź opis zdjęcia tutaj

Jeśli czujesz potrzebę tego rodzaju dostępu, chcesz użyć kontroli dostępu opartej na rolach . Należy zdefiniować role na podstawie tego, jakie uprawnienia są potrzebne w bazie danych, a następnie pogrupować poszczególnych użytkowników w ramach tych ról. Zapewnia to lepszą kontrolę i kontrolę nad modelem bezpieczeństwa, który może szybko wymknąć się spod kontroli podczas zarządzania bezpośrednim dostępem.

Istnieje hybrydowe podejście do tego. Jeśli chcesz, aby twoje zabezpieczenia były częściowo modyfikowane przez bazę danych, możesz utworzyć wielu użytkowników aplikacji, z których każdy jest zdefiniowany według ich roli, i wyraźnie przyznać dostęp tym użytkownikom na podstawie roli, którą pełnią. Oznacza to, że możesz wykorzystać silnik bazy danych do niektórych modeli bezpieczeństwa, ale nadal musisz mieć pewne zarządzanie w aplikacji. Zwiększa złożoność modelu użytkownika aplikacji, ale zapewnia większą szczegółowość różnych używanych loginów.

Mike Fal
źródło
4

Powinieneś zacząć egzekwować bezpieczeństwo na najbardziej szczegółowym poziomie tak szybko, jak to możliwe. Role pomagają w tym względzie - zapewnianie ludziom dostępu do wielu stolików jednocześnie nie jest koszmarem.

Jedno konto dla wszystkich jest doskonałym źródłem pytań tutaj i gdzie indziej - „rekord x został usunięty, jak mogę dowiedzieć się, kto to zrobił?” - odpowiedź brzmi: nie możesz - bez indywidualnych kont i audytu .

Przez „audytowanie” rozumiem, że chociaż bardzo dobrze jest mieć konto dla wszystkich, nie oznacza to, że masz prawdziwe bezpieczeństwo. Jeśli, powiedzmy, rekord w tabeli HR zostanie usunięty, wszystko, co możesz powiedzieć, to że ktoś z dostępem do tabeli HR to zrobił - to x liczba osób.

Potrzebujesz w systemie wyzwalaczy, które rejestrują działania, aby móc wyśledzić indywidualny poziom, który wykonał akcję X (chyba że masz RDBMS, taki jak Oracle, gdzie można to zrobić automatycznie).

W każdym razie zawsze powinieneś możliwie jak najszybciej uszczegółowić swoje bezpieczeństwo - dać ludziom dostęp do tabel tylko na podstawie „potrzeby wiedzieć”. I zawsze dołączaj sygnatury czasowe akcji do tabel - ludzie często podają swoje identyfikatory innym osobom - jeśli możesz powiedzieć: „Jimmy, byłeś jedyny w biurze o 17:49 ...” - znowu, to nie ironia, tylko kolejna strzała w kołczanie.

Może jeśli dałeś nam swój RDBMS, możesz uzyskać porady bardziej szczegółowe / odpowiednie dla twojej sytuacji?

Vérace
źródło
Nie sądzę, żeby miało to bezpośredni związek z moją sytuacją, pracowałem pytając głównie z ciekawości. Pracuję z aplikacjami internetowymi i MySQL.
bdsl
1
Wydaje się, że mówisz, że wszystkie bazy danych powinny wymagać, aby każdy użytkownik końcowy miał unikalny login, ale znam wiele aplikacji serwerowych, które używają tylko jednego użytkownika DBMS dla całej aplikacji, i nie widziałem, aby potępiono to jako najlepsze ćwiczyć.
bdsl
1
Nie ma nic złego w intelektualnej ciekawości - wydaje się, że twój post został dobrze przyjęty. MySQL jest prawdopodobnie najgorszy pod względem bezpieczeństwa (podobnie jak w wielu innych ...), ale MariaDB ma je i jest również Open Source. W odpowiedzi na komentarz - to, o czym mówisz, nie jest najlepszą praktyką - to najgorsza praktyka.
Vérace
1
@bdsl Miksujesz serwer z aplikacją biznesową i to jest źródłem zamieszania. Aplikacje biznesowe obejmują aplikacje komputerowe.
paparazzo
1
@bdsl Następnie przestań używać terminu aplikacje serwerowe, jeśli nie chcesz wykluczyć aplikacji komputerowej.
paparazzo
3

Tak to jest. Łączenie się z bazą danych z aplikacji jako pojedynczy potężny użytkownik stanowi naruszenie zasady najmniejszych uprawnień . Jest to główna przyczyna większości ataków typu SQL Injection.

Zwykle dzieje się tak z powodu niewiedzy, ze względu na prostotę, a czasem ze względu na wydajność.

Bazy danych są często długotrwałe i używane przez wiele aplikacji jednocześnie i z czasem. Możesz oszczędzać zasoby, centralizując kontrolę dostępu w bazie danych zamiast w wielu aplikacjach.

Chcesz wybrać serwer db, który obsługuje Row Security, Column Security oraz Personifikacja / Proxy Authentication (który obsługuje prawdziwych użytkowników db + pule połączeń)

Byłoby to również bezpieczniejsze dla aplikacji opartych na „wtyczkach”, takich jak Wordpress, gdzie trudno jest uniknąć wstrzyknięć SQL z powodu niewykwalifikowanych autorów wtyczek. Każda wtyczka otrzymuje login db, zamiast aplikacji jako całości.

Neil McGuigan
źródło
Czy jest możliwe, aby każdy użytkownik witryny Wordpress łączył się z bazą danych przy użyciu różnych poświadczeń?
bdsl
@bdsl tak to jest.
Neil McGuigan
1
Czy możesz podać link do dowolnego przewodnika, jak to zrobić? Miałem szybkie wyszukiwanie i nie znalazłem go. Czy to oznacza, że ​​strona logowania wordpress pyta o poświadczenia potrzebne do zalogowania się do bazy danych?
bdsl
@ bdsl mój php jest dość zardzewiały. Oto jak zrobiłbyś to z Spring (Java) i PostgreSQL. blog.databasepatterns.com/2015/03/… . stackoverflow.com/questions/2998597/…
Neil McGuigan
1
Wordpress był tylko przykładem systemu opartego na wtyczkach. Jest źle wykonany z punktu widzenia bezpieczeństwa.
Neil McGuigan