Baiklah, cukup kemacetan; inilah yang saya buat sejauh ini
(Maaf, posting lama di depan. Berani, teman, perjalanan akan sia-sia)
Menggabungkan metode 3 dan 4 dari posting asli menjadi semacam 'fuzzy' atau daftar putih dinamis, dan kemudian - dan inilah triknya - tidak memblokir IP yang tidak masuk daftar putih, hanya mendorong mereka ke neraka dan kembali .
Perhatikan bahwa langkah ini hanya dimaksudkan untuk menggagalkan jenis serangan yang sangat spesifik ini. Dalam praktiknya, tentu saja, itu akan bekerja dalam kombinasi dengan pendekatan praktik terbaik lainnya untuk auth: pelambatan fixed-username, per-IP throttling, kebijakan kata sandi yang kuat yang diberlakukan kode, login cookie yang tidak dilacak, memasukkan semua kata sandi yang setara sebelum menyimpannya, tidak pernah menggunakan pertanyaan keamanan, dll.
Asumsi tentang skenario serangan
Jika penyerang menargetkan nama pengguna variabel, pembatasan nama pengguna kami tidak akan aktif. Jika penyerang menggunakan botnet atau memiliki akses ke rentang IP besar, pembatasan IP kami tidak berdaya. Jika penyerang telah membuat pra-memo daftar pengguna kami (biasanya dimungkinkan pada layanan web pendaftaran terbuka), kami tidak dapat mendeteksi serangan yang sedang berlangsung berdasarkan jumlah kesalahan 'pengguna tidak ditemukan'. Dan jika kita menerapkan pembatasan sistem (semua nama pengguna, semua IP) yang terbatas, serangan seperti itu akan merusak seluruh situs kami selama durasi serangan plus periode pembatasan.
Jadi kita perlu melakukan sesuatu yang lain.
Bagian pertama dari penanggulangan: Daftar putih
Apa yang bisa kita yakini dengan cukup jelas adalah bahwa penyerang tidak dapat mendeteksi dan secara spoof memalsukan alamat IP beberapa ribu pengguna kami (+). Yang membuat daftar putih menjadi layak. Dengan kata lain: untuk setiap pengguna, kami menyimpan daftar IP (hash) dari tempat pengguna sebelumnya (baru-baru ini) masuk.
Dengan demikian, skema daftar putih kami akan berfungsi sebagai 'pintu depan' yang terkunci, di mana pengguna harus terhubung dari salah satu IP 'baik' yang dikenalnya untuk dapat masuk sama sekali. Serangan brutal pada 'pintu depan' ini bisa dibilang mustahil (+).
(+) kecuali jika penyerang 'memiliki' baik server, semua kotak pengguna kami, atau koneksi itu sendiri - dan dalam kasus tersebut, kami tidak lagi memiliki masalah 'otentikasi', kami memiliki tarik ukuran waralaba asli - Situasi FAR-plug
Bagian kedua dari penanggulangan: Pembatasan seluruh sistem IP yang tidak dikenali
Untuk membuat daftar putih berfungsi untuk layanan web pendaftaran terbuka, di mana pengguna sering berganti komputer dan / atau menyambungkan dari alamat IP dinamis, kita perlu menjaga 'pintu kucing' tetap terbuka untuk pengguna yang terhubung dari IP yang tidak dikenal. Caranya adalah dengan mendesain pintu itu sehingga botnet macet, dan pengguna yang sah akan terganggu sesedikit mungkin .
Dalam skema saya, ini dicapai dengan menetapkan jumlah maksimum yang sangat ketat dari upaya login gagal oleh IP yang tidak disetujui, katakanlah, periode 3 jam (mungkin lebih bijaksana untuk menggunakan periode yang lebih pendek atau lebih lama tergantung pada jenis layanan), dan membuat batasan itu bersifat global , yaitu. untuk semua akun pengguna.
Bahkan brute force yang lambat (1-2 menit antar percobaan) akan terdeteksi dan digagalkan dengan cepat dan efektif menggunakan metode ini. Tentu saja, kekuatan brutal yang sangat lambat masih bisa tetap tidak diperhatikan, tetapi kecepatan yang terlalu lambat mengalahkan tujuan serangan brutal itu.
Apa yang ingin saya capai dengan mekanisme pelambatan ini adalah bahwa jika batas maksimum tercapai, 'pintu kucing' kami ditutup untuk sementara waktu, tetapi pintu depan kami tetap terbuka untuk pengguna yang sah yang terhubung dengan cara biasa:
- Baik dengan menghubungkan dari salah satu IP yang dikenali mereka
- Atau dengan menggunakan cookie login persisten (dari mana saja)
Satu-satunya pengguna yang sah yang akan terpengaruh selama serangan - yaitu. sementara pembatasan diaktifkan - akan menjadi pengguna tanpa cookie login persisten yang masuk dari lokasi yang tidak diketahui atau dengan IP dinamis. Para pengguna tidak akan bisa masuk sampai throttling hilang (yang berpotensi memakan waktu cukup lama, jika penyerang tetap menjalankan botnet-nya terlepas dari pembatasan).
Untuk memungkinkan sekelompok kecil pengguna ini masuk melalui pintu kucing yang tertutup rapat, meskipun bot masih memaluinya, saya akan menggunakan formulir login 'cadangan' dengan CAPTCHA. Sehingga, ketika Anda menampilkan pesan "Maaf, tetapi Anda tidak dapat masuk dari alamat IP ini saat ini", sertakan tautan yang mengatakan " masuk dengan aman cadangan - HANYA SAJA ( bot: tidak ada dusta ) ". Di samping itu, ketika mereka mengklik tautan itu, berikan mereka formulir login terautentikasi reCAPTCHA yang memintas pelambatan di seluruh situs. Dengan begitu, JIKA mereka manusia DAN mengetahui kata sandi login + yang benar (dan dapat membaca CAPTCHA), mereka tidak akan pernah ditolak layanan, bahkan jika mereka terhubung dari host yang tidak dikenal dan tidak menggunakan cookie autologin.
Oh, dan hanya untuk mengklarifikasi: Karena saya menganggap CAPTCHA secara umum jahat, opsi masuk 'cadangan' hanya akan muncul saat pembatasan sedang aktif .
Tidak dapat disangkal bahwa serangan berkelanjutan seperti itu masih akan merupakan bentuk serangan DoS, tetapi dengan sistem yang dijelaskan di sana, itu hanya akan mempengaruhi apa yang saya curigai sebagai sekelompok kecil pengguna, yaitu orang-orang yang tidak menggunakan cookie "ingat saya" DAN kebetulan masuk saat serangan terjadi DAN tidak masuk dari IP biasa mereka DAN siapa yang tidak bisa membaca CAPTCHA. Hanya mereka yang dapat mengatakan tidak kepada SEMUA kriteria itu - khususnya bot dan orang-orang cacat yang benar - benar sial - yang akan ditolak selama serangan bot.
Suntingan : Sebenarnya, saya memikirkan cara untuk membiarkan bahkan pengguna yang ditantang CAPTCHA melewatinya selama 'penguncian': alih-alih, atau sebagai pelengkap, cadangan masuk CAPTCHA, memberikan pengguna opsi untuk menggunakan sekali pakai , kode kuncian khusus pengguna yang dikirim ke emailnya, yang kemudian dapat ia gunakan untuk memotong pembatasan. Ini jelas melampaui ambang 'gangguan' saya, tetapi karena ini hanya digunakan sebagai upaya terakhir untuk sekelompok kecil pengguna, dan karena masih berdetak karena dikunci dari akun Anda, itu akan dapat diterima.
(Juga, perhatikan bahwa semua ini tidak terjadi jika serangannya kurang canggih dari versi terdistribusi buruk yang saya jelaskan di sini. Jika serangan itu datang dari hanya beberapa IP atau hanya mengenai beberapa nama pengguna, itu akan digagalkan lebih awal. , dan tanpa konsekuensi seluruh situs)
Jadi, itu adalah penanggulangan yang akan saya terapkan di perpustakaan auth, setelah saya yakin bahwa itu suara dan tidak ada solusi yang lebih sederhana yang saya lewatkan. Faktanya adalah, ada begitu banyak cara halus untuk melakukan hal-hal yang salah dalam keamanan, dan saya tidak di atas membuat asumsi yang salah atau logika yang benar-benar cacat. Jadi tolong, setiap dan semua umpan balik, kritik dan peningkatan, seluk-beluk dll sangat dihargai.