Jaka jest najlepsza metoda przeciwdziałania Brute Force?

Najpierw trochę tła: nie jest tajemnicą, że implementuję system auth+auth dla CodeIgniter i jak na razie wygrywam (że tak powiem). Ale napotkałem dość nietrywialne wyzwanie (takie, którego większość bibliotek auth całkowicie pomija, ale nalegam na właściwe obchodzenie się z nim): jak inteligentnie radzić sobie z atakami brute-force na dużą skalę, rozproszonymi, o zmiennej nazwie użytkownika.

Znam wszystkie zwykłe sztuczki:

  1. ograniczenie # nieudanych prób na IP / host i odmawianie dostępu przestępcom ( np. Fail2Ban) - co już nie działa , ponieważ botnety stały się mądrzejsze
  2. połączenie powyższego zczarną listą znanych "złych" adresów IP/hostów (np. DenyHosts) - która polega na botnetach spadających na #1, których coraz częściej nie
  3. W przeciwieństwie do tradycyjnych auth (niestety bezużytecznych z dynamicznymi użytkownikami IP i wysokim churnem na większości stron internetowych), nie jest to możliwe.]}
  4. ustawienie a sitewide ograniczenie do liczby nieudanych prób w ciągu N minut / godzin i dławienie (wstrzymywanie) wszystkich prób logowania po tym przez kilka minut / godzin (z problemem, że DoS atakuje cię, staje się dziecinną grą botnetu)
  5. obowiązkowe podpisy cyfrowe (certyfikaty klucza publicznego) lub tokeny sprzętowe RSA dla wszystkich użytkowników bez opcji login/hasło (bez wątpienia solidne rozwiązanie, ale praktyczne tylko dla zamkniętych, dedykowanych usług)
  6. ultra-strong Schematy haseł (np. >25 nonsensownych znaków z symbolami - znowu zbyt niepraktyczne dla zwykłych Użytkowników)
  7. Na koniec, CAPTCHAs (które mogą działać w większości przypadków, ale są denerwujące dla użytkowników i praktycznie bezużyteczne przeciwko zdeterminowany, zaradny atakujący )

To tylko teoretycznie możliwe do zrealizowania pomysły. Istnieje mnóstwo bzdurnych pomysłów, które rozwalają witrynę (np. banalne ataki DoS). To czego chcę to coś lepszego. A przez lepsze mam na myśli:

  • Musi być zabezpieczony ( + ) przed atakami DoS i brute-force i nie wprowadzać żadnych nowych luk, które mogłyby pozwolić nieco sprytniejszemu botowi kontynuować działanie pod radarem

  • To musi być zautomatyzowane. Jeśli wymaga od ludzkiego operatora weryfikacji każdego logowania lub monitorowania podejrzanej aktywności, nie będzie działać w realnym scenariuszu

  • Musi być wykonalne dla powszechnego użytku internetowego(tj. wysoka tworzenie, duża objętość i otwarta Rejestracja, które mogą być wykonywane przez nie-programistów)

  • Nie może to utrudnić doświadczenia użytkownika do punktu, w którym zwykli użytkownicy będą zirytowani lub sfrustrowani (i potencjalnie porzucą witrynę)

  • Nie może dotyczyć kociąt, chyba że są one naprawdę bardzo bezpieczne kocięta

(+) Przez "Bezpieczne" mam na myśli co najmniej tak samo bezpieczne, jak zdolność paranoicznego użytkownika do zachowania swojego hasła w tajemnicy

Więc - posłuchajmy! Jak byś to zrobił? Czy znasz najlepszą praktykę, o której nie wspomniałem (proszę, powiedz, że tak)? Przyznam, że mam własny pomysł( łącząc pomysły z 3 i 4), ale pozwolę prawdziwym ekspertom mówić, zanim się zawstydzę ;-)

Author: Jens Roland, 2009-01-26

17 answers

Dobra, dość przeciągania; oto co wymyśliłem do tej pory

(sorry, long post przed nami. Bądź dzielny, przyjacielu, podróż będzie tego warta)

Łączenie metod 3 i 4 z oryginalnego postu w rodzaj "rozmytej" lub dynamicznej białej listy, a następnie - i oto sztuczka - nie blokowanie Nie-białych adresów IP, po prostu Dławienie ich do piekła iz powrotem.

Zauważ, że ta miara jest tylko przeznaczona do udaremnienia tego bardzo specyficznego typu do ataku. W praktyce, oczywiście, będzie to działać w połączeniu z innymi najlepszymi praktykami podejścia do auth: stałe Dławienie nazwy użytkownika, Dławienie na adres IP, wymuszona kodem silna Polityka haseł, niezakłócone logowanie plików cookie, haszowanie wszystkich odpowiedników haseł przed ich zapisaniem, nigdy nie używaj pytań bezpieczeństwa itp.

Założenia dotyczące scenariusza ataku

Jeśli atakujący atakuje zmienną nazwę użytkownika, nasze Dławienie nazwy użytkownika nie uruchamia się. Jeśli atakujący używa botnet lub ma dostęp do dużego zasięgu IP, nasze Dławienie IP jest bezsilne. Jeśli atakujący wstępnie zeskrobał naszą listę użytkowników (zwykle jest to możliwe w serwisach internetowych o otwartej rejestracji), nie możemy wykryć trwającego ataku na podstawie liczby błędów "nie znaleziono użytkownika". A jeśli wyegzekwujemy restrykcyjne Dławienie całego systemu (wszystkie nazwy użytkowników, wszystkie adresy IP), każdy taki atak spowoduje obsłużenie całej naszej witryny przez czas trwania ataku plus okres dławienia.

Więc musimy zrobić coś innego.

Na pierwsza część przeciwdziałania: Whitelisting

Możemy być dość pewni, że atakujący nie jest w stanie wykryć i dynamicznie sfałszować adresów IP kilku tysięcy naszych użytkowników(+). Co sprawia, że biała lista jest wykonalna. Innymi słowy: dla każdego użytkownika przechowujemy listę (haszowanych) adresów IP, z których użytkownik wcześniej (ostatnio) zalogował się.

Tak więc nasz schemat białej listy będzie funkcjonował jako zamknięte "drzwi wejściowe", gdzie użytkownik musi być podłączony z jeden z jego uznanych "dobrych" IP, aby w ogóle się zalogować. Atak siĹ 'owy na owe 'drzwi' byĹ ' by praktycznie niemoĺľliwy(+).

(+) o ile atakujący nie "jest właścicielem" serwera, wszystkich skrzynek naszych użytkowników lub samego połączenia-w takich przypadkach nie mamy już problemu z uwierzytelnianiem, mamy prawdziwą sytuację pull-the-plug FUBAR wielkości franczyzy

Druga część przeciwdziałania: Dławienie całego systemu nierozpoznanych IPs

Aby biała lista działała dla usługi internetowej o otwartej rejestracji, w której użytkownicy często przełączają Komputery i / lub łączą się z dynamicznych adresów IP, musimy zachować 'cat door' otwarte dla użytkowników łączących się z nierozpoznanych adresów IP. Sztuczka polega na zaprojektowaniu tych drzwi tak, aby botnety się zacinały, a prawowici użytkownicy przeszkadzali jak najmniej .

W moim schemacie osiąga się to poprzez ustawienie bardzo restrykcyjnej maksymalnej liczby nieudanych logowań próby przez niezatwierdzone IP przez, powiedzmy, 3-godzinny okres (mądrzejsze może być użycie krótszego lub dłuższego okresu w zależności od rodzaju usługi) i wprowadzenie tego ograniczenia global, tj. dla wszystkich kont użytkowników.

Nawet powolna (1-2 minuty między próbami) brutalna siła zostanie wykryta i udaremniona szybko i skutecznie za pomocą tej metody. Oczywiście, naprawdę powolna brutalna siła może pozostać niezauważona, ale zbyt powolna prędkość pokonuje cel brutalnej siły do ataku.

To, co mam nadzieję osiągnąć z tym mechanizmem dławienia, to to, że jeśli zostanie osiągnięty maksymalny limit, nasze "drzwi dla kota" zamkną się na chwilę, ale nasze drzwi wejściowe pozostają otwarte dla legalnych użytkowników łączących się zwykłymi środkami: {]}

  • albo przez połączenie z jednego z ich rozpoznanych adresów IP
  • Pliki cookies wykorzystywane są w celu świadczenia usług na najwyższym poziomie.]}

Jedynymi uprawnionymi użytkownikami, których dotyczy atak-czyli podczas gdy Dławienie było aktywowane-będą to użytkownicy bez trwałych plików cookie logowania, którzy logowali się z nieznanej lokalizacji lub z dynamicznym adresem IP. Ci użytkownicy nie będą mogli się zalogować, dopóki nie ucichnie Dławienie (co może potrwać chwilę, jeśli atakujący nadal będzie działał botnet pomimo dławienia).

Aby umożliwić tej małej grupie użytkowników przeciśnięcie się przez zamknięte w inny sposób drzwi dla kota, nawet gdy boty wciąż uderzały w nie, użyłbym "kopii zapasowej" formularza logowania z CAPTCHA. Aby po wyświetleniu komunikatu "Sorry, but you can' t login from this IP address at the moment" dodać link z napisem " secure backup login - tylko dla ludzi (boty: no lying)". Żarty na bok, gdy klikną ten link, daj im uwierzytelniony przez reCAPTCHA formularz logowania, który omija Dławienie całej witryny. W ten sposób, jeśli są ludźmi i znają poprawny login+hasło (i są w stanie odczytać CAPTCHAs), nigdy nie zostaną zablokowani, nawet jeśli łączą się z nieznanego hosta i nie używającego pliku cookie autologin.

Aha, i tak dla jasności: ponieważ uważam CAPTCHAs za ogólnie zły, opcja 'backup' logowania pojawiłaby się tylko podczas gdy Dławienie było aktywne.

Nie da się zaprzeczyć, że taki trwały atak nadal stanowiłby formę ataku DoS, ale z opisanym systemem, wpłynąłby tylko na to, co podejrzewam, że jest małą podgrupą użytkowników, a mianowicie ludzi, którzy nie używają "remember me" cookie i zdarza się, że logują się podczas ataku i nie logują się z żadnego ze swoich zwykłych adresów IP i którzy nie mogą odczytać captcha. Tylko ci, którzy mogą odmówić wszystkim tym kryteriom - w szczególności botom i naprawdę pechowym osobom niepełnosprawnym - zostaną odrzuceni podczas ataku bota.

edytuj: Actully, pomyślałem o sposobie, aby nawet użytkownicy z CAPTCHA mogli przejść przez "blokadę": zamiast, lub jako uzupełnienie, kopii zapasowej CAPTCHA login, Udostępnij użytkownikowi opcję jednorazowego, specyficznego dla użytkownika kodu blokującego wysłanego na jego e-mail, który może następnie wykorzystać do obejścia dławienia. To zdecydowanie przekracza mój próg "irytacji" , ale ponieważ jest używany tylko jako Ostatnia deska ratunku dla małej grupy użytkowników, a ponieważ nadal bije się z zablokowaniem konta, byłoby to dopuszczalne.

(zauważ również, że żaden nie dzieje się tak, jeśli atak jest mniej skomplikowany niż paskudna rozproszona wersja, którą opisałem tutaj. Jeśli atak pochodzi z kilku adresów IP lub uderza tylko w kilka nazw użytkowników, zostanie udaremniony znacznie wcześniej, a z nie. site-wide consequences)


Tak więc, to jest środek zaradczy, który będę wdrażał w mojej bibliotece auth, kiedy będę przekonany, że to dźwięk i że nie ma dużo prostszego rozwiązania, które przegapiłem. Faktem jest, że jest tak wiele subtelnych sposobów, aby zrobić coś złego w ochronie, a ja nie jestem ponad dokonywanie fałszywych założeń lub beznadziejnie błędnej logiki. Więc proszę, wszelkie opinie, krytyka i ulepszenia, subtelności itp. są wysoko cenione.

 64
Author: Jens Roland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-28 00:51:08

Kilka prostych kroków:

Czarna lista niektórych wspólnych nazw użytkowników, i używać ich jako honeypot. Admin, gość itp... Nie pozwól nikomu tworzyć kont z tymi nazwami, więc jeśli ktoś próbuje je zalogować, wiesz, że ktoś robi coś, czego nie powinien.

Upewnij się, że każdy, kto ma realną władzę na stronie, ma bezpieczne hasło. Wymagaj od administratorów / moderatorów posiadania dłuższych haseł z mieszanką liter, cyfr i symboli. Odrzucaj banalnie proste hasła od zwykłych Użytkowników z wyjaśnieniem.

Jedną z najprostszych rzeczy, które możesz zrobić, to powiedzieć ludziom, kiedy ktoś próbował zalogować się na ich konto, i dać im link do zgłoszenia incydentu, jeśli to nie oni. Prosta wiadomość, gdy się logują, jak "ktoś próbował zalogować się na twoje konto o 4:20 W środę bla bla. / Align = "left" / "Pozwala na prowadzenie statystyk dotyczących ataków. Możesz zwiększyć środki monitorowania i bezpieczeństwa, jeśli zauważysz nagły wzrost liczby oszustw dostęp.

 16
Author: patros,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-28 01:04:32

Jeśli dobrze rozumiem działanie ataków brute force, wtedy jedna lub więcej nazw użytkowników jest próbowana w sposób ciągły.

Są dwie propozycje, których chyba jeszcze tu nie widziałem:

  • Zawsze myślałem, że standardową praktyką było mieć krótkie opóźnienie (sekundę lub więcej) po każdym błędnym logowaniu dla każdego użytkownika. To odstrasza brutalną siłę, ale nie wiem, jak długo jedno-sekundowe opóźnienie utrzyma atak słownikowy w ryzach. (słownik 10 000 słów = = 10 000 sekund == około 3 godzin. Hmm. To nie wystarczy.)
  • zamiast spowolnić całą witrynę, dlaczego nie przepustnica nazwy użytkownika. Przepustnica staje się coraz ostrzejsza z każdą błędną próbą (do limitu, tak myślę, że prawdziwy użytkownik może się zalogować)

Edit : W odpowiedzi na komentarze dotyczące przepustnicy nazwy użytkownika: jest to przepustnica specyficzna dla nazwy użytkownika bez względu na źródło ataku.

Jeśli nazwa użytkownika jest dławiona, to nawet skoordynowany atak użytkownika (multi IP, single domyślam się na IP, ta sama nazwa użytkownika) zostałaby złapana. Poszczególne nazwy użytkowników są chronione przez przepustnicę, nawet jeśli atakujący mogą swobodnie wypróbować innego użytkownika / przepustkę w czasie limitu czasu.

Z punktu widzenia atakujących, w czasie limitu czasu możesz po raz pierwszy odgadnąć 100 haseł i szybko odkryć jedno błędne hasło na konto. W tym samym okresie możesz tylko zgadywać 50 sekund.

Z punktu widzenia konta użytkownika, to nadal trwa to samo średnia liczba domysłów złamania hasła, nawet jeśli domysły pochodzą z wielu źródeł.

Dla atakujących, w najlepszym przypadku, będzie to taki sam wysiłek, aby złamać 100 kont, jak byłoby to 1 konto, ale ponieważ nie dławisz na całej stronie, możesz dość szybko przyspieszyć przepustnicę.

Dodatkowe udoskonalenia:

  • wykrywanie adresów IP, które zgadują wiele kont-408 limit czasu żądania
  • wykrywanie adresów IP, które zgadują to samo konto - 408 Request Timeout po dużej (powiedzmy 100) liczbie zgadnięć.

Pomysły UI (mogą nie być odpowiednie w tym kontekście), które mogą również udoskonalić powyższe:

  • Jeśli masz kontrolę nad ustawieniem hasła, pokazanie użytkownikowi jak silne jest jego hasło zachęca go do wybrania lepszego.
  • jeśli kontrolujesz stronę logowania , po małej (powiedzmy 10) liczbie zgadnięć pojedynczej nazwy użytkownika, zaproponuj CAPTCHA.
 11
Author: jamesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-26 23:34:26

Istnieją trzy czynniki uwierzytelniania:

  1. Użytkownik zna coś (czyli hasło)
  2. UżytkownikmA coś (czyli brelok)
  3. a user is something (ie, retina scan)

Zazwyczaj strony internetowe egzekwują tylko Politykę # 1. Nawet większość banków egzekwuje tylko Politykę 1. Zamiast tego polegają na podejściu "wie coś innego" do uwierzytelniania dwuskładnikowego. (Czyli: użytkownik zna swoje hasło i nazwisko panieńskie matki.) Jeśli jesteś w stanie, sposób dodania drugiego czynnika uwierzytelniania nie jest zbyt trudny.

Jeśli możesz wygenerować około 256 znaków losowości, możesz utworzyć to w tabeli 16×16, a następnie poprosić Użytkownika o podanie wartości w tabeli komórki a-14, na przykład. Gdy użytkownik zarejestruje się lub zmieni hasło, przekaż mu tabelę i powiedz mu, aby ją wydrukował i zapisał.

Trudność z tym podejściem polega na tym, że gdy użytkownik zapomni hasła, tak jak chce, nie można po prostu zaproponuj standard "odpowiedz na to pytanie i wpisz nowe hasło", ponieważ jest to również podatne na brute-force. Ponadto nie można go zresetować i wysłać im nowego e-maila, ponieważ ich e-mail może również zostać naruszony. (Zobacz: Makeuseof.com i ich skradzionej domeny.)

Inny pomysł (który dotyczy kociąt), to to, co Boa nazywa SiteKey (wierzę, że znakami towarowymi nazwy). Krótko mówiąc, użytkownik musi przesłać obraz podczas rejestracji, a gdy próbuje się zalogować, poproś go o wybranie swojego obraz z 8 lub 15 (lub więcej) losowych. JeĹ "li wiÄ ™ c uĺľytkownik wĹ' aduje zdjÄ ™ cie swojego kotka, teoretycznie tylko on wie dokĹ ' adnie ktĂłre zdjÄ ™ cie jest jego ze wszystkich innych kociÄ ... t (czy kwiatĂłw czy czegokolwiek). Jedynym prawdziwym vunerability to podejście ma jest man-in-the-middle attack.

Jeszcze jeden pomysł (bez kittów), to śledzenie adresów IP, z którymi użytkownicy uzyskują dostęp do systemu i wymaganie od nich dodatkowego uwierzytelniania (captcha , wybierz kitty, wybierz klucz z tej tabeli), gdy logują się z adresu, którego wcześniej nie mieli. Ponadto, podobnie jak GMail, pozwala użytkownikowi zobaczyć, gdzie ostatnio się zalogował.

Edit, New Idea:

Innym sposobem walidacji prób logowania jest sprawdzenie, czy użytkownik pochodzi z twojej strony logowania. Nie możesz sprawdzić polecających, ponieważ mogą być łatwo sfałszowane. Musisz ustawić klucz w var _SESSION, gdy użytkownik wyświetli stronę logowania, a następnie sprawdzić, czy klucz istnieje, gdy przesyła swój dane logowania. Jeśli bot nie zgłosi się ze strony logowania, nie będzie mógł się zalogować. Możesz to również ułatwić, angażując javascript w ten proces, używając go do Ustawienia pliku cookie lub dodając pewne informacje do formularza po jego załadowaniu. Możesz też podzielić formularz na dwa różne przesłania (tj. użytkownik wprowadza swoją nazwę użytkownika, przesyła, a następnie na nowej stronie wprowadza swoje hasło i przesyła ponownie.)

Klucz, w tym przypadku, jest najważniejszym aspektem. Często metoda ich generowania polega na połączeniu danych Użytkownika, jego IP i czasu ich przesłania.

 8
Author: davethegr8,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-09 12:31:15

Muszę zapytać, czy przeprowadziłeś analizę kosztów i korzyści tego problemu; brzmi to tak, jakbyś próbował chronić się przed atakującym, który ma wystarczająco dużo obecności w sieci, aby odgadnąć liczbę haseł, wysyłając może 3-5 żądań na IP(ponieważ odrzuciłeś Dławienie IP). Ile (mniej więcej) kosztowałby taki atak? Czy jest to droższe niż wartość kont, które próbujesz chronić? Ile gigantycznych botnetów chce tego, co masz?

Odpowiedź może być nie -- ale jeśli tak, mam nadzieję, że otrzymujesz pomoc od jakiegoś specjalisty ds. bezpieczeństwa; umiejętności programistyczne (i wynik StackOverflow) nie są silnie skorelowane z wiedzą na temat bezpieczeństwa.

 6
Author: ojrac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-29 21:13:54

Wcześniej odpowiedziałem na bardzo podobne pytanie w Jak mogę ograniczyć próby logowania użytkowników w PHP . Powtórzę proponowane rozwiązanie tutaj, ponieważ wierzę, że wielu z was uzna to za Pouczające i użyteczne, aby zobaczyć jakiś rzeczywisty kod. Należy pamiętać, że używanie CAPTCHA może nie być najlepszym rozwiązaniem ze względu na coraz dokładniejsze algorytmy używane w captcha busters obecnie: {]}

Nie można po prostu zapobiec atakom DoS poprzez łańcuchowe Dławienie do pojedynczy adres IP lub nazwa użytkownika. Do diabła, nie można nawet zapobiec próbom szybkiego logowania przy użyciu tej metody.

dlaczego? ponieważ atak może obejmować wiele adresów IP i kont użytkowników w celu ominięcia prób dławienia.

Widziałem w innym miejscu, że najlepiej będzie śledzić wszystkie nieudane próby logowania w całej witrynie i powiązać je z znacznikiem czasu, być może: {]}

CREATE TABLE failed_logins(
    id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(16) NOT NULL,
    ip_address INT(11) UNSIGNED NOT NULL,
    attempted DATETIME NOT NULL
) engine=InnoDB charset=UTF8;

Decydować o pewnych opóźnieniach w oparciu o ogólna liczba nieudanych logowań w danym czasie. Należy oprzeć to na danych statystycznych pobranych z tabeli failed_logins, ponieważ będzie ona zmieniać się w czasie w oparciu o liczbę użytkowników i ilu z nich może przypomnieć (i wpisać) swoje hasło.


10 failed attempts = 1 second
20 failed attempts = 2 seconds
30 failed attempts = reCaptcha

Sprawdź tabelę przy każdej nieudanej próbie logowania, aby znaleźć liczbę nieudanych logowań dla danego okresu czasu, powiedzmy 15 minut:


SELECT COUNT(1) AS failed FROM failed_logins WHERE attempted > DATE_SUB(NOW(), INTERVAL 15 minute);

Jeśli liczba prób nad w danym okresie czasu przekroczysz limit, wymuszaj Dławienie lub zmuszaj wszystkich użytkowników do korzystania z captcha (tj. reCaptcha), dopóki liczba nieudanych prób w danym okresie czasu nie będzie mniejsza niż próg.

// array of throttling
$throttle = array(10 => 1, 20 => 2, 30 => 'recaptcha');

// assume query result of $sql is stored in $row
$sql = 'SELECT MAX(attempted) AS attempted FROM failed_logins';
$latest_attempt = (int) date('U', strtotime($row['attempted']));
// get the number of failed attempts
$sql = 'SELECT COUNT(1) AS failed FROM failed_logins WHERE attempted > DATE_SUB(NOW(), INTERVAL 15 minute)';
// assume the number of failed attempts was stored in $failed_attempts
krsort($throttle);
foreach ($throttle as $attempts => $delay) {
    if ($failed_attempts > $attempts) {
        // we need to throttle based on delay
        if (is_numeric($delay)) {
            $remaining_delay = time() - $latest_attempt - $delay;
            // output remaining delay
            echo 'You must wait ' . $remaining_delay . ' seconds before your next login attempt';
        } else {
            // code to display recaptcha on login form goes here
        }
        break;
    }
}

Użycie reCaptcha na określonym progu zapewniłoby, że atak z wielu frontów byłby zminimalizowany , A normalni użytkownicy witryny nie odczują znacznego opóźnienia w przypadku uzasadnionych nieudanych prób logowania. Nie mogę się powstrzymać, bo to już został rozszerzony, że CAPTCHA może być uszkodzony. Istnieją alternatywne rozwiązania, być może wariant "Nazwij to zwierzę", który mógłby działać całkiem dobrze jako substytut.

 6
Author: Corey Ballou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:46:52

Aby podsumować schemat Jensa w pseudo diagram przejścia stanu / bazę reguł:

  1. użytkownik + hasło - > wpis
  2. user + !password - > denied
  3. user + known_IP (user) - > front door, // never throttle
  4. user + unknown_IP (user) - > catflap
  5. (#denied > n) via catflaps(site) -> throttle catflaps (site) // slow the bots
  6. catflap + throttle + password + captcha - > entry // humans still welcome
  7. catflap + przepustnica + hasło+!captcha - > denied // a correct guess from a bot

Uwagi:

    Nigdy nie zamykaj drzwi. Elbonian State police ma Twój komputer, w Twoim domu, ale nie są w stanie cię przesłuchać. Brute force to realne podejście z twojego komputera.
  • Jeśli podasz " Zapomniałeś hasła?"link, a następnie Twoje konto e-mail staje się częścią powierzchni ataku.

Te obserwacje obejmują inny rodzaj ataku niż te, które próbujesz przeciwstawić.

 5
Author: jamesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-29 18:31:05

Wygląda na to, że próbujesz bronić się przed wolno rozproszoną brutalną siłą . Nic na to nie poradzisz. Używamy PKI i nie logujemy się hasłem. To pomaga, ale jeśli twoi klienci raz na jakiś czas narażają stacje robocze, nie ma to zbyt dużego zastosowania.

 4
Author: raupach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-26 10:04:21

Zastrzeżenie: pracuję dla firmy dwuskładnikowej, ale nie jestem tutaj, aby ją podłączyć. Oto kilka spostrzeżeń.

Pliki cookie mogą być kradzione za pomocą XSS i przeglądarek. Użytkownicy często zmieniają przeglądarki lub usuwają swoje pliki cookie.

Źródłowe adresy IP są jednocześnie dynamicznie zmienne i fałszywe.

Captcha jest przydatna, ale nie uwierzytelnia konkretnego człowieka.

Wiele metod można z powodzeniem łączyć, ale dobry smak jest na pewno w porządku.

Hasło złożoność jest dobra, wszystko oparte na hasłach zależy od haseł posiadających wystarczającą entropię. IMHO, silne hasło zapisane w bezpiecznym miejscu fizycznym jest lepsze niż słabe hasło w pamięci. Ludzie wiedzą, jak ocenić bezpieczeństwo dokumentów papierowych znacznie lepiej niż wiedzą, jak obliczyć skuteczną entropię w imieniu swojego psa, gdy są używane jako hasło do trzech różnych stron internetowych. Rozważ umożliwienie użytkownikom wydruku dużej lub małej strony pełnej jednorazowego użytku podaj kody.

Pytania bezpieczeństwa, takie jak "jaka była twoja maskotka w liceum", są w większości kolejną kiepską formą "czegoś, co wiesz", większość z nich jest łatwo zgadywalna lub wprost w domenie publicznej.

Jak zauważyłeś, ograniczanie nieudanych prób logowania to kompromis między zapobieganiem atakom brute-force a łatwością dozowania konta. Agresywne zasady blokowania mogą odzwierciedlać brak zaufania do entropii hasła.

Ja osobiście nie widzę korzyści z egzekwowania wygaśnięcie hasła na stronie w każdym razie. Atakujący dostaje Twoje hasło raz, może je zmienić i przestrzegać tej polityki tak łatwo, jak to tylko możliwe. Być może jedną z korzyści jest to, że użytkownik może zauważyć wcześniej, jeśli atakujący zmieni hasło do konta. Jeszcze lepiej byłoby, gdyby użytkownik został w jakiś sposób powiadomiony przed uzyskaniem dostępu przez atakującego. Przydatne pod tym względem są wiadomości typu "N failed attempts since last login".

Najlepsze bezpieczeństwo wynika z drugiego czynnika uwierzytelnianie, które jest poza pasmem w stosunku do pierwszego. Tak jak powiedziałeś, tokeny sprzętowe w "coś, co masz" są świetne, ale wiele (nie wszystkie) ma prawdziwe koszty administracyjne związane z ich dystrybucją. Nie znam żadnych biometrycznych rozwiązań" something you are " dobrych dla stron internetowych. Niektóre dwuskładnikowe rozwiązania współpracują z dostawcami openid, niektóre posiadają zestawy SDK PHP/Perl / Python.

 3
Author: Marsh Ray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-29 05:33:09

Bez względu na to, jak dobry jest Twój system, zawiedzie pod wystarczająco długim atakiem. Jest tu kilka dobrych pomysłów, jak przedłużyć czas trwania hasła. (Osobiście podoba mi się pomysł wykładniczo rosnącego ograniczenia szybkości prób na użytkownika i na adres IP.), Ale bez względu na to, co zrobisz, będziesz musiał wykonać kopię zapasową niektórych zasad haseł.

Zachęcam do zastanowienia się, jak szybko można złamać hasło, i do tego, aby użytkownicy zmieniali je dwa razy częściej. Hope this pomaga.

Edit: jeśli spodziewasz się wielu leniwych atakujących, Wymaganie CAPTCHA po wielu nieudanych próbach jest dobre: podnosi nieco poprzeczkę. Jeśli martwisz się o wielu inteligentnych napastników, zatrudnij konsultanta ds. bezpieczeństwa. ;)

 1
Author: ojrac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-28 22:23:48

Moją najwyższą rekomendacją jest po prostu upewnienie się, że informujesz użytkowników o błędnych próbach logowania do ich kont-- Użytkownicy prawdopodobnie potraktują siłę swojego hasła znacznie poważniej, jeśli przedstawią im dowody na to, że ktoś naprawdę próbuje dostać się na ich konto.

Złapałem kogoś, kto włamał się na konto myspace mojego brata, ponieważ próbował dostać się na konto gmail skonfigurowałem dla niego i użyłem " Resetuj moje hasło przez funkcja e-mail... które trafiły do mojej skrzynki odbiorczej.

 1
Author: nvuono,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-10 15:59:56
  1. A co z wymaganiem jednorazowego hasła przed wprowadzeniem normalnego hasła? To by było oczywiste, że ktoś atakował, zanim dostał wiele okazji do odgadnięcia głównego hasła?

  2. Utrzymuj globalną liczbę / wskaźnik błędów logowania - jest to wskaźnik ataku - podczas ataku bądź surowszy o niepowodzenia logowania np. szybsze zbanowanie IP.

 1
Author: Douglas Leeder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-27 07:08:18

Nie wierzę, że istnieje idealna odpowiedź, ale byłbym skłonny podejść do niej na podstawie próby zamieszania robotów, jeśli wykryje atak.

Off the top of my mind:

Przełącz na alternatywny ekran logowania. Ma wiele pustych nazw użytkownika i hasła, które naprawdę się pojawiają, ale tylko jeden z nich jest we właściwym miejscu. Nazwy pól są RANDOM - klucz sesji jest wysyłany wraz z ekranem logowania, serwer może następnie dowiedzieć się, jakie pola są jakie. Succeed or fail to then then then so you can ' t try a replay attack-if you reject the password they get a new session ID.

Każdy formularz, który jest przesyłany z danymi w niewłaściwym polu, zakłada się, że pochodzi od robota-logowanie nie powiedzie się, kropka, a IP jest dławione. Upewnij się, że losowe nazwy pól nigdy nie pasują do legalnych nazw pól, aby ktoś, kto pamięta hasła, nie wprowadzał w błąd.

Następnie, co powiesz na inny rodzaj captcha: masz serię pytań, które nie przysporzy ludziom problemów. Jednak są one Nie przypadkowe. Kiedy atak się rozpocznie, każdy otrzymuje pytanie # 1. Po godzinie pytanie #1 jest odrzucane, nigdy nie może być użyte ponownie i każdy dostaje pytanie # 2 i tak dalej.

Atakujący nie może pobrać bazy danych, aby umieścić ją w swoim robocie z powodu jednorazowego charakteru pytań. Musi wysłać nowe instrukcje do swojego botnetu w ciągu godziny, aby mieć jakąkolwiek zdolność do robienia czegokolwiek.

 0
Author: Loren Pechtel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-27 01:17:42

Ponieważ kilka osób włączyło CAPTCHA jako ludzki mechanizm awaryjny, dodaję wcześniejsze pytanie StackOverflow i wątek na temat skuteczności CAPTCHA.

Czy reCaptcha została złamana / zhakowana / OCR ' d / pokonana / złamana?

Używanie CAPTCHA nie ogranicza ulepszeń związanych z dławieniem i innymi sugestiami, ale myślę, że liczba odpowiedzi, które zawierają CAPTCHA jako alternatywę, powinna uwzględniać metody oparte na ludziach dostępne dla osób, które chcą złamać Ochrona.

 0
Author: Matthew Glidden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:38

Można również Dławić na podstawie siły hasła użytkownika.

Kiedy użytkownik rejestruje lub zmienia swoje hasło, oblicza się dla niego ocenę siły, powiedzmy od 1 do 10.

Coś w stylu "hasło" zdobywa 1, podczas gdy "c6eqapRepe7et * Awr@ch" może zdobyć 9 lub 10, a im wyższy wynik, tym dłużej trwa Dławienie, aby zacząć.

 0
Author: Joseph W,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-27 04:11:08

Pierwszą odpowiedzią, którą zwykle słyszałem, gdy zadawałem to pytanie, jest zmiana portów, ale zapomnij o tym i po prostu wyłącz IPv4. Jeśli zezwalasz tylko klientom z sieci IPv6, nie modlisz się już o proste skanowanie sieci, a atakujący będą uciekali się do wyszukiwania DNS. Nie uruchamiaj na tym samym adresie co twój Apache (AAAA)/Sendmail(MX->AAAA) / co rozdałeś wszystkim(AAAA). Upewnij się, że Twoja strefa nie może być xferd, poczekaj, aż Twoja strefa zostanie pobrana przez kogoś?

Jeśli boty znajdują ustawienia serwera nowe nazwy hostów, po prostu dołącz kilka bełkotów do nazw hostów i zmień swój adres. Pozostaw stare nazwy, a nawet Ustaw nazwy honeypot * * dla BOT net do timeout na.

** Przetestuj swoje rekordy reverse(PTR) (pod ip6.arpa.), aby sprawdzić, czy można je wykorzystać do zerowania w na /4, które mają rekordy VS /4, które nie. tzn. zazwyczaj ip6.arpa miałby ~32 "."s w adresie, ale próba z ostatnich kilku brakuje może wymknąć bloków sieciowych, które mają rekordy VS inne, które nie. jeśli weźmiesz to dalej, będzie można pominąć duże części przestrzeni adresowej.

W najgorszym przypadku użytkownicy będą musieli skonfigurować tunel IPv6, to nie jest tak, że musieliby iść tak daleko, jak VPNing do DMZ... Chociaż zastanawia się, dlaczego nie jest to pierwsza opcja.

Również Kerberos jest fajny, ale IMHO LDAP wieje (co jest technicznie nie tak z Nisplusem? Czytałem, że Sun zdecydował, że użytkownicy chcą LDAP i z tego powodu porzucili NIS+). Kerberos robi działa dobrze bez LDAP lub NIS, wystarczy zarządzać użytkownikami na podstawie hosta. Korzystanie z Kerberos daje łatwy w użyciu, jeśli nie zautomatyzowany, PKI.

 0
Author: Mike Mestnik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-12 07:55:28

Trochę za późno, ale myślałem, zakładając, że ciężki przypadek-atakujący używa wielu losowych IP, losowych nazw użytkowników i losowego hasła wybranego z listy 10.000 najpopularniejszych.

Jedną rzeczą, którą możesz zrobić, zwłaszcza jeśli system wydaje się być atakowany, ponieważ w systemie jest wiele błędnych prób haseł, a zwłaszcza jeśli hasło ma niską entropię, jest zadanie drugorzędnego pytania, na przykład Jakie są imiona twoich rodziców. Jeśli napastnik uderzy w miliony kont próbujących hasła "password1" jest duża szansa, że dostaną dużo, ale ich szanse na poprawienie nazw znacznie zmniejszą sukcesy.

 0
Author: Tim 333,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-23 23:52:53