Mencegah serangan brute-force pada MySQL?

9

Saya perlu mengaktifkan jaringan untuk MySQLd, tetapi setiap kali saya melakukannya, server menjadi terabaikan. Beberapa skrip menebak kata sandi mulai memalu di server, membuka koneksi pada port 3306 dan mencoba kata sandi acak selamanya.

Bagaimana saya bisa menghentikan ini terjadi?

Untuk SSH, saya menggunakan denyhosts, yang berfungsi dengan baik. Apakah ada cara untuk membuat denyhosts berfungsi dengan MySQLd?

Saya juga mempertimbangkan untuk mengubah port yang sedang digunakan MySQL, tetapi ini kurang ideal dan hanya solusi stop-gap (bagaimana jika mereka menemukan port baru?)

Apakah ada yang punya ide lain?

Jika berbeda, saya menjalankan MySQL 5.x di FreeBSD 6.x.

Keith Palmer Jr.
sumber

Jawaban:

9

Saya tidak tahu paket perangkat lunak seperti denyhosts seperti untuk MySQL, tapi saya punya beberapa solusi:

  • Batasi login ke alamat IP tertentu. Jangan gunakan% untuk memungkinkan semua host terhubung ke server.
  • Yang lebih aman, atur iptables untuk hanya memungkinkan akses ke 3306 dari alamat IP resmi.
  • Tunnel traffic Anda ke kotak dengan ssh lalu hubungkan via localhost
  • Ubah skrip Denyhosts atau BFD untuk menganalisis log akses mysql dan memblokir segala upaya kekerasan di firewall

Edit :

Untuk menjawab komentar Anda, coba ini :

iptables -A INPUT -p tcp -s 202.54.1.50 --sport 1024:65535 -d 202.54.1.20 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -s 202.54.1.20 --sport 3306 -d 202.54.1.50 --dport 1024

Di mana .20 adalah MySQL Anda dan .50 adalah alamat IP penghubung jarak jauh.

Dave Drager
sumber
Beberapa catatan: Bagaimana saya bisa membatasi akses ke port 3306 hanya untuk satu set alamat IP yang diberikan? Hanya membatasi pengguna MySQL tidak berfungsi, karena mesin jarak jauh masih dapat terhubung dan memaksa untuk kata sandi. Terowongan SSH tampaknya agak tidak nyaman untuk diatur untuk pengguna akhir ... Apakah Anda memiliki contoh IPTables untuk melakukan ini?
Keith Palmer Jr.
2

1: Ubah port dari 3306. Bukan karena alasan keamanan yang lebih baik, tetapi untuk mengambil beban server untuk menghadapi serangan login yang salah

2: Buat sertifikat SSL dan aktifkan pada server MySQL Anda (itu harus-harus mengenkripsi koneksi server-klien Anda)

3: Buat satu atau lebih sertifikat klien (semua klien harus memiliki sertifikat dan perangkat lunak klien perlu dikonfigurasi untuk menggunakannya). Jika klien Anda .Net, Anda perlu mengonversi sertifikat klien ke format pkcs12, tetapi itu mudah dilakukan, lihat panduan ini ..

4: Setel akun pengguna MySQL untuk memerlukan sertifikat klien x509, maka penyerang keduanya memerlukan kredensial masuk DAN sertifikat klien (Anda bahkan dapat memasukkan kata sandi pada sertifikat klien, maka penyerang juga perlu meminta itu juga).

Saya menggunakan panduan ini untuk membuat sertifikat dan file kunci tetapi ada banyak panduan di luar sana.

Saya lebih suka hanya menggunakan koneksi SSH saya untuk mengakses kotak linux saya untuk tujuan administrasi, bukan untuk akses klien.

Tuan Calvin
sumber
Terima kasih atas jawabannya. Saya menggunakan panduan ini untuk melakukan # 2, 3 dan 4: digitalocean.com/community/tutorials/…
ofri cofri
1

Menggunakan MySQL Proxy, Anda bisa menulis skrip LUA kecil yang mengambil kombinasi pengguna / pass tetapi menunggu X detik untuk memproses login jika permintaan koneksi berasal dari rentang IP yang tidak disetujui.

Anda selanjutnya dapat menambahkan sedikit logika tambahan ke skrip LUA ke daftar hitam rentang IP setelah tiga upaya gagal.

Secara keseluruhan, ini bisa dilakukan secara teknis, tapi saya akan dengan rekomendasi lain untuk melakukan tunnel melalui SSH atau VPN ke rentang IP yang umum, masuk daftar putih (melalui FW atau cara lain).

Oscar
sumber
1 lagi penggunaan lain untuk MySQL Proxy :)
Andy
0

mengapa tidak mengizinkan akses ke port mysqld dari hanya host yang aman?

quaie
sumber
Saya mempertimbangkan hal ini, tetapi itu berarti saya harus memonitor perubahan alamat IP untuk 1.000+ klien. Itu akan sangat menyakitkan di pantat ... Bagaimana saya bisa melakukan ini? Ini tidak membantu untuk mengunci mereka dalam MySQL, karena mereka masih dapat terhubung ke server MySQL, hanya tidak benar-benar memilih database setiap ...
Keith Palmer Jr
1
mengutip dave Drager di atas: "Memodifikasi Denyhosts atau BFD script untuk menganalisis akses mysql log dan memblokir setiap upaya kekerasan di firewall" tampaknya ide yang terbaik atau menggunakan beberapa password hierogliphic :)
quaie
0

Meskipun ini bukan jawaban "nyata" - Saya tidak tahu mengapa Anda perlu memaparkannya ke dunia luar secara langsung.

Tidak bisakah Anda mengaktifkan ssh pada kotak itu, dan menggunakan tunneling untuk mengakses mesin db?

Atau solusi VPN lain untuk mengaksesnya (openvpn masuk akal).

Cerah
sumber
0

Bukan solusi nyata untuk masalah ini, tetapi mungkin membantu jika Anda hanya menjalankan server pada port yang berbeda. Sebagian besar bot pemindaian tersebut mungkin diprogram untuk hanya memeriksa 3306. Ini tidak akan menyelesaikan masalah, tetapi Anda mungkin akan mendapatkan lebih sedikit pemindaian dengan hanya mengubah port.

Eric Petroelje
sumber
-1 untuk keamanan oleh ketidakjelasan
thepocketwade
@thepocketwade - Itulah sebabnya saya katakan itu bukan solusi nyata untuk masalah ini. Tapi itu masih bisa membantu.
Eric Petroelje
0

Saya percaya koneksi harus di-firewall: cepat dan bagus. Ada banyak tutorial untuk iptables dan apa pun :)

Anda juga dapat menginstal cronjob di host klien yang akan menjalankan server untuk mencegah firewall memblokir host yang dikenal.

kolypto
sumber
0

menggunakan ssh untuk terowongan akan menjadi yang terbaik tetapi Anda bisa mencoba menggunakan fail2ban daripada menyangkal karena saya pikir ini bertujuan untuk memantau aplikasi yang lebih berbeda sehingga seharusnya tidak menjadi masalah menambahkan log mysql ke dalamnya.

Jure1873
sumber
0

Saran untuk dipertimbangkan untuk bagian my.cnf-ini [mysqld] Anda

max_connect_errors=10  # to limit hacker/cracker attempts to guess a password.

untuk menghindari ratusan upaya dalam 90 detik. Potong mereka pada 10 upaya.

Pertimbangkan sekali sehari FLUSH HOSTS untuk menghapus orang yang sah mencoba menggunakan sistem Anda yang TIDAK BISA mengingat kata sandi mereka. Mungkin dalam beberapa hari, mereka akan mendapatkannya.

Wilson Hauck
sumber