Anda dapat menggunakan iptables untuk menilai-membatasi koneksi masuk baru ke port SSH. Saya harus melihat seluruh konfigurasi iptables Anda untuk memberi Anda solusi turnkey, tetapi pada dasarnya Anda berbicara tentang menambahkan aturan seperti:
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 5 --name SSH --rsource -j DROP
iptables -A INPUT -p tcp --dport 22 -m recent --set --name SSH --rsource -j ACCEPT
Aturan-aturan ini mengasumsikan bahwa Anda menerima koneksi ESTABLISHED sebelumnya dalam tabel (sehingga hanya koneksi baru yang akan memukul aturan ini). Koneksi SSH baru akan memenuhi aturan ini dan ditandai. Dalam 60 detik, 5 percobaan dari satu alamat IP akan menghasilkan koneksi masuk baru dari IP yang terputus.
Ini bekerja dengan baik untuk saya.
Sunting: Saya lebih suka metode ini daripada "fail2ban" karena tidak ada perangkat lunak tambahan yang diinstal, dan terjadi sepenuhnya dalam mode kernel. Itu tidak menangani parsing file log seperti "fail2ban" akan, tetapi jika masalah Anda hanya dengan SSH saya tidak akan menggunakan sesuatu mode pengguna yang memerlukan instalasi perangkat lunak dan lebih kompleks.
-m condition
pencocokan iptables sebagai gantinya.fail2ban dapat membantu dengan memblokir alamat IP dengan terlalu banyak upaya login yang gagal.
sumber
Saya akan merekomendasikan menggunakan port non-standar untuk SSH jika Anda dapat (mis. Port 10222) tetapi karena Anda menyebutkan Anda tidak dapat melakukan itu, saya akan merekomendasikan menggunakan sesuatu seperti DenyHosts.
http://denyhosts.sourceforge.net/
Paket hebat, mudah dipasang dan dikonfigurasi.
sumber
Meskipun mungkin menyenangkan untuk ssh ke sistem Anda dari lokasi sewenang-wenang di internet, ada sistem serangan kata sandi otomatis yang akan mengunci ke port ssh terbuka dan menerapkan berbagai serangan akun joe dan kamus terhadap sistem Anda. Ini bisa menjadi sulit untuk dibaca dalam ringkasan log malam Anda dan merupakan pemborosan bandwidth Anda.
Jika Anda memiliki server web pada sistem yang sama, Anda dapat menggunakan pembungkus php dan tcp untuk membatasi lalu lintas masuk ssh ke sistem yang diketahui, plus memberi Anda kunci pintu belakang untuk mengizinkan diri Anda mengakses dari sistem arbitrer di internet.
Begini cara melakukannya:
tolak semua koneksi ssh di /etc/hosts.deny:
Izinkan sistem yang dikenal dengan IP di /etc/hosts.allow, plus tambahkan file untuk akses sementara:
Buat file php di server web Anda dan berikan nama yang tidak jelas seperti my-sshd-access.php:
Maafkan kode php - Saya menggeseknya dari tempat lain, jadi mungkin bisa berdiri untuk dibersihkan. Yang dilakukannya hanyalah menambahkan alamat IP sistem yang mengaksesnya ke file /etc/hosts.allow.tentara-sshd-access, yang dibaca oleh sshd (karena dimasukkan oleh /etc/hosts.allow) pada waktu koneksi .
Sekarang ketika Anda berada di beberapa sistem arbitrer di web dan ingin ssh ke sistem ini, pertama-tama gunakan browser web dan tekan file ini (atau gunakan wget atau equivilent):
Sekarang Anda harus dapat ssh ke sistem Anda. Jika ini adalah suatu tempat di mana Anda akan sering melakukan ssh'ing, akan sepele untuk membaca konten file /etc/hosts.allow.tentara-sshd-access dan secara permanen menambahkan alamat IP ke / etc / hosts. mengizinkan.
sumber
Anda mungkin ingin melihat denyhosts juga.
FYI: OpenSSH 6.7 menjatuhkan dukungan tcpwrappers , yang berarti penolakanhost mungkin bukan solusi untuk instalasi baru.
sumber
Bantulah sendiri dan nonaktifkan login kata sandi. Gunakan kunci autentikasi eksklusif (misalnya google ssh-keygen - Contoh: http://www.puddingonline.com/~dave/publications/SSH-with-Keys-HOWTO/document/html/SSH-with-Keys-HOWTO-4 .html ) Server Anda akan lebih aman, Anda akan terhubung dengan lebih nyaman (periksa ssh-agent, ssh-add, gantungan kunci) dan Anda tidak akan lagi menjadi korban serangan brute ssh.
sumber
solusi lain hanya memindahkan ssh ke port lain. cacing ini sangat bodoh.
sumber
Pilihan lain mungkin mengharuskan semua koneksi ssh diverifikasi oleh sertifikat dan menghapus kata sandi sama sekali.
Saya dulu menggunakan Denyhosts, tetapi saya menemukan saya hanya menghubungkan secara teratur dari jarak jauh dari beberapa tempat, jadi saya memblokir semua koneksi port 22 kecuali dari tempat lain, dan menggunakan port knocking sehingga saya dapat terhubung dari mana saja dengan laptop saya jika saya harus .
sumber
Solusi apa pun yang melibatkan pemblokiran IP secara otomatis setelah beberapa kegagalan menimbulkan risiko penolakan serangan layanan. Selama ada kebijakan kata sandi yang baik untuk mengurangi efektivitas serangan brute force atau kamus, saya tidak akan terlalu khawatir tentang mereka.
Jika Anda membatasi pengguna / grup hanya pada mereka yang seharusnya diizinkan ssh di tempat pertama, dan menonaktifkan login sebagai root, Anda harus lebih dari cukup aman. Dan, jika itu tidak cukup, selalu ada otentikasi berbasis kunci.
sumber
Jujur, jika Anda harus menjalankan SSH (dan pada port 22), Anda tidak dapat menghindari ini. Jika Anda harus menerima kata sandi, kondisi Anda bahkan lebih buruk.
Taruhan terbaik Anda adalah mengonfigurasi perangkat lunak analisis log Anda untuk mengecualikan log SSH. Kemudian jalankan instance terpisah untuk hanya melihat log SSH, dan gunakan procmail untuk menyaring upaya yang gagal. Anda bahkan dapat menulis skrip untuk melihat login yang berhasil dari alamat IP dengan beberapa upaya yang gagal.
Tidak ada cara untuk menghentikan orang-orang menyelidiki server SSH Anda. Denyhosts, fail2ban, dan contoh iptables akan bekerja sampai titik tertentu, tetapi dengan bahaya tambahan karena secara tidak sengaja memblokir pengguna yang sah. Metode terbaik adalah menyedotnya dan mencoba mengotomatiskan proses analisis log untuk mengurangi jumlah waktu Anda harus memikirkannya.
sumber
Ketika Anda mengatakan Anda mendapatkan gagal login saat mencoba pada server topi merah Anda, jenis firewall apa yang ada di belakangnya dan berapa banyak orang yang perlu melakukan shh ke dalamnya. Saya menyarankan bahwa jika Anda dapat, Anda ingin membatasi upaya di firewall sebelum mereka mendekati server Anda yang sebenarnya.
Jika Anda dapat membatasi rentang alamat ip yang memerlukan akses secara sah, Anda harus dapat membuat daftar akses di dinding api. Jika Anda dapat membatasi lalu lintas di firewall saya sarankan Anda melihat sistem intrusi jaringan, karena sepertinya server Anda sedang ditargetkan oleh sesuatu.
sumber
Sebagian besar hosting menggunakan APF + BFD untuk ip-blok gagal login SSH. Saat ini ada CSF (Configserver firewall) yang mencakup alat yang disebut LFD yang melakukan hal yang sama, dan banyak lagi, termasuk memblokir IP dari negara-negara tertentu yang Anda tidak ingin mengakses server Anda (misalnya Korea, Cina dll, di mana 99% dari penyelidikan SSH saya tampaknya berasal dari).
sumber
Saya telah menggunakan fail2ban dan telah membantu saya keluar banyak.
sumber
Jika Anda perlu mengatasi masalah ini di lebih dari satu host, Anda mungkin ingin memeriksa OSSEC: http://www.ossec.net/main/ossec-architecture
Ini akan memungkinkan Anda untuk mengkonfigurasi beberapa agen dari lokasi terpusat untuk secara otomatis menanggapi serangan brute-force (bersama dengan pola lain yang dapat Anda ekstrak dari log).
Sepotong perangkat lunak yang sangat bagus :)
sumber
Opsi lain yang mirip dengan DenyHosts adalah sshutout http://www.techfinesse.com/sshutout/sshutout.html
sumber