Ratusan login ssh gagal

81

Setiap malam saya mendapatkan ratusan, kadang-kadang ribuan, gagal login ssh di server RedHat 4 saya. Untuk alasan firewall dari situs jarak jauh, saya perlu menjalankan port standar. Adakah yang harus saya lakukan untuk memblokir ini. Saya perhatikan bahwa banyak yang datang dari alamat IP yang sama. Bukankah itu harus menghentikan mereka setelah beberapa saat?

MattMcKnight
sumber

Jawaban:

67

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.

Evan Anderson
sumber
1
Saya suka solusi ini dan saya berencana untuk menempatkannya di tempat malam ini, begitu saya bisa memadamkan hari ini.
MattMcKnight
2
Ini memperlambat serangan dan saya sangat merekomendasikannya, tetapi karena ada botnet pemindaian yang didistribusikan, itu bukan obat mujarab. Masih akan ada log masuk yang tidak valid dari botnet yang menjalankan pindaian terdistribusi terhadap Anda. Ada tidak benar-benar terlalu banyak yang dapat Anda lakukan tentang itu, pendek semacam "port knocking" skema untuk jarak jauh membawa port SSH ketika Anda ingin masuk.
Evan Anderson
1
+1 untuk saran "ketukan port" dari @ Evan. Beberapa info: linux.die.net/man/1/knockd . Tapi jangan lakukan itu dengan cara halaman manual (yaitu, menambahkan / menghapus aturan iptables), tetapi sebaliknya gunakan -m conditionpencocokan iptables sebagai gantinya.
pepoluan
2
tidakkah Anda perlu --port 22 dalam aturan ini sehingga hanya diterapkan untuk lalu lintas ssh?
clime
2
@limlim - Yap. Sulit dipercaya ini sudah ada di sini 2 1/2 tahun dan tidak ada yang memperhatikan! Tangkapan yang bagus.
Evan Anderson
39

fail2ban dapat membantu dengan memblokir alamat IP dengan terlalu banyak upaya login yang gagal.

Kyle Brandt
sumber
11
i dont like tools / skrip membaca log dan perintah masalah atas nama pengguna sysadmin
asdmin
2
@ asdmin, ya, terutama ketika mereka memiliki rekam jejak yang bagus ...
maxschlepzig
25

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.

KPWINC
sumber
6
Saya tidak tahu mengapa orang memuji ini; SSH ada di port standar 22. Ini berarti bahwa ketika Anda berada di jaringan asing, Anda tidak bergantung pada mereka yang membuka port non-standar melalui firewall outbound. Solusi nyata untuk masalah ini didokumentasikan di atas, baik membatasi jumlah koneksi ulang melalui firewall masuk Anda, atau, matikan login kata sandi.
Andrew Taylor
1
OpenSSH 6.7 menjatuhkan dukungan tcpwrappers , yang digunakan oleh denyhosts.
Zoredache
15

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:

# /etc/hosts.deny fragment
sshd:  all

Izinkan sistem yang dikenal dengan IP di /etc/hosts.allow, plus tambahkan file untuk akses sementara:

# /etc/hosts.allow fragment
sshd:  10.0.10.2     # some system
sshd:  172.99.99.99  # some other system
sshd:  /etc/hosts.allow.temporary-sshd-access

Buat file php di server web Anda dan berikan nama yang tidak jelas seperti my-sshd-access.php:

<?php
function get_ip()
{
    return getenv("REMOTE_ADDR"); 
}

?>

<?php
$out='/etc/hosts.allow.temporary-sshd-access';
$log='/var/log/sshd-access-addition-log';

print "Was:";
readfile($out);
print "<br>";
$ip=get_ip();
$fp=fopen($out,"w");
fputs($fp,$ip);
fclose($fp);

$lfp=fopen($log,"a");
fputs($lfp,$ip);
fputs($lfp,"n");
fclose($lfp);

print "Wrote: ";
readfile($out);
?>

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):

$ wget http://your.system.name/my-sshd-access.php

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.

David Mackintosh
sumber
Untuk membuat ini lebih aman, jalankan halaman ini di https.
Robert Munteanu
Jika Anda mengubah skrip sehingga tidak menghasilkan konten dari file "alamat sementara IP yang dibolehkan", tidak akan ada apa pun bagi calon sniffer untuk mengendus. Kemudian Anda dapat menjalankannya di http, bukan https.
Barry Brown
"Alamat IP sementara yang diizinkan" selalu milik pemohon (yaitu milik Anda). Saya pikir itu tidak penting. Https berarti bahwa URL yang diminta dienkripsi yang artinya tidak mudah untuk mengendusnya.
David Mackintosh
Ini tidak akan berfungsi jika Anda berada di jaringan yang proksi koneksi HTTP tetapi rute langsung Anda ke internet melalui jalan keluar yang berbeda.
Andrew Taylor
OpenSSH 6.7 menjatuhkan dukungan tcpwrappers , yang digunakan dalam jawaban Anda.
Zoredache
2

solusi lain hanya memindahkan ssh ke port lain. cacing ini sangat bodoh.

disserman
sumber
3
Poster asli mengatakan dia perlu berjalan di pelabuhan standar.
kbyrd
1
maaf, saya harus membaca pertanyaan lebih hati-hati :)
disserman
1
Saya harus setuju ... Saya menjalankan SSH pada port "alternatif" dan itu membuat DUNIA perbedaan dalam log. Cacing-cacing itu sama pintarnya dengan batu bata, jadi ia bekerja dengan baik terhadap skrip otomatisasi yang bodoh; tidak begitu baik terhadap penyerang manusia. Namun, log memiliki suara kebisuan yang diberkati di dalamnya ...
Avery Payne
..bukannya bot itu "bodoh", itu karena mereka dirancang untuk mencari buah yang menggantung rendah. Jadi memindahkan port SSH dalam gaya ..jaga buah Anda dari tanah.
elrobis
2

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 .

Evan
sumber
1

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.

goldpseudo
sumber
1

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
0

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
0

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).

gbjbaanb
sumber
0

Saya telah menggunakan fail2ban dan telah membantu saya keluar banyak.

tehjay
sumber
0

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