Menggunakan database log Mikrotik untuk menekan kekerasan

Selamat siang

Dalam publikasi sebelumnya , saya berbicara tentang bagaimana, dengan mudah dan alami, Anda dapat mengkonfigurasi pengumpulan metadata lalu lintas jaringan pada router Mikrotik dalam database.

Sekarang saatnya mengajar server kami untuk melakukan analisis elementer dari data yang diterima dan mengirim perintah kembali.

Tujuan: Kontrol dinamis aturan firewall Mikrotik untuk menekan serangan jaringan dengan menebak kata sandi.

Berarti: Distribusi Linux segar dengan rsyslogd v8, crond, mariadb DBMS dan router Mikrotik itu sendiri.

Mekanika: Menggunakan tugas yang diberikan, kueri SQL dijalankan dalam database dengan akumulasi dan data lalu lintas yang diperbarui dan mengembalikan daftar alamat IP keluar, skrip bash yang diluncurkan oleh mahkota menghasilkan perintah Mikrotik dan, menggunakan koneksi ssh, mengisi kembali daftar alamat untuk aturan pemblokiran yang ada.

Ini akan tentang melindungi port TCP terbuka. Ini bisa berupa port yang memasuki Mikrotik dan diteruskan ke jaringan lokal.

Untuk memulainya, kami menunjukkan di mana mungkin ada kelemahan:

  • Protokol kontrol ssh, telnet, web, router winbox
  • Layanan email smtp, pop, imap
  • Layanan web apa pun yang disediakan di luar
  • Remote Desktop MS RDP, VNC, dll.
  • Ada lagi yang menurut pertimbangan Anda

Menulis kueri SQL untuk mencari brute force

Organisasi kami memiliki server terminal terbuka ke luar melalui port non-prioritas.
Di DNAT Mikrotik saya menyalakan logging aturan yang diperlukan dengan menambahkan awalan RDP_DNAT. Dengan awalan ini kami akan mencari:

MariaDB [traflog]> select src,dport,count(dport) as ' ' from traffic where datetime>now() - interval 1 day and logpref='RDP_DNAT' group by src having count(dport)>50; +-----------------+-------+---------------------------------------+ | src | dport |   | +-----------------+-------+---------------------------------------+ | 185.156.177.58 | 12345 | 118 | | 185.156.177.59 | 12345 | 267 | | 193.238.46.12 | 12345 | 318 | | 193.238.46.13 | 12345 | 319 | | 193.238.46.99 | 12345 | 342 | | 194.113.106.150 | 12345 | 67 | | 194.113.106.152 | 12345 | 167 | | 194.113.106.153 | 12345 | 190 | | 194.113.106.154 | 12345 | 192 | | 194.113.106.155 | 12345 | 190 | | 194.113.106.156 | 12345 | 216 | | 194.113.106.158 | 12345 | 124 | +-----------------+-------+---------------------------------------+ 12 rows in set (0.06 sec) 

Permintaan ini menunjukkan alamat ip (dari mana serangan itu datang), port tempat koneksi dibuat (nomor port diubah) dan jumlah upaya koneksi, dengan pengelompokan awal dengan src dan pemilihan garis, dengan jumlah upaya lebih dari 50 di masa lalu, dari saat saat ini, hari.

Dalam kasus saya, alamat ini dapat dilarang dengan aman, karena jumlah koneksi dengan klien "baik" kurang, tidak lebih dari 5-10 per hari dari satu ip.

Permintaan berfungsi dengan baik, cepat, tapi agak panjang. Untuk penggunaan lebih lanjut, saya mengusulkan untuk membuat tampilan, yang akan menyalin lebih sedikit di masa depan:

 MariaDB [traflog]> create or replace view rdp_brute_day as select src, dport, count(dport) from traffic where datetime>now() - interval 1 day and logpref='RDP_DNAT' group by src having count(dport)>50; Query OK, 0 rows affected (0.23 sec) 

Mari kita periksa bagaimana cara kerjanya:

 MariaDB [traflog]> select src,count(dport) from rdp_brute_day; +----------------+--------------+ | src | count(dport) | +----------------+--------------+ | 185.156.177.58 | 11 | +----------------+--------------+ 1 row in set (0.09 sec) 

Bagus

Kami menambahkan pengguna Mikrotik dengan otorisasi dengan kunci dsa

Di konsol linux, kami membuat kunci dsa, di bawah pengguna atas nama siapa tugas yang dijadwalkan akan diluncurkan, saya buat dari root:

 root@monix:~# ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/root/.ssh/id_dsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_dsa. Your public key has been saved in /root/.ssh/id_dsa.pub. ... 

Frasa sandi tidak diperlukan. Kami menyalin kunci publik /root/.ssh/id_dsa.pub ke Mikrotik dengan cara apa pun yang memungkinkan. Saya membawanya keluar dengan perintah cat, menyalin teks dari jendela dempul ke dalam file teks, menyimpannya dan menyeretnya ke jendela file winbox.

Saya tidak tahu mengapa, tetapi selama operasi berikut melalui antarmuka winbox terjadi kesalahan. Saat terhubung dari server melalui ssh, Mikrotik juga meminta kata sandi dari saya. Setelah saya menghapus pengguna yang dibuat dan melakukan semua operasi melalui konsol, koneksi dsa berfungsi. Apakah kira-kira seperti yang dijelaskan di sini .

Secara umum, saya menerima entri selamat datang tanpa kata sandi menggunakan kunci dsa dan menjalankan perintah verifikasi:

 root@monix:/# ssh rsyslogger@192.168.0.230 /system resource print uptime: 2w1d5h22m43s version: 6.43.2 (stable) ... 

Bagus

Menulis skrip bash

Scriptnya tidak rumit:

 mikrotik_cmd_list(){ brute_src_list=$(mysql --skip-column-names traflog -e 'select src from rdp_brute_day') for src in $brute_src_list do echo "ip firewall address-list add address=$src list=rdp_banlist timeout=1d" done } mikrotik_cmd_list | ssh -T rsyslogger@192.168.0.230 

Untuk mentransfer semua perintah dalam koneksi ssh yang sama, saya perlu menjelaskan fungsi mikrotik_cmd_list (), di mana permintaan pertama kali dilakukan dengan menyimpan alamat ip ke variabel brute_src_list, kemudian dalam loop variabel ini secara berurutan menghasilkan perintah untuk Mikrotik. Setelah memanggil fungsi, output dialihkan melalui pipa ke ssh.

Jangan lupa untuk menutup hak akses skrip untuk semua orang kecuali root dan membuat file tersebut dapat dieksekusi.
Perintah yang dihasilkan skrip akan menambahkan alamat ip ke rdp_banlist selama 1 hari, setelah waktu ini akan dihapus dari daftar itu sendiri. Jika Anda ingin meninggalkannya selamanya, hapus opsi batas waktu.

Tambahkan aturan ke firewall

Saya datang dengan dua opsi untuk bagaimana menggunakan rdp_banlist:

Opsi satu: tambahkan rdp_banlist dengan tanda seru ke aturan NAT dengan awalan RDP_DNAT.

 add action=dst-nat chain=dstnat comment="..." dst-address=1.2.3.4 dst-port=12345 log=yes log-prefix=RDP_DNAT protocol=tcp src-address-list=\ !rdp_banlist to-addresses=192.168.200.181 to-ports=3389 

Sesuatu seperti itu. Yaitu, kami melakukan semuanya, kecuali apa yang ada di rdp_banlist.

Dalam opsi ini, ada plus dan minus.

Kelebihannya adalah koneksi akan segera berhenti.

Kelemahannya adalah bahwa ip ini tidak akan lagi masuk ke database traflog dan setelah sehari, ketika batas waktu penyimpanan dalam daftar hitam telah berlalu, ia akan mulai omong kosong lagi.

Opsi dua: tambahkan rdp_banlist dengan tanda seru ke aturan firewall rantai maju, di mana kami mengizinkan lalu lintas melewati TCP 3389, mirip dengan cara dalam metode pertama.

 add action=accept chain=forward comment="..." dst-port=3389 log=yes log-prefix=ACCEPT_RDP protocol=tcp src-address-list=\ !rdp_banlist to-ports=3389 

Sesuatu seperti itu. Kami mengizinkan semuanya kecuali yang ada dalam daftar larangan.

Ada juga yang plus dan minus.

Plus. Log dengan awalan RDP_DNAT akan terus di-stream dalam database traflog, yang dengannya kami menentukan tanda serangan. Akibatnya, ketika batas waktu larangan untuk host tertentu yang melanjutkan upaya brute force berakhir, itu akan ditambahkan ke daftar larangan lagi setelah peluncuran tugas yang dijadwalkan berikutnya.

Kelemahannya adalah bahwa hal itu terus terjadi di tabel DSTNAT, membuat rekor baru dengan setiap koneksi, meskipun sementara.

Secara umum, keputusan ada di tangan Anda, saya memilih keduanya :) (pada kenyataannya, hanya yang pertama yang bekerja dalam kasus ini), karena yang kedua dihidupkan sebelumnya dan mekanika berbeda di sana, berdasarkan entri berurutan dalam daftar stage1, stage2, stage3, banlist ... yah, Anda mengerti maksudnya. Trik lama dan tidak terlalu dapat diandalkan, ini dapat dengan mudah melarang klien "baik" dan pada saat yang sama melewatkan yang "buruk" yang dengan sopan menghitung batas waktu stage1.

Crontab pekerjaan yang dijadwalkan

Tetap menambahkan tugas yang ditugaskan ke crontab:

 root@monix:/root# echo '12 * * * * root /usr/share/traflog/scripts/rdp_brute.sh >/dev/null 2>&1' >> /etc/crontab 

Catatan seperti itu akan menjalankan skrip setiap jam dalam 12 menit.

Harus saya akui, saya baru saja selesai mengerjakan mekanik ini hari ini dan dengan tingkat probabilitas tinggi, ada yang tidak beres. Menurut keadaan saya akan melengkapi dan memperbaiki kesalahan. Saya ingin minum untuk tidur nyenyak di liburan Tahun Baru, itu sebabnya saya terburu-buru untuk menyelesaikannya.
Itu mungkin saja.

Terima kasih atas perhatian dan Selamat Tahun Baru!

Referensi:

Dokumentasi Mysql
Dokumentasi firewall mikrotik
Terima kasih kepada Andrey Smirnov untuk artikel tentang koneksi dsa.

Source: https://habr.com/ru/post/id434736/


All Articles