Ada berbagai solusi. Yang terbaik adalah menggunakan otentikasi RSA yang menggunakan kunci publik / pribadi untuk mengautentikasi pengguna.
Periksa manual hebat ini untuk berbagai pendekatan (termasuk otentikasi RSA): http://www.la-samhna.de/library/brutessh.html
Saya menggunakan solusi ke - 3 di server saya karena saya tidak ingin membuatnya rumit untuk pengguna non-teknis saya: menggunakan iptables
untuk membatasi jumlah koneksi per menit yang membuat serangan bruteforce tidak efisien dan tidak efektif.
Inilah solusi yang saya gunakan:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j LOG --log-prefix "SSH_brute_force "
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP
Seperti yang disebutkan di sini : ini akan memungkinkan tiga koneksi port 22 dari alamat IP yang diberikan dalam periode 60 detik, dan memerlukan 60 detik dari tidak ada upaya koneksi berikutnya sebelum akan melanjutkan mengizinkan koneksi lagi. Opsi --rttl juga memperhitungkan TTL datagram saat mencocokkan paket, sehingga berupaya untuk mengurangi terhadap alamat sumber palsu.
Seperti yang dinyatakan dalam panduan yang disebutkan, lebih baik menggunakan daftar putih untuk memisahkan pengguna tepercaya dari aturan ini:
iptables -N SSH_WHITELIST
lalu tambahkan host tepercaya:
iptables -A SSH_WHITELIST -s $TRUSTED_HOST -m recent --remove --name SSH -j ACCEPT
dan setelah itu buat aturan:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j SSH_WHITELIST
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j ULOG --ulog-prefix SSH_brute_force
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP
Saya mendapatkan serangan ssh brute-force pada server saya dengan tingkat 1 hingga 2 per hari. Saya telah menginstal denyhosts (paket ubuntu: denyhosts). Ini adalah alat yang sangat sederhana namun efektif untuk tujuan itu: pada dasarnya ia memindai log Anda secara berkala untuk mendeteksi serangan brute-force dan menempatkan IP dari mana serangan-serangan ini berasal dari file /etc/hosts.deny Anda. Anda tidak akan mendengar kabar dari mereka lagi dan beban Anda harus dikurangi secara signifikan. Ini sangat dapat dikonfigurasi melalui file config /etc/denyhosts.conf untuk men-tweak masalah seperti berapa banyak upaya salah yang menyebabkan serangan, dll.
Karena pengerjaannya yang transparan, Anda dapat dengan mudah melihat apa yang terjadi (pemberitahuan email: 'aha, serangan pengecut lainnya gagal!') Dan membatalkan kesalahan karena pengguna Anda salah mengetik kata sandi mereka berulang kali.
Tentu saja, semua yang dikatakan sebelumnya tentang beralih ke metode otentikasi lain berlaku tetapi kadang-kadang persyaratan Anda tidak setuju dengan orang-orang Anda.
Juga, tingkat koneksi baru yang membatasi dalam iptables mungkin merupakan pilihan yang lebih baik daripada menolak akses melalui hosts.deny. Jadi, lihat juga fail2ban. Tetapi jika Anda tahu bahwa brute-force ssh adalah perhatian utama Anda (lihat manual /var/log/auth.log untuk menentukan ini), gunakan alat yang sangat mudah dan berdampak rendah ini.
sumber
Mar 27 10:28:43 smartfood sshd[17017]: Failed password for root from 218.15.136.38 port 33119 ssh2 Mar 27 10:28:47 smartfood sshd[17019]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=218.15.136.38 user=root
menunjukkan adanya serangan?knockd
untuk menerapkan port-mengetuk sistemrecent
danhashlimit
cocok untuk membatasi upaya SSH berturut-turutsumber
Pertama-tama Anda harus mempertimbangkan untuk tidak menggunakan kata sandi dan menggunakan kunci saja. Tidak perlu menggunakan kata sandi. Jika ini berhasil, Anda dapat mengonfigurasi server OpenSSH agar tidak bereaksi pada login kata sandi.
https://help.ubuntu.com/10.04/serverguide/C/openssh-server.html
Menggunakan fail2ban, bisa jadi pilihan juga.
https://help.ubuntu.com/community/Fail2ban
sumber
Seberapa luas server terpapar di jaringan? Mungkin Anda dapat berbicara dengan admin jaringan dan memeriksa apakah mungkin untuk memantau dan membatasi akses jaringan ke server. Bahkan jika login akun aman, tampaknya server dapat menderita serangan DoS / DDoS sederhana.
sumber
Alternatif untuk fail2ban adalah CSF: ConfigServer Security & Firewall .
Muncul dengan LFD: Daemon Kegagalan Login yang dapat mendeteksi beberapa upaya login gagal pada berbagai layanan, dan akan memblokir alamat IP yang menyinggung (sementara atau permanen).
Ini memiliki beberapa opsi lain yang dapat membantu melawan serangan banjir, dan mungkin mendeteksi intrusi.
Kekurangan:
sumber
Apakah Anda bermaksud mengizinkan layanan SSH ke dunia? Atau hanya untuk anggota tim di tempat-tempat tertentu? Jawaban saya sedikit tergantung pada beratnya tantangan Anda.
Dalam kedua kasus tersebut, satu hal yang harus Anda lakukan adalah memastikan bahwa server SSH tidak mengizinkan login kata sandi untuk pengguna root.
Di sistem saya, saya punya pengaturan ini
tapi saya perhatikan di Ubuntu baru yang mereka miliki
Jika Anda membaca "man sshd_config" Saya pikir ini berarti "larangan kata sandi" yang lebih baru ini berarti hal yang sama dan tentunya lebih jelas artinya. Itu BUKAN default pada beberapa sistem Linux, tetapi mungkin harus.
Sekarang, tentang masalah Anda. Apakah server sistem Anda hanya beberapa pengguna di tempat tertentu? Melakukan hal ini!
edit /etc/hosts.deny dan masukkan
SEMUA SEMUA
Kemudian edit /etc/hosts.allow dan daftarkan nomor IP atau rentang yang ingin diizinkan menggunakan SSH. Notasi ada sedikit membingungkan karena jika Anda ingin mengizinkan semua sistem dengan nomor IP seperti 111.222.65.101 hingga 111.222.65.255, Anda memasukkan entri seperti ini di hosts.allow
Itu adalah solusi yang kuat dan kuat. Jika pengguna Anda dapat dihitung berdasarkan rentang IP, lakukanlah!
Solusi ini ada sebelum tabel IP dibuat, itu (saya pikir) jauh lebih mudah untuk dikelola, tetapi tidak sebagus solusi tabel IP karena rutin tabel IP akan mengenali musuh lebih cepat daripada program yang dijalankan oleh hosts.allow dan host .menyangkal. Tapi ini adalah cara yang pasti, cara mudah untuk menutup banyak masalah, bukan hanya dari SSH.
Perhatikan masalah yang Anda buat sendiri. Jika Anda ingin membuka server FTP, server web, atau yang lainnya, Anda harus membuat entri di host diizinkan.
Anda dapat mencapai tujuan dasar yang sama dengan mengutak-atik iptables dan firewall. Dalam arti tertentu, ini adalah solusi yang lebih disukai karena Anda memblokir musuh di batas luar. Ubuntu memiliki "ufw" (firewall yang tidak rumit) dan "man ufw" memiliki banyak contoh. Saya lebih suka memiliki GUI yang bagus untuk mengarungi ini, saya tidak harus melakukan ini sepanjang waktu. Mungkin orang lain bisa memberi tahu kami jika ada sekarang.
Sumber frustrasi lain akan terjadi ketika beberapa pengguna mengumpulkan kunci ssh yang berbeda untuk berbagai server. Karena saya memiliki kunci SSH untuk sekitar 12 proyek yang berbeda, sekarang ssh gagal karena saya memiliki terlalu banyak kunci publik (Memerlukan salah satu "ssh -o PubkeyAuthentication = false" atau membuat entri dalam file .ssh / config. Ini adalah PITA)
Dalam sistem Centos Linux kami, saya perhatikan mereka menjatuhkan paket denyhosts dan hanya menawarkan fail2ban. Saya suka denyhosts karena membangun daftar rentang pengguna / ip yang merepotkan dan kemudian di hosts.deny, daftar itu dicatat. Kami memasang fail2ban sebagai gantinya dan itu OK. Pemahaman saya adalah bahwa Anda lebih suka memblokir pengguna jahat ini di tepi luar server, sehingga pemblokir berbasis tabel ip, seperti fail2ban, sebenarnya lebih baik. Denyhosts bekerja pada level sekunder, setelah musuh mendapatkan iptables masa lalu, mereka kemudian ditolak oleh daemon sshd.
Di kedua program ini, agak membosankan untuk mengeluarkan pengguna dari penjara jika mereka lupa kata sandi mereka dan mencoba beberapa kali untuk masuk. Agak sulit untuk membuat orang kembali ketika mereka membuat kesalahan masuk. Anda mungkin mengira akan ada GUI point-and-click di mana Anda bisa menunjuk dan membiarkan orang-orang kembali, tetapi tidak seperti itu. Saya hanya perlu melakukan ini setiap beberapa bulan dan lupa bagaimana setiap kali, jadi saya menulis instruksi untuk diri saya di halaman web saya http://pj.freefaculty.org/blog/?p=301
sumber