Jak bezpiecznie wdrożyć automatyczne logowanie

15

Przeczytałem wiele, wiele, wiele postów o tym, jak „prawdopodobnie źle przechowujesz hasła”. Zawsze odnoszą się do przechowywania haseł na serwerze, na którym loguje się użytkownik; w zasadzie odmieniają (zamierzone słowa) wszechobecne porady, takie jak upewnij się, że słone hasła itp. itp. Jednak nigdy nie widziałem artykułu na temat najlepszych praktyk dotyczących przechowywania haseł na kliencie, aby klient nie musiał się logować ręcznie za każdym razem, gdy chcą się zalogować; funkcja „zapamiętaj mnie”.

Wiele programów ma tę funkcję, od przeglądarek po programy takie jak Dropbox.

Czytałem niedawno stary artykuł o tym, jak Dropbox przechowywał identyfikator na twoim komputerze, który możesz po prostu skopiować / wkleić na innym komputerze i uruchomić Dropbox i zalogować się jako urządzenie, z którego masz identyfikator; bez logowania, bez niczego i pełny dostęp do konta Dropbox. Wygląda to na naprawdę głupi projekt, ale nie mogę wymyślić lepszego sposobu na zrobienie tego.

Nie jestem nawet pewien, jak uniknąć przechowywania czegoś takiego jak plik cookie w postaci zwykłego tekstu. Jeśli go zaszyfrujesz, gdzie przechowujesz klucz, aby go odszyfrować?

Jedyny sposób, w jaki widzę, aby nie wprowadzać luk w zabezpieczeniach, to usunięcie funkcji autologin i zmuszenie użytkownika do wpisania hasła za każdym razem, gdy chce skorzystać z usługi, ale jest to walka o użyteczność i użytkownicy są zepsute, że nie będą musieli tego robić.

Co mogę przeczytać na temat bezpiecznego przechowywania lokalnych poświadczeń w celu wdrożenia funkcji automatycznego logowania? Jeśli zasady są zbyt proste dla całego artykułu, jakie one są? Oprogramowanie, o którym mowa, nie powinno zależeć od funkcji nieobecnych na wszystkich platformach (takich jak „pęku kluczy”, które mają niektóre dystrybucje linuksa).

Jay Simon
źródło
2
Chodzi o to, czemu ufasz. Jeśli nie ufasz maszynie, przechowuj identyfikator, to jest twój problem. Jeśli ufasz pęku kluczy, to uzyskasz maksymalne bezpieczeństwo. Oczywiście możesz dodać niestandardowe bezpieczeństwo, takie jak wykrywanie sprzętu urządzenia lub coś takiego, ale wszystko to jest fałszywe, więc nie możesz w końcu wiedzieć. To jest poza twoją kontrolą. Oczywiście wykluczone są głupie rzeczy, takie jak zapisywanie haseł tekstowych.
Luc Franken
@LucFranken jak możesz zaufać maszynie? Ktoś może cię wykorzystać, tak jak to zrobił Dropbox. Również zaufałbym pęku kluczy, ale nie wszystkie komputery mają jeden, a system Windows nigdy tego nie robi (AFAIK). A jeśli przechowujesz hasła, jak uniknąć ich zapisywania w postaci zwykłego tekstu? Jeśli je zaszyfrujesz, to gdzie przechowujesz klucz, aby go odszyfrować?
Jay Simon
To jest dokładnie problem, nie możesz mu ufać. Użytkownik może tylko zdefiniować, aby mu zaufać. Biorąc to pod uwagę, użytkownik rozumie, jak bezpieczne jest jego urządzenie. Napisz wirusa, który pobiera dane z Dropbox jest po prostu możliwe. To samo z lokalnie przechowywanymi kluczami i innymi lokalnymi danymi. Możesz pomóc uczynić go bardziej bezpiecznym (pomyśl o aplikacjach, które wymagają kodu 5-cyfrowego), ale ostatecznie jest lokalny i poza twoją kontrolą.
Luc Franken
@LucFranken to tylko ja, czy autologin wydaje się być wszechobecną funkcją? Jeśli tak, dlaczego ludzie nie napisali o tym, jak zrobić to dobrze?
Jay Simon
Jest to tak powszechny wymóg, chociaż nie pozwala na to więcej oprogramowania korporacyjnego. Na przykład SalesForce pozwala zapisać tylko nazwę użytkownika, a nie hasło. Wyjaśnijmy btw. że nie musisz przechowywać hasła na kliencie, aby się zalogować. Możesz przechowywać losowy skrót, który odpowiada skrótowi na serwerze.
Luc Franken

Odpowiedzi:

12

Jednym ze sposobów jest:

  • Gdy użytkownik się zaloguje, zapisz identyfikator sesji w pliku cookie na komputerze klienta (nie nazwę użytkownika ani hasło).
  • Powiąż sesję z adresem IP, więc indywidualny identyfikator sesji działa tylko z komputerem, na którym został uruchomiony.

W zależności od tego, jakiego frameworku używasz do tworzenia witryny, takie zachowanie może być dostępne jako funkcja wbudowana.

Zauważ, że ponieważ protokół HTTP i tak jest bezstanowy, tak naprawdę nie ma funkcjonalnej różnicy między utrzymywaniem kogoś zalogowanego podczas jednej sesji korzystania ze strony internetowej a „automatycznym logowaniem” przy następnym użyciu strony; zależy tylko od tego, ile czasu pozostało do wygaśnięcia sesji.

Aktualizacja: Oczywiście użyj HTTPS dla zwiększenia bezpieczeństwa.

Aktualizacja 2: Pamiętaj, że to podejście ma ograniczenia, ponieważ nie działa dobrze dla użytkowników, którzy często zmieniają adres IP. Zapewnia jednak wyższy poziom bezpieczeństwa i może być przydatny w niektórych sytuacjach.


źródło
1
Powiązanie go z adresem IP niewiele pomaga, ponieważ ktoś może mieć komputer za tą samą zaporą ogniową, co Ty.
Jay Simon
2
@JaySimon, nie powiedziałbym, że „niewiele pomaga”. Liczba komputerów za tą samą zaporą ogniową jest znacznie mniejsza niż liczba komputerów na świecie. Chodzi o ograniczenie potencjalnej ekspozycji na atak, a to znacznie go ogranicza. Jest to standardowe podejście i naprawdę nie sądzę, że można wiele więcej zrobić. Jeśli ktoś ma ten sam adres IP co użytkownik i uda mu się uzyskać identyfikator sesji, osoba ta będzie nie do odróżnienia od użytkownika z perspektywy serwera. Jeśli masz jakieś logowanie na swojej stronie, jesteś narażony na taki atak.
3
Czy uważasz, że takie podejście będzie denerwujące dla użytkowników telefonów komórkowych, których adres IP może się często zmieniać?
Jay Simon
@JaySimon, jeśli zdarzy się to w trakcie sesji, użytkownik odczuje to jako nagłe wylogowanie, co z pewnością byłoby denerwujące. Nie wiem jednak, jak często się zmieniają (szybkie wyszukiwanie w Google nie ujawnia ostatecznej odpowiedzi). Nie martwiłbym się tym zbytnio, chyba że IP prawdopodobnie ulegnie zmianie, podczas gdy faktycznie z niego korzystają.
Ograniczenie sesji do adresu IP nie jest tak realistyczne, jak powiedziano. Użytkownicy często zmieniają lokalizację. Z telefonami komórkowymi, ale także z laptopami; na przykład praca elastyczna. Najlepsze, co możesz zrobić, to połączenie kontroli GeoIP z czasem na pokonanie tej odległości; jak Gmail.
Lode,
5

Amazon (i wiele innych) stosuje podejście hybrydowe. Zapewniają one automatyczne przeglądanie, dodawanie produktów do koszyka i składanie zamówień przy użyciu kombinacji adresów pod opieką / adresu wysyłki, które były używane wcześniej. Wymagają one jednak podania hasła do wielu działań, takich jak dodawanie kart kredytowych, dodawanie / zmiana adresów wysyłki, aktualizacja haseł, przeglądanie wcześniejszych zamówień (opcjonalnie dla użytkownika) i wiele innych ustawień konta.

Tak, ludzie, którzy uzyskają dostęp do twojego komputera, mogą przejąć twoją sesję, ale nadal dostajesz to, co zamawiają! (Co ważniejsze, motywacja do przejęcia sesji jest prawie całkowicie zanegowana.) Ale jeśli ktoś ma dostęp do mojego komputera, mam większe problemy niż ludzie kradnący przeciętne sesje witryny.

Jeśli masz części aplikacji, które nie wymagają tak wysokiego poziomu bezpieczeństwa, możesz wybrać model hybrydowy, w którym przechowujesz identyfikator sesji (skrót lub cokolwiek, jeśli chcesz), aby automatycznie logować użytkowników do części witryny o niskim poziomie bezpieczeństwa , ale wymagają od nich podania hasła po wejściu do obszarów o wyższym poziomie bezpieczeństwa i usunięcia tokena o wysokim poziomie bezpieczeństwa po zakończeniu sesji.

Oczywiście, jeśli jest to strona na poziomie bankowym, automatyczne logowanie nie jest opcją. Ponownie, witryny korzystające z tego rodzaju zabezpieczeń przyjmują wartość danych, które chronią, a dodatkowa wygoda dla użytkownika waży potencjalne ryzyko przejęcia sesji. Jeśli uważasz, że nie dotyczy to Twojej aplikacji, nie wdrażaj automatycznego logowania. Musisz uzyskać dostęp do tego, jaki poziom kompromisów w zakresie bezpieczeństwa / użyteczności jest odpowiedni dla danego przypadku użycia.

Eric G.
źródło
2

To nie jest wcale takie trudne. Najpierw zapisz plik cookie w tym formacie:

userID.token

Możesz użyć skrótu sha1 dla tokena. Następnie w identyfikatorze użytkownika sklepu z pamięcią tabeli baz danych Remember_me_tokens znajduje się skrót bcrypt tokena i godzina wygenerowania tokena.

Następnie, gdy ktoś odwiedza Twoją witrynę, sprawdź, czy plik cookie jest ustawiony. Jeśli plik cookie jest ustawiony, sprawdź, czy w bazie danych jest prawidłowy wiersz w ciągu ostatnich 7 dni. Jeśli w bazie danych znajduje się poprawny wiersz dla pliku cookie, ustaw sesję, aby wskazać, że użytkownik jest zalogowany, a także usuń dopasowany wiersz pliku cookie / bazy danych i wygeneruj nowy wiersz pliku cookie / tokena / bazy danych.

Jeśli się wylogują, usuń plik cookie.

Uruchom zadanie cron, aby przyciąć Remember_me_tokens, które są starsze niż powiedzmy 7 dni.

Ryan
źródło
Co uniemożliwia komuś skopiowanie tego klucza i wklejenie go na komputerze oraz uzyskanie dostępu do konta bez nazwy użytkownika i hasła?
Jay Simon
jak zdobędziesz klucz? jest przechowywany lokalnie na czyimś komputerze.
Ryan
podchodzisz do komputera i otwierasz plik, w którym jest przechowywany :)
Jay Simon
2
@JaySimon Ten sam argument można postawić komuś, kto się zaloguje i odejdzie na 5 minut bez blokowania komputera lub kliknie Zapamiętaj mnie i ktoś wskoczy na hasło do swojego konta. Jeśli możesz zaakceptować tę możliwą sytuację bezpieczeństwa, wygoda jest przyjemna, ale dlatego nie widzisz funkcji Zapamiętaj mnie na liście CIA NOC :) Serwer musi dać ci jakiś token, który klient musi przechowywać w systemie plików. Jednak z perspektywy serwera nie jest już w twoich rękach.
wałek klonowy
@maple_shaft dlaczego ktoś był zaskoczony, że możesz to zrobić na Dropbox? (Połączyłem to w swoim pytaniu.)
Jay Simon
0

Możesz to zrobić tylko wtedy, gdy ufasz urządzeniu, w którym je przechowujesz. To, czy jest ono bezpieczne, zależy od użytkownika (jeśli nie możesz wpłynąć na urządzenie). To jest po prostu z twoich rąk.

Jak stwierdzono w komentarzach:

Chodzi o to, czemu ufasz. Jeśli nie ufasz maszynie, przechowuj identyfikator, to jest twój problem. Jeśli ufasz pęku kluczy, to uzyskasz maksymalne bezpieczeństwo. Oczywiście możesz dodać niestandardowe bezpieczeństwo, takie jak wykrywanie sprzętu urządzenia lub coś takiego, ale wszystko to jest fałszywe, więc nie możesz w końcu wiedzieć. To jest poza twoją kontrolą.

Luc Franken
źródło