Гаразд, достатньо затримки; ось що я придумав поки що
(Вибачте, довгий пост попереду. Будьте сміливі, друже, подорож того вартує)
Поєднуючи методи 3 та 4 з початкового допису у своєрідний «нечіткий» чи динамічний білий список, а потім - і ось ось хитрість - не блокувати IP-адреси, які не перебувають у списку, просто перекидаючи їх у пекло та назад .
Зауважте, що цей захід призначений лише для запобігання цього дуже специфічного типу нападу. На практиці, звичайно, це буде працювати в поєднанні з іншими підходами до перегляду найкращих практик до автентифікації: вимикання з фіксованим ім’ям користувача, затримка IP-адреси, сильна політика пароля, невключена вхід файлів cookie, хешування всіх еквівалентів паролів перед збереженням, ніколи використання питань безпеки тощо.
Припущення щодо сценарію нападу
Якщо зловмисник націлений на імена змінних користувачів, утилізація нашого імені користувача не спрацьовує. Якщо зловмисник використовує ботнет або має доступ до широкого діапазону IP, наше IP-вимкнення неможливо. Якщо зловмисник попередньо скребив наш список користувачів (зазвичай це можливо на веб-сервісах відкритої реєстрації), ми не можемо виявити триваючу атаку на основі кількості помилок "користувача не знайдено". І якщо ми застосуємо обмежувальну загальну систему (усі імена користувачів, усі IP-адреси), то будь-яка така атака буде робити ЗАТ весь наш сайт протягом тривалості атаки плюс період затримки.
Тому нам потрібно зробити щось інше.
Перша частина контрзаходу: Білий список
У чому ми можемо бути впевнені, це те, що зловмисник не в змозі виявляти та динамічно підробляти IP-адреси декількох тисяч наших користувачів (+). Що робить білі списки здійсненними. Іншими словами: для кожного користувача ми зберігаємо список (хешованих) IP-адрес, з яких користувач раніше (недавно) увійшов.
Таким чином, наша схема білого списку буде функціонувати як заблокована «вхідна дверцята», де користувач повинен бути підключений до однієї зі своїх визнаних «хороших» IP-адрес, щоб взагалі увійти в систему. Напад грубої сили на цю "вхідні двері" був би практично неможливим (+).
(+), якщо зловмисник не володіє сервером, усіма скриньками наших користувачів або самим підключенням - і в тих випадках у нас більше не виникає проблема "аутентифікації", ми маємо справжній розмір франшизи -включіть ситуацію FUBAR
Друга частина контрзаходу: загальносистемне придушення невпізнаних ІС
Для того, щоб зробити список білих списків для веб-сервісу відкритої реєстрації, де користувачі часто перемикають комп’ютери та / або підключаються з динамічних IP-адрес, нам потрібно тримати «котячу двері» відкритою для користувачів, що підключаються до нерозпізнаних IP-адрес. Хитрість полягає в тому, щоб створити двері таким чином, щоб ботнети застрягли, і так законних користувачів турбує якнайменше .
У моїй схемі це досягається встановленням дуже обмежувальної максимальної кількості невдалих спроб входу через неприйняті IP-адреси протягом, скажімо, 3-годинного періоду (можливо, розумніше буде використовувати менший чи довший період залежно від типу послуги), і робить це обмеження глобальним , тобто. для всіх облікових записів користувачів.
Навіть повільна (1-2 хвилини між спробами) груба сила була б виявлена та зірвана швидко та ефективно за допомогою цього методу. Звичайно, по- справжньому повільна груба сила все ще може залишатися непоміченою, але занадто повільні швидкості перемагають саму мету нападу грубої сили.
Я сподіваюся досягти цього механізму дроселювання - це те, що якщо буде досягнуто максимальної межі, наші «котячі двері» на деякий час закриваються, але наші вхідні двері залишаються відкритими для законних користувачів, що підключаються звичайними засобами:
- Або підключившись до одного зі своїх визнаних IP-адрес
- Або за допомогою постійного файлу cookie для входу (з будь-якого місця)
Єдиних законних користувачів, які були б зачеплені під час нападу - тобто. під час активації дроселювання - користувачі без постійних файлів cookie, які входили з невідомого місця або з динамічним IP-адресою. Ці користувачі не зможуть увійти до тих пір, поки дроселювання не вимкнеться (що потенційно може зайняти деякий час, якщо зловмисник продовжує працювати ботнет незважаючи на дроселювання).
Щоб дозволити цій невеликій підмножині користувачів просуватися через інакше запечатану котячу двері, навіть коли боти все ще забивали її, я б застосував форму для входу з резервною копією CAPTCHA. Отже, коли ви відображаєте повідомлення "Вибачте, але ви не можете увійти з цієї IP-адреси на даний момент", включіть посилання, яке говорить " безпечний вхід резервного копіювання - ЛЮДИНИ ТОЛЬКО ( боти: не брешуть ) ". Жартуйте вбік, коли натискають на це посилання, надайте їм реєстраційну форму для реєстрації, підтверджену reCAPTCHA, що обходить сторону загального веб-сайту. Таким чином, якщо вони люди І знають правильний логін + пароль (і вміють читати CAPTCHA), їм ніколи не буде відмовлено в обслуговуванні, навіть якщо вони підключаються від невідомого хоста і не використовують cookie autologin.
О, і просто для уточнення: Оскільки я вважаю CAPTCHA загалом злим, параметр входу в систему "резервного копіювання" з'явиться лише тоді, коли активування дроселя .
Не можна заперечувати, що така тривала атака, як і раніше, буде формою DoS-атаки, але при наявності описаної системи вона вплине лише на те, що я підозрюю, що є крихітним набором користувачів, а саме людьми, які не використовують Файли cookie "запам'ятайте мене" І входять під час вступу в атаку. І не входять в систему з будь-яких звичних IP-адрес І не вміють читати CAPTCHA. Під час бот-атаки будуть відвернені лише ті, хто може сказати "ВСІМ" цим критеріям - зокрема ботам та справді нещасним інвалідам.
EDIT: Насправді я придумав спосіб пропустити навіть користувачів, які спричинили CAPTCHA, під час «блокування»: замість або як доповнення до входу резервного копіювання CAPTCHA, надавати користувачеві можливість одноразового використання , специфічний для користувача код блокування, надісланий на його електронний лист, який він потім може використовувати для обходу дроселювання. Це, безумовно, переступає поріг мого "роздратування", але оскільки він використовується лише в крайньому випадку для крихітного підмножини користувачів, і оскільки він все ще може бути заблокованим з вашого облікового запису, це було б прийнятно.
(Також зауважте, що нічого з цього не відбувається, якщо напад є менш складним, ніж неприємна розподілена версія, яку я описав тут. Якщо атака надходить лише з декількох IP-адрес або потрапляє лише кілька імен користувачів, вона буде зірвана набагато раніше та без наслідків для всіх сайтів)
Отже, це контрзахід, який я буду реалізовувати у своїй авторській бібліотеці, коли я переконаюсь, що це здорово і що я не куди простіше рішення, яке я пропустив. Справа в тому, що існує стільки тонких способів зробити помилки в безпеці, і я не вище, ніж робити помилкові припущення чи безнадійно хибну логіку. Тож будь ласка, будь-які відгуки, критика та вдосконалення, тонкощі тощо високо оцінені.