Pytanie:
Czy mogę ukryć, które konto w mojej bazie danych jest kontem administratora, aby osoba atakująca nie wiedziała, który hash ma złamać jako pierwszy?
Melkor
2017-05-02 13:45:36 UTC
view on stackexchange narkive permalink

Powiedzmy, że mam bazę danych, która wygląda następująco:

  Nazwa Skrót hasła (bcrypt) Status -------------------- -------------------------------------------------- ---------- Dave $ 2y $ 10SyyWTpNB.TyWd3nM hQ41frOtObcircAb3nJw1Cf9dC6CT7tVIEb6XS StandardSarah 2y $ 10 $ fUJrNA200sXgWUJAP7XEiuq4itHa43Y8QVVIpVLJ / YY8QVIpVLJ / YY8QVIpVC. AdminMike $ 2y $ 10 $ 01jx7u7hnfKOzBYyjNWskOPQ23w1Cf1gNiv42wsKqXKOf8filzS02 Standard 

Gdyby osoba atakująca uzyskała dostęp do tej bazy danych, natychmiast zobaczyłaby, że Sarah jest administratorem i prawdopodobnie skupiłaby się na złamaniu tego hasła, aby mogli mają więcej mocy. Czy jest jakiś sposób, żebym mógł jakoś ukryć, czy ktoś jest administratorem w bazie danych, aby atakujący nie wiedział, kim są administratorzy? Mógłbym po prostu zaszyfrować wartość (standard lub admin), ale dałoby to tylko 1 bit entropii i mam nadzieję, że uzyskam trochę więcej bezpieczeństwa.

Atakujący może również po prostu spojrzeć na najstarszy wpis.W większości systemów będzie to konto administratora :)
@Nat - Jak dokładnie mogli się zalogować, używając tylko skrótu?Nie ma to dla mnie sensu, chociaż logowanie się jako każdy użytkownik ma sens, dopóki nie znajdziesz administratora.
Dawno temu we wszechświecie, dawno temu, musiałem zaimplementować coś podobnego.Sposób, w jaki to zrobiłem, był następujący: dodaj zahaszowaną literę do hasła (właściwie wiele liter, był to „identyfikator grupy”) i pozwól mechanizmowi uwierzytelniania wypróbować wszystkie kombinacje.
Byłoby prostsze i lepiej byłoby dodać 1 bit entropii do hasła (hash), skutecznie podwajając średni wysiłek udanego ataku brutalnego, niż pozbawić atakującego 1 bitu informacji rozpoznawczych.Ponadto brutalne wymuszenie wstępnego obrazu dla 1 miliona hashów nie zajmuje dużo więcej czasu niż w przypadku pojedynczego (zakładając równą rzeczywistą entropię przedobrazową).
Czy ta kolumna jest czytelna dla zwykłych użytkowników?
@DavidFoerster Jest to więcej niż jedna informacja, ponieważ może być wielu użytkowników.A złamanie skrótu hasła nie jest tym samym, co znalezienie obrazu wstępnego wartości skrótu z dwóch powodów: „1.” Większość haseł ma dużo mniejszą entropię niż rozmiar wyjściowego skrótu.`2.` Te wartości skrótu wyglądają jak solone.
@kasperd: Dobrze wypowiadasz się na temat entropii hasła, którą rozważałem, ale pominąłem ze względu na zwięzłość i następujące rozsądne założenie: hasło administratora będzie miało znacznie wyższą entropię niż przeciętne hasło do konta i prawdopodobnie będzie jednym z ostatnichznaleziono podczas typowego ataku słownikowego, który próbuje krótkich haseł przed dłuższymi hasłami, a popularne słowa przed mniej powszechnymi słowami przed losowymi sekwencjami znaków.
@kasperd: O trochę informacji: może istnieć więcej niż 2 typy kont, ale w tym scenariuszu atakujący dba tylko o binarne rozróżnienie między administratorem a nieadministratorem.
@DavidFoerster Chodzi mi o to, że informacje, które przeciwnik otrzymuje, wiedząc z góry, którzy użytkownicy są administratorami, są bliższe 1 bitowi na użytkownika niż 1 bitowi w sumie.A przeciwnikowi zależy tylko na hasłach adminów.Gdyby wszystkie hasła w bazie danych były równie silne, 1 bit wiedzy na użytkownika mógłby bardzo pomóc przeciwnikowi.Jednak, jak zauważyłeś, hasła administratora są prawdopodobnie średnio silniejsze niż inne hasła.A to oznacza, że wiedza, którzy użytkownicy są administratorami, jest dużo mniej warta dla atakującego.
Po co łamać hasło administratora, skoro już uzyskano dostęp do systemu?
@JonasDralle Attacker mógł uzyskać skróty z kopii zapasowej, która wyciekła.Administratorzy mogli używać tego samego hasła w więcej niż jednym systemie.
Być może zamiast zaciemniać dane wymuszaj uwierzytelnianie oparte na certyfikatach.
Jeśli napastnik może przeskanować twoją bazę danych, masz już znacznie większy problem.
Certyfikaty klienta @JonasDralle TLS mają swoje własne problemy.Zobacz np.https://utcc.utoronto.ca/~cks/space/blog/tech/TLSClientCertificateWhen
Czy to nie jest w zasadzie Kerberos?:)
Jeśli haker ma dostęp do Twojej bazy danych, dlaczego nie spróbować włamać się do wszystkich kont, a następnie po prostu zmienić status na Admin?
@MatthewWhited: Może to być dostęp tylko do odczytu.
Dodanie większej entropii do hasha ma również niewielką wartość ... prawdziwy problem z hasłami polega na tym, że ludzie używają haseł łatwych do odgadnięcia lub zapisują je, jeśli są zmuszeni do używania losowych (ish).A może zamiast tego zaimplementować uwierzytelnianie dwuskładnikowe?Usługa Google Authenticator jest bezpłatna dla każdego, kto nosi smartfona.Albo po prostu odejdź na emeryturę "Dave'a" itp. I nalegaj na losowy wybór spośród 1,6 miliarda identyfikatorów (dających się zapamiętać) postaci aannaann.
Dziewięć odpowiedzi:
Black Magic
2017-05-02 13:56:26 UTC
view on stackexchange narkive permalink

Powiedziałbym, że to trochę za duży problem, biorąc pod uwagę, co z tego masz. Myślę, że kiedy atakujący ma dostęp do bazy danych, masz znacznie większe problemy. Ukrywanie statusu administratora użytkownika będzie kosztować atakującego dodatkowy czas, ale APT (Advanced Persistent Threat) prawdopodobnie nie zostałby tym odstraszony.

Dokładnie.Ukrywanie statusu administratora jest tak samo bezużyteczne, jak próba przyklejenia swoich rzeczy do podłogi, aby włamywacze nie mogli ich zdobyć - nadal mogą i będą to robić.Zamiast tego chcesz uniemożliwić włamywaczowi wejście.
@JamesCameron, chyba że twoje „rzeczy” składają się z 10-calowych gwoździ.Wtedy myślę, że włamywacz może po prostu zastanawiać się, co jest z tobą nie tak ... i zgłosić cię jako szalonego.
@TheGreatDuck - podczas gdy gwoździe dziewięciocalowe byłyby oczywiście całkowicie rozsądne.
@TheGreatDuck: Mówię mojej żonie, że mają gwoździe 10 ", ale tak naprawdę to tylko 8,5".
@PieterGeerkens: I dlatego nie może parkować równolegle.
@PieterGeerkens, który wciąż jest zbyt optymistyczny ...;)
schroeder
2017-05-02 14:08:08 UTC
view on stackexchange narkive permalink

Bezpieczeństwo dzięki zaciemnianiu ma w najlepszym przypadku ograniczoną skuteczność - aby określić, czy jest odpowiednie, musisz zrozumieć, jakie zagrożenia chcesz przeciwdziałać. Jeśli osoba będąca zagrożeniem może bezpośrednio odczytać Twoją bazę danych, jakie korzyści daje ukrycie określonego przechowywanego szczegółu?

Jeśli istnieje korzyść z zaciemnienia (upewnij się, że możesz to naprawdę udowodnić), zastosuj rodzaj zaciemniania, który odnosi się do tego zagrożenia (zaszyfrowane wartości, źródła danych off-line, haszowanie itp.).

bdsl
2017-05-03 02:12:49 UTC
view on stackexchange narkive permalink

Zgadzam się z Black Magic, że prawdopodobnie nie warto tego robić, ale jeśli chcesz, możesz użyć funkcji wyprowadzania klucza, aby utworzyć klucz szyfrowania na podstawie hasła i użyć go do zaszyfrowania treści w kolumnie Status.

Potencjalnie stan musiałby być przechowywany w pamięci dla wszystkich otwartych sesji użytkownika, więc mogą one nadal być narażone na atak.

Oznaczałoby to, że mają te same ograniczenia co osoba atakująca, zakładając, że nie znasz haseł użytkowników. Nie byłbyś w stanie odczytać statusu z bazy danych, a gdybyś chciał zmienić status użytkownika, musiałbyś jednocześnie zmienić jego hasło.

Właściwie możesz zmienić status na non-admin bez znajomości hasła - po prostu wprowadź jakąś losową wartość w polu i polegaj na praktycznie zerowym prawdopodobieństwie, że może się to zdarzyć, aby dopasować szyfrogram dla „admin”.Kod, który to czyta, musiałby tolerować nieoczekiwane wartości.
Możesz też mieć kolumnę bazy danych „newStatus” i ustawić ją w postaci zwykłego tekstu, a następnie wyczyścić ją, gdy użytkownik się zaloguje i zaktualizujesz stan zaszyfrowania.
Oznacza to również, że nie możesz mieć funkcji odzyskiwania hasła bez utraty statusu konta.
Słuszna uwaga, @MichaelKjörling, który prawdopodobnie złamałby umowę.
phyrfox
2017-05-03 00:34:18 UTC
view on stackexchange narkive permalink

Wiele nowoczesnych systemów faktycznie oddziela login użytkownika (sposób uwierzytelniania) od jego „profili” (posiadanych uprawnień), zaimplementowanych jako dwa lub więcej odrębnych systemów. Twój serwer logowania może mieć tylko identyfikator GUID, zaszyfrowaną nazwę użytkownika i zaszyfrowane hasło; po pomyślnym zalogowaniu przenieś sesję na serwer aplikacji. Dopóki serwer aplikacji nie jest zagrożony, baza danych logowania jest bezużyteczna, nawet jeśli zostanie zrzucona.

Jako dodatkowy krok możesz również zaszyfrować dane użytkownika za pomocą klucza z serwera logowania (przechowywanego jako część sesji), dzięki czemu serwer aplikacji jest również bezpieczniejszy. Dwa systemy są zazwyczaj trudniejsze do pokonania niż jeden. Jeśli jednak nie chcesz konfigurować dwóch serwerów (lub klastrów), a wszystko to wydaje się zbyt dużym nakładem pracy, prawdopodobnie i tak będzie lepiej, jeśli masz obecny projekt. Sama wiedza, na które konta kierować reklamy, nie ułatwia pracy; jeśli atakujący może złamać jeden, może złamać je wszystkie przy użyciu obliczeń równoległych.

satibel
2017-05-04 11:53:13 UTC
view on stackexchange narkive permalink

Sugestią ze strony PlasmaHH było: „dołączenie litery przed hasłem po zaszyfrowaniu (w rzeczywistości wiele liter, był to„ identyfikator grupy ”) i wypróbowanie wszystkich kombinacji przez mechanizm uwierzytelniania.”

Chociaż jest to w pewnym stopniu zabezpieczenie przez zaciemnienie i wymaga połączenia z dobrymi praktykami, takimi jak:

  • silny czynnik pracy na bcrypt
  • administratorzy mający silne hasło
  • sposoby zapobiegania posiadaniu przez napastnika kopii bazy danych w pierwszej kolejności

Jest to dobry sposób na spowolnienie atakującego na tyle, aby hasło jest zmieniane, zanim zostanie znalezione.

Złamanie jednego nietrywialnego hasła (zakładając, że użyłeś silnego czynnika pracy) może zająć od kilku dni do kilku miesięcy, więc jest to wykonalne, ale jeśli tego nie zrobią aby wiedzieć, które konto jest warte włamania, to sprawia, że ​​muszą zhakować każde konto.

Więc jeśli nie mają szczęścia lub nie nazwaliście konta administratora „admin”, będą musieli wypróbować wiele kont, co będzie spraw, aby ich koszt wynosił co najmniej jedno zamówienie mag większa, sprawiając, że atakujący albo czeka dłużej, kupuje więcej mocy, albo poddaje się.

Podsumowując, nie jest to bezwartościowe, ponieważ jest tanim środkiem odstraszającym, który nie przeszkadza użytkownikowi.

Pamiętaj, że jeśli masz wskazówki, że ktoś jest administratorem, na przykład post od kogoś innego edytowanego przez niego (jeśli tylko administratorzy mogą to zrobić), maskowanie jego statusu w bazie danych jest bezużyteczne.

Jak wspominali inni, może to na przykład uniemożliwić utworzenie administratora użytkownika bez zmiany lub przynajmniej pytania o jego hasło.

Jeśli to możliwe, żądanie uwierzytelnienia dwuetapowego dla administratorów byłoby prawdopodobnie lepszym rozwiązaniem sposób na zabezpieczenie kont administratora.

sebastian nielsen
2017-05-04 19:00:53 UTC
view on stackexchange narkive permalink

Tak, po prostu dodaj status administratora jako część hasła.

na przykład: HereIsMe! 65371 = adminHereIsMe! 65370 = zwykłe

Następnie przy logowaniu spróbuj najpierw zwykłego następnie admin, w ten sposób:

  if (sha512 ($ password. "0") eq $ hash) {blabla user functions} else {if (sha512 ($ password. "1") eq $ hash) {funkcje administratora blabla} else {wyświetla komunikat o nieprawidłowym haśle}}  

WAŻNE: Upewnij się, że ktoś nie może edytować ostatniego znaku własnego hasła. Np. Upewnij się, że formularz rejestracyjny, formularz zapomnienia hasła i formularz zmiany hasła, zawsze dodawaj 0 lub 1 na końcu hasła w zależności od ich rzeczywistego statusu.Przechowuj status w sesji po stronie serwera, najlepiej zaszyfrowanej za pomocą klienta plik cookie sesji bocznej.

To praktycznie uniemożliwia wywnioskowanie statusu administratora bez pomyślnego złamania hasła.

Znajomość schematu i szukanie jedynek psuje system - jeśli masz oddzielną tabelę zawierającą listę administratorów, dlaczego nie użyć tego zamiast manipulować hasłami?a jeśli masz tę tabelę, w jaki sposób chronisz ją przed odczytaniem razem z tabelą wymienioną w pytaniu?
jest to również bardzo podobne do odpowiedzi Satibel
W jaki sposób?1 to zaszyfrowana część hasła.Tak, możesz powiedzieć swojemu hashcrackerowi, aby dołączył 1 do hasła, ale nadal nie wiesz, które konto jest admin, więc nadal będziesz musiał złamać wszystkie konta.
Jeśli loguję się jako administrator, skąd system ma wiedzieć, aby dodać 1 do mojego hasła przed zhaszowaniem?
@schroeder Tak długo, jak hash (hasło + '0')! = Hash (hasło + '1') to będzie działać dobrze, chociaż może się wydawać bardzo niebezpieczne, żeby się nie udało.Oznacza to, że nie możesz zresetować hasła użytkownika bez zresetowania jego praw dostępu i podobnych problemów.
@schroeder Jeśli sprawdzisz przykładowy kod, zobaczysz, że najpierw spróbuje zalogować się jako zwykły użytkownik, jeśli nie zgadza się hash, przetestuje administratora.Sztuczka polega na tym, że nie można wcześniej wiedzieć, który użytkownik jest administratorem, bez znajomości jego hasła.
@Voo Tak, masz prawdę, że nie możesz zrobić "zapomniałem hasła" dla użytkownika bez zresetowania jego praw administratora.Ale hej, to w rzeczywistości dobra funkcja bezpieczeństwa, ponieważ jeśli ktoś włamie się do funkcji resetowania hasła, na przykład przez zhakowanie konta e-mail, prawa administratora są nadal bezpieczne.Przy zmianie hasła wiesz już przez sesję, czy zalogowanym użytkownikiem jest admin, czy użytkownik.
Tak więc dodanie 0 dla użytkowników nie jest konieczne, możesz po prostu dodać 1 dla administratorów, ale skąd system wie, że użytkownik powinien w pierwszej kolejności dodać ten dodatkowy bit?Dlaczego nie zakodować skrótu administratora do przykładowego kodu?Twoja sugestia wydaje się nie do utrzymania i na pewno nie da się skalować.
@schroeder Konieczne jest dodanie 0 do użytkowników, w przeciwnym razie istnieje ryzyko, że użytkownik doda 1 do swojego hasła i zostanie administratorami.Zakodowując na stałe skrót administratora, możesz wywnioskować administratora, patrząc na kod + db.Ale z moim pomysłem nie można wywnioskować, kto jest administratorem, nawet mając dostęp do obu.Możesz spróbować złamać hasło i sprawdzić, czy 0 lub 1 pasuje do skrótu.
@schroeder Co nie jest skalowalne w rozwiązaniu?Możesz rozszerzyć to na dowolną liczbę uprawnień, nawet zezwalając na flagi bitowe.Jest raczej kruchy i ma pewne wady, ale rozwiązuje dany problem.
Innym problemem związanym z takimi rozwiązaniami jest to, że trudno jest zaimplementować interfejs dla administratorów wyższego poziomu w celu odebrania statusu administratora innym użytkownikom, którzy stają się problematyczni w locie, ponieważ każda rozsądna implementacja tego przechowywałaby tylko sam status administratora w danych sesjilogin i dlatego nie mógł sprawdzić ról w każdym odpowiednim żądaniu, dlatego cofnięcie dostępu administratora wymaga wymuszonego usunięcia danych sesji logowania, aby użytkownik musiał się ponownie zalogować.
To jedyna odpowiedź, która właściwie odpowiada na pytanie.
cybernard
2017-05-04 06:19:08 UTC
view on stackexchange narkive permalink

Jeśli Twoja baza danych to obsługuje, skonfiguruj LDAP lub podobny serwer uwierzytelniania, a następnie poświadczenia nie będą przechowywane lokalnie.

Pytanie dotyczy ukrywania autoryzacji, a nie uwierzytelniania - i umożliwienie odpytywania ze zdalnego źródła może pogorszyć sytuację, jeśli nie zostanie poprawnie zaimplementowane (informacje autoryzacyjne muszą być dostępne tylko po pomyślnym uwierzytelnieniu!)
@rackandboneman Wspomniany serwer nie będzie miał poświadczeń na serwerze, więc zostaną one ukryte.Jeśli masz własną sieć i udostępniasz serwer uwierzytelniający w Internecie, zasługujesz na włamanie.Oczywiście musisz użyć 2048 bitów TLS lub więcej i bla bla lub cokolwiek na to pozwala.
S.C.
2017-05-05 09:50:49 UTC
view on stackexchange narkive permalink

Jest tu kilka interesujących sugestii technicznych, ale należy wspomnieć, że nawet jeśli zastosujesz je perfekcyjnie, to podejście dosłownie nic nie da w przypadku włamania z następujących powodów:

  • Jeśli ktoś ma dostęp do bazy danych (chociażby wstrzyknięcie sql lub coś w tym rodzaju), jest pewne, że może robić na serwerze, co tylko zechce, z uprawnieniami dowolnego użytkownika, na którym działa Twoja usługa bazy danych, ponieważ większość systemów zarządzania bazami danych zapewniają funkcjonalność do manipulowania plikami i uruchamiania procesów na ich hoście. Oznacza to, że intruz może modyfikować strony internetowe lub przetwarzanie po stronie serwera, aby przechwytywać hasła w postaci zwykłego tekstu podczas logowania i bardzo szybko uzyskiwać niezaszyfrowane hasła dla aktywnych użytkowników. Zakładam, że Twoje konto administratora jest aktywnym użytkownikiem.
  • Jeśli ktoś uzyska dostęp do skrótów Twojego hasła, prawdopodobnie nie wybierze, które z nich powinien najpierw spróbować złamać. Po prostu uruchomią narzędzie do łamania zbiorczego, aby przetworzyć je wszystkie naraz, a przy każdym przebiegu będzie sprawdzać wszystkie skróty w przetwarzanej tabeli.
  • Nawet jeśli trzymasz skrót hasła administratora osobnej tabeli lub całkowicie poza bazą danych, włamanie do mniej uprzywilejowanych kont prawdopodobnie doprowadzi do eskalacji uprawnień, o ile włamanie pozostanie niewykryte, ponieważ intruz będzie mógł podszywać się pod zaufanych użytkowników, aby uzyskać dostęp do większej ilości informacji (używając moderatora, aby porozmawiać z administratorem i rozpocząć na przykład kradzież plików cookie lub inną złośliwą aktywność).
  • Jeśli Twoja witryna ma jakieś funkcje społecznościowe, jest bardzo prawdopodobne, że już ujawnia inne sposoby identyfikacji użytkowników administracyjnych.
Raphael Marco
2017-05-02 20:26:28 UTC
view on stackexchange narkive permalink

Jeśli atakujący uzyskał dostęp do bazy danych, może po prostu stworzyć własny skrót bcrypt i zastąpić ten z bazy danych. Nie ma potrzeby łamania haszu.

Nie, gdyby mieli tylko uprawnienia do odczytu lub np.zrzut danych czy coś.
Ponadto - nawet jeśli mają dostęp do zapisu, nie pomogłoby im to wstawić losowych skrótów bcrypt do bazy danych.Musieliby zrozumieć kryptografię systemu autoryzacji, aby akceptował skróty, a jeśli mogą to zrobić, mogą po prostu znacznie łatwiej odszyfrować istniejące skróty.
Nie odpowiada na pytanie.Nawet jeśli to, co proponujesz, jest prawdą, atakujący musiałby wiedzieć, który z nich zastąpić.
@KernelStearns Nawet ja znam kryptografię oryginalnego schematu.Wystarczy spojrzeć na haszysz.Jest to bcrypt z kosztem 10.
@Schroeder Potrafi zamienić wszystkie skróty w tabeli (jeśli ma uprawnienia do zapisu), więc myślę, że jest to poprawna odpowiedź na pytanie.
@AjayBrahmakshatriya tylko wtedy, gdy napastnik chce ogłosić się tak głośno.Jeśli atakujący chce być bardziej taktyczny (i cichy), ważne jest, aby wiedzieć, które konto jest celem.Więc nie, ta odpowiedź * omija i odrzuca * pytanie, nie odpowiada na nie.
@Schroeder Chodziło mi o to, że mógłby zastąpić jeden po drugim (i zamienić z powrotem, jeśli nie jest adminem).Jest to o wiele łatwiejsze niż próba złamania każdego skrótu jeden po drugim.Więc ukrycie statusu administratora tak naprawdę nie działa, jeśli atakujący ma dostęp do zapisu w tej tabeli.
@AjayBrahmakshatriya dla systemu z tysiącami użytkowników, to sporo pracy.


To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...