Bagaimana cara mengamankan server ubuntu dari serangan bruteforce ssh?

21

Saya memiliki kata sandi saya aman, tetapi saya mendengar orang-orang mengeluh tentang kinerja server turun secara drastis ketika serangan bruteforce terjadi. Bagaimana saya bisa mengamankan server ubuntu 10.10 saya dari serangan seperti itu? Apakah ada profil apparmor untuk ini? Atau cara lain untuk mengatasinya?

Dziamid
sumber

Jawaban:

19

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 iptablesuntuk 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
Pedram
sumber
Mengenai pembubaran otentikasi kata sandi, bagaimana cara saya login ke server jika saya kehilangan kunci publiknya? (Saya tidak memiliki akses fisik ke server, ini adalah VPS)
Dziamid
Kunci publik dapat dipublikasikan di mana pun Anda inginkan. Jadi jangan khawatir tentang hal itu. Anda dapat meletakkannya di tempat yang Anda yakin tidak akan melupakannya bahkan di tempat umum.
Pedram
Baca selengkapnya di sini: en.wikipedia.org/wiki/Public-key_cryptography
Pedram
Apakah ada cara untuk mengatur server untuk mengungkapkan kunci publik ketika ditanya?
Dziamid
1
Menggunakan ssh, saya kira tidak. Jika Anda memiliki server web yang diinstal seperti apache, Anda dapat membagikan kunci menggunakan web.
Pedram
8

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.

DrSAR
sumber
1
/Var/log/auth.log saya telah berkembang pesat belakangan ini. Apakah entri seperti ini 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=rootmenunjukkan adanya serangan?
Dziamid
1
Nah, ini berarti seseorang di IP 218.15.136.38 mencoba masuk sebagai root. Bisa jadi Anda, tetapi kemungkinan besar bukan karena menggunakan tools.whois.net/whoisbyip , saya dapat melihat bahwa IP ini terdaftar di China yang cukup jauh dari Minsk ;-) Jadi, ya, ini sepertinya tebakan kata sandi Anda . Moral: Nonaktifkan login root melalui ssh (PermitRootLogin tidak ada di / etc / ssh / sshd_config) karena tidak ada alasan yang baik untuk meninggalkan ini. Dan kemudian pertimbangkan denyhosts atau fail2ban. Juga, pastikan Anda memiliki firewall untuk membiarkan hanya akses penting melalui port 22 dan apa pun yang Anda butuhkan (tetapi tidak lebih)
DrSAR
6
  1. Ubah port sshd ke sesuatu yang tidak standar
  2. Gunakan knockduntuk menerapkan port-mengetuk sistem
  3. Gunakan iptables recentdan hashlimitcocok untuk membatasi upaya SSH berturut-turut
  4. Jangan menggunakan kata sandi, tetapi gunakan kunci SSH sebagai gantinya
pepoluan
sumber
3
-1 untuk saran pertama, merumitkan hal-hal yang sebenarnya tidak ada peningkatan keamanan nyata
steabert
Jika Anda menggunakan kunci ssh dan mematikan otentikasi kata sandi melalui ssh, apakah saya benar-benar membutuhkan 1,2,3?
Dziamid
4
@steabert itu membantu melawan skrip kiddies yang hanya mencoba untuk memaksa melalui port 22. itu pengalaman saya: seseorang terus bruteforcing server yang menghadap Internet ketika saya sedang menyiapkannya, membuat sistem mengirimi saya peringatan setelah peringatan. Saya pindah pelabuhan, dan peringatan mereda.
pepoluan
Kunci ssh @Dziamid mencegah seseorang membobol sistem Anda. tetapi itu tidak menghentikan mereka untuk mencoba terhubung ke port 22.
pepoluan
3
@ Dziamid Tidak, tidak benar. Metode otentikasi lainnya (RSAAuthentication, PubkeyAuthentication, #KerberosAuthentication dll) semua masih melakukan kontak melalui port 22.
DrSAR
3

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

ddeimeke
sumber
Bagaimana cara saya terhubung ke server jika saya kehilangan kunci publiknya?
Dziamid
1
Hanya melalui konsol atau akses langsung. Saya cukup yakin bahwa Anda tidak akan kehilangan kunci Anda jika Anda dapat mengelola server.
ddeimeke
0

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.

bitwelder
sumber
0

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:

  • Anda harus menggunakan CSF sebagai firewall Anda agar LFD dapat melakukan tugasnya. Jadi jika Anda memiliki firewall yang ada, Anda harus menggantinya dengan CSF, dan port konfigurasi Anda selesai.
  • Itu tidak dikemas untuk Ubuntu. Anda harus mempercayai pembaruan otomatis dari configserver.com, atau menonaktifkan pembaruan otomatis.
  • Saya telah mendengar ini cukup populer, jadi penyusup yang pintar mungkin akan tahu cara menonaktifkan deteksi intrusi sebelum terdeteksi!
joeytwiddle
sumber
0

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.

  1. Di / etc / ssh / sshd_config pastikan Anda tidak pernah mengizinkan login root kecuali dengan kunci SSH.

Di sistem saya, saya punya pengaturan ini

PermitRootLogin without-password

tapi saya perhatikan di Ubuntu baru yang mereka miliki

PermitRootLogin prohibit-password

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!

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

ALL: 127.0.0.1
sshd: 111.222.65.
sshdfwd-X11: 111.222.65.

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.

  1. Posting lain di sini disarankan menggunakan kunci publik SSH hanya untuk pengguna Anda. Itu pasti akan membantu, dengan harga kompleksitas dan frustrasi untuk pengguna Anda. Di lab kami, ada 15 komputer. Pengguna masuk di antara komputer. Membutuhkan otentikasi kunci SSH akan menyebabkan kerumitan besar karena orang-orang pergi dari satu komputer ke komputer lain.

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)

  1. Jika Anda harus membiarkan server terbuka untuk SSH dari dunia luas, maka Anda harus menggunakan rutin penolakan untuk memblokir lokasi yang sering mencoba masuk. Ada 2 program bagus untuk ini, yang kami gunakan adalah denyhosts dan fail2ban . Program-program ini memiliki pengaturan yang memungkinkan Anda untuk melarang pelanggar, selama Anda suka.

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

pauljohn32
sumber