Zabezpieczanie haseł DB

18

Patrząc na strukturę większości witryn opartych na PHP / MySQL, które widziałem, wydaje się, że nie jest strasznie trudno rozpoznać hasło do bazy danych, jeśli trochę kopiesz, ponieważ zawsze jest plik instalacyjny lub konfiguracyjny, w którym przechowywane są informacje do logowania do DB. Jakie są inne opcje poza podstawowymi środkami ostrożności, aby upewnić się, że uprawnienia mojej bazy danych są odpowiednio ograniczone w przypadku zdalnych żądań, które mógłbym wdrożyć we własnych projektach w celu ochrony tych informacji?

Kaji
źródło
1
Aby to wyjaśnić - pytasz o przechowywanie poświadczeń w celu zalogowania się do bazy danych ze strony internetowej, a nie o to, jak prawidłowo przechowywać hasła dla użytkowników strony w bazie danych, prawda?
Joe
Poprawny; o to mi chodzi.
Kaji

Odpowiedzi:

10

Nie jest to bezpośrednia odpowiedź na temat przechowywania haseł, ale generalnie używam co najmniej dwóch połączeń z bazą danych podczas tworzenia aplikacji internetowych - jedno z nich wykorzystuje 99% czasu na działania związane z użytkownikami, z ograniczonymi uprawnieniami, a drugie służy do funkcji administratora (usuń użytkowników itp.).

W kilku przypadkach, w których instaluję pakiet innej osoby, zainstaluję dwie instancje ... instancję publiczną, która ma dostęp tylko do bazy danych, aby wykonywać ogólne czynności związane z typem użytkownika, a drugą instancję ograniczoną do adresu IP moja lokalna podsieć (być może nawet na innym komputerze), która musi być używana do wszelkich działań typu „admin”. Żaden z nich nie ma dostępu do modyfikowania tabel itp. Wolę jednak korzystać z rodzimych narzędzi bazy danych, niż pozwolić aplikacji internetowej na uruchamianie własnych zadań aktualizacji, które nie zostały jeszcze sprawdzone.

Możesz jednak pójść o krok dalej i dodać więcej połączeń specjalnie dla danych zadań ... więc zadania tworzenia i zarządzania hasłami przechodzą przez użytkownika, który ma dodatkowe uprawnienia w tabelach użytkowników, logowanie ma uprawnienia do uwierzytelniania bazy danych i niewiele więcej itd.

W ten sposób, jeśli dojdzie do ataku polegającego na wstrzyknięciu sql, na większości stron internetowych nie jest w stanie zrobić nic znaczącego - nie widzi skrótów haseł, nie może dodać nowego użytkownika administratora (nie to, że byłby w stanie to zrobić cokolwiek zresztą), itp. To nadal nie pomoże, jeśli uda im się zdobyć powłokę na twoim komputerze, ale spowolni je.

Joe
źródło
1
Robimy coś podobnego. Generalnie jednak tworzymy nowe konto dla każdego użytkownika / aplikacji bazy danych, zamiast robić to według funkcji. Rozwiązuje to dla nas dwa problemy - 1) możemy rozróżnić użycie bazy danych w narzędziach takich jak OEM (tzn. Możemy zobaczyć, kto wbija bazę danych w ziarnistość) i 2) możemy indywidualnie dostosować to, co każdy użytkownik widzi i do którego ma dostęp w ramach Baza danych.
ScottCher,
7

Używaj haseł jednorazowych , Kerberos , LDAP lub czegokolwiek innego do przechowywania danych konta i uwierzytelniania / autoryzacji użytkowników. Usługi katalogowe są dobrym sposobem do przechowywania informacji o użytkowniku i używania ich jako zaplecza danych konta.

Yasir Arsanukaev
źródło
4

Jestem wielkim fanem używania uwierzytelniania „Ident” PostgreSQL na lokalnych gniazdach, kiedy tylko mogę. W ten sposób lokalni użytkownicy są mapowani bezpośrednio do użytkowników komputerów lokalnych w systemie Unix / Windows i nie muszę się martwić o przechowywanie haseł. Jednak nie sądzę, że jest to jeszcze opcja w MySQL.

Tam, gdzie baza danych i serwer WWW znajdują się na dwóch osobnych komputerach, używam haseł MD5 przez SSL: jeśli wrogi ma dostęp do mojego serwera frontendowego, to tylko kwestia czasu, zanim zorientuje się, jak komunikuje się z bazą danych.

Gauraw
źródło
3

Jeśli korzystasz z .NET Framework, możesz zajrzeć za pomocą zaszyfrowanych parametrów połączenia. Nie wiem, czy coś takiego jest możliwe w innych językach / ramach, ale byłoby to kolejnym zabezpieczeniem, aby upewnić się, że twoje połączenia nie zostaną naruszone.

Oprócz korzystania z zaszyfrowanych parametrów połączenia, używanie LDAP / Kerberos / Active Directory będzie najbezpieczniejszą opcją.

Jeremiasz Peschka
źródło
3

Jeśli twoje hasła są zapisane jako zwykły tekst, użyj skrótów (MD5, SHA), Luke!

Yasir Arsanukaev
źródło
OP nie pyta o przechowywanie haseł użytkowników. Ale tak, z pewnością zaszyfruj hasła użytkownika, ale nigdy nie używaj do tego użytkownika MD5 lub rodziny SHA! Zastosowanie bcrypt lub PBKDF2. W przeciwnym razie wkrótce znajdziesz się w wiadomościach takich jak te firmy, które korzystały z MD5 i SHA1, narażając w ten sposób swoich użytkowników na proste ataki siłowe.
Nick Chammas,
Jasne, solenie i inne techniki są wymagane oprócz haszowania. I nigdy nie należy implementować prymitywów kryptograficznych sam (ona sama), a raczej używać niektórych szeroko testowanych bibliotek kryptograficznych.
Yasir Arsanukaev
2

W zależności od języka programowania możesz zaszyfrować dane logowania, ale jeśli używasz języka zinterpretowanego, nie ma sposobu, aby upewnić się, że ktoś nie będzie w stanie odczytać poświadczeń, jeśli uzyska dostęp do systemu.

Jeśli korzystasz z C ++ lub podobnego, polecam utworzenie / znalezienie solonej funkcji szyfrowania / deszyfrowania i uruchomienie poświadczeń przez nią i zapisanie wynikowego skrótu jako pliku w systemie.

Jeśli korzystasz z PHP lub podobnego, radzę napisać opakowanie dla mcrypt_encrypt()i posolić poświadczenia, a następnie uruchomić zaciemnianie kodu, aby spowolnić hakerów, jeśli uzyskają dostęp do systemu.

Patrick
źródło
Jeśli szyfrujesz dane uwierzytelniające, potrzebujesz innego sekretu, aby je ponownie odszyfrować. Ewentualnie zaszyfrowana forma staje się tajemnicą, więc osoba atakująca może z niej skorzystać. Brakuje niektórych szczegółów.
Peter Eisentraut,