Fail2ban: Penambahan pola tanggal dalam file filter

Dibuat pada 6 Jun 2018  ·  7Komentar  ·  Sumber: fail2ban/fail2ban

Lingkungan:

_Isi dan centang ( [x] ) kotak yang sesuai. Jika versi Fail2Ban Anda sudah usang,
dan Anda tidak dapat memverifikasi bahwa masalah tetap ada dalam rilis terbaru, lebih baik cari dukungan
dari distribusi yang Anda peroleh Fail2Ban dari_

  • Versi Fail2Ban (termasuk sufiks distribusi yang mungkin): 0.9-6
  • OS, termasuk nama/versi rilis: Centos 06
  • [x ] Fail2Ban diinstal melalui OS/mekanisme distribusi
  • [ ] Anda belum menerapkan patch asing tambahan ke basis kode
  • [ ] Beberapa penyesuaian dilakukan pada konfigurasi (berikan detail di bawah ini)

Masalah:

datepattern untuk log Tomcat tidak sesuai dengan standar tanggal mana pun
Oleh karena itu, filter menangkap string yang diperlukan dari log tetapi tidak dapat mencari waktu tanggal
_Ringkasan di sini_
Pola tanggal yang disebutkan dalam log Tomcat adalah: (/var/log/Tomcat2/catalina.out)

**[06-Jun-2018_19:37:41,631]** [INFO] [mithi.mcs.auth.MithiAuthService(doAuth)]  - <Authentication for user : [email protected] for service : IMAP from ip : 192.168.0.124 finished with status :  Failure. unknown status. Return Code : 108. Execution finished in : 58 ms>

Langkah-langkah untuk mereproduksi

filter dibuat untuk menangkap log di atas:

failregex = (?:Authentication for user :) .*(?:from ip : (?P<host>\S*)).*(?:finished with status :  Failure).*(?: Return Code : ).*
ignoreregex = (?:Authentication for user :) .*(?:from ip : (?P<host>\S*)).*(?:finished with status :  Failure).*(?:Return Code : 114).*

Perilaku yang diharapkan

  1. Filter di atas harus menangkap login yang gagal
  2. Filter harus melewati login yang gagal jika nilai kode Pengembalian adalah 114

Perilaku yang diamati

  1. Filter yang dibuat tidak dapat mengurai tanggal dari log /var/log/Tomcat2/catalina.out

    Informasi tambahan apa pun

Konfigurasi, dump, dan kutipan bermanfaat lainnya

  1. Tidak ada perubahan pada jail.config
  2. Membuat penjara di jail.local untuk menangkap login yang gagal (nama = trialJail)

    Penyesuaian apa pun yang dilakukan pada /etc/fail2ban/configuration

Menambahkan penjara di jail.local

[trialJail]

enabled = true
filter = multiService
action = iptables-multiport[name=trialJail, port="smtp,imap,pop3", protocol=tcp]
logpath = /var/log/tomcat2/catalina.out
findtime = 1200
bantime = 30
maxretry = 2
ignoreip =

Bagian yang relevan dari file /var/log/fail2ban.log:

_sebaiknya diperoleh saat menjalankan fail2ban dengan loglevel = 4 _

  1. Kesalahan yang dilemparkan oleh fail2ban karena tidak dapat mengurai tanggal adalah sebagai berikut:
Jun  6 19:37:41 Master fail2ban.filter[7747]: WARNING Found a match for u'[06-Jun-2018_19:37:41,631] [INFO] [mithi.mcs.auth.MithiAuthService(doAuth)]  - <Authentication for user : [email protected] for service : IMAP from ip : 192.168.0.124 finished with status :  Failure. unknown status. Return Code : 108. Execution finished in : 58 ms>' but no valid date/time found for u'[06-Jun-2018_19:37:41,631] [INFO] [mithi.mcs.auth.MithiAuthService(doAuth)]  - <Authentication for user : [email protected] for service : IMAP from ip : 192.168.0.124 finished with status :  Failure. unknown status. Return Code : 108. Execution finished in : 58 ms>'. Please try setting a custom date pattern (see man page jail.conf(5)). If format is complex, please file a detailed issue on https://github.com/fail2ban/fail2ban/issues in order to get support for this format.

Baris yang relevan dari file log yang dipantau yang dimaksud:

Baris log yang saya kerjakan adalah: (baris yang perlu ditangkap)

[06-Jun-2018_17:07:42,500] [INFO] [mithi.mcs.auth.MithiAuthService(doAuth)]  - <Authentication for user : [email protected] for service : **IMAP** from ip : 192.168.0.124 finished with status :  Failure. unknown status. Return Code : 108. Execution finished in : 280 ms>
[06-Jun-2018_17:09:57,596] [INFO] [mithi.mcs.auth.MithiAuthService(doAuth)]  - <Authentication for user : [email protected] for service : null from ip : null finished with status :  Failure. invalid parameters are provided to function. Return Code : 106. Execution finished in : 1 ms>
[06-Jun-2018_17:25:20,653] [INFO] [mithi.mcs.auth.MithiAuthService(doAuth)]  - <Authentication for user : [email protected] for service : **POP** from ip : 192.168.0.124 finished with status :  Failure. unknown status. Return Code : 108. Execution finished in : 84 ms>

Fokus utama dari pertanyaan ini adalah bagaimana saya mengurai pola tanggal?
Pertanyaan bonus adalah bagaimana cara menangkap semua log di atas dalam satu filter tunggal (sesuatu yang sedang saya kerjakan (port: smtp,pop3,imap))

documentation

Semua 7 komentar

bagaimana cara mengurai pola tanggal

Pola Anda misalnya '^[%d-%b-%Y_%H:%M:%S,%f]'.

Catatan, di file konfigurasi, Anda harus menentukannya dengan karakter persen ganda, seperti:

datepattern = ^\[%%d-%%b-%%Y_%%H:%%M:%%S,%%f\]

PoC:

$ fail2ban-regex -v -d '^\[%d-%b-%Y_%H:%M:%S,%f\]' "$str" 'from ip : <HOST>'

Running tests
=============

Use      datepattern : ^\[Day-MON-Year_24hour:Minute:Second,Microseconds\]
Use   failregex line : from ip : <HOST>
Use      single line : [06-Jun-2018_17:07:42,500] [INFO] [mithi.mcs.auth....


Results
=======

Failregex: 1 total
|-  #) [# of hits] regular expression
|   1) [1] from ip : <HOST>
|      192.168.0.124  Wed Jun 06 17:07:42 2018
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
|  [1] ^\[Day-MON-Year_24hour:Minute:Second,Microseconds\]
`-

Lines: 1 lines, 0 ignored, 1 matched, 0 missed
[processed in 0.00 sec]

Perhatikan juga bahwa fail2ban memotong datepattern pencocokan tanggal-waktu dari string sebelum mencari kecocokan untuk failregex.

pertanyaan bonus

Jawaban bonus - baca manual, misalnya mulai dengan Sintaks Ekspresi Reguler :: Dokumentasi Python .
Misalnya port yang Anda login: smtp,pop3,imap mungkin seperti
for service : (?:SMTP|POP3|IMAP|null) from ip ,
atau seperti bukan-spasi \S+ regex:
for service : \S+ from ip ...

Itu bekerja dengan baik, terima kasih Pak
Pertanyaan lain, saya memiliki pola regex abaikan ke log di atas yang lolos dari Return Code : 114.
ignoreregex = .*(?:Return Code : 114.).*
Perintah abaikanregex di atas berfungsi dengan baik untuk keluar dari Kode Pengembalian : 114.
Jadi pertanyaannya adalah , bagaimana saya menyebutkan abaikanregex di atas dalam failregex itu sendiri untuk menangkap semua Kode tetapi tidak 114 sehingga untuk menghindari perhitungan abaikanregex ?
Failregex yang berfungsi untuk semua Kode adalah - (berfungsi)
failregex = (?:for service :).* (?:smtp|POP|IMAP|null).*(?:from ip : <HOST>).*(?: finished with status : Failure.).*(?:Return Code : ).*
Failregex yang akan mendapatkan semua Kode tetapi tidak 114 adalah - (tidak berfungsi)
Sejauh ini saya sudah mencoba,

> failregex = (?:for service :).* (?:smtp|POP|IMAP|null).*(?:from ip : <HOST>).*(?: finished with status : Failure.).*(?!.*Return Code : 114.).*

Sesuatu seperti .*(?!.*Return Code : 114.).* tidak akan pernah berfungsi (apalagi rentan), karena catch all .* akan selalu menemukan sesuatu, misalnya dengan something. Return Code : 114. ia dapat menangkap something. R dan sisanya eturn Code : 114. tidak cocok dengan pandangan negatif Anda.

Jadi, Anda sebaiknya menggunakan pola yang lebih tepat:

>>> import re
>>> cr = re.compile(r"\S+\. Return Code : (?!114)\d+\.")
>>> print(bool(cr.match("something. Return Code : 108.")))
True
>>> print(bool(cr.match("something. Return Code : 114.")))
False

Dan last but not least, jangan gunakan catch-alls dan coba jangkar regex (setidaknya dari satu sisi, misalnya dari awal ^... atau dari keduanya ^...$ , perhatikan .*$ atau ^.* bukan jangkar dan tidak masuk akal).
Jadi lebih tepat dalam regex, terutama jika beberapa input asing (pengguna) dapat terjadi di log-line. Jika tidak, Anda membuatnya rentan bagi penyusup (misalnya dengan memanipulasi saluran, ia dapat menghindari deteksi atau bahkan dapat memaksa untuk melarang IP lain alih-alih IP aslinya.

Bagaimana cara menerapkannya di gagal regex? Saya telah menyediakan regex yang berfungsi untuk semua nomor di komentar saya sebelumnya, saya ingin menerapkan satu yang mengabaikan 114 di failregex itu sendiri. Terima kasih atas waktu dan bantuannya :)

Maaf, tidak ada waktu ATM untuk membuat regex Anda sepenuhnya benar. Dan saya tidak membuat solusi cepat dan kotor pada prinsipnya.
Coba situs serupa stackoverflow.

Inilah kamu:

^\s*\[\S+\]\s+\[[^\]]+\]\s+-\s+<Authentication for user : \S+[^:]* for service : \S+ from ip : <HOST> finished with status :  Failure\.\s+(?:[^.]+\.)* Return Code : (?!114)\d+\.

Tapi, filter yang mungkin sedikit lebih tepat akan terlihat seperti:

[Definition]

# services (smtp,imap,etc,...):
_services = (?:\S+)

# all errors (not-precise):
#_errors = (?:[^.]+\.)*
# only expected errors (more precise), example:
#_errors = (?:unknown status|authenication error|something else)\.
_errors = (?:unknown status)\.

# return-codes (any excepting 114):
_ret_codes = (?!114)\d+

failregex = ^\s*\[\S+\]\s+\[[^\]]+\]\s+-\s+<Authentication for user : \S+[^:]* for service : %(_services)s from ip : <HOST> finished with status :  Failure\.\s+%(_errors)s Return Code : %(_ret_codes)s\.

[Init]

datepattern = ^\[%%d-%%b-%%Y_%%H:%%M:%%S,%%f\]

Anda memiliki 3 variabel interpolasi tambahan (dimulai dengan garis bawah) untuk mengontrol apa yang seharusnya dilarang.
Anda juga dapat menggunakan substitusi _errors pertama (dikomentari) untuk semua kemungkinan kesalahan, tetapi seperti yang dikatakan komentar - itu tidak tepat ... dan saya tidak suka pelonggaran seperti itu tanpa mencari format semua kemungkinan format pesan log di sana.
Tetapi saya yakin Anda dapat memperluas daftar ini sendiri seperti pada contoh di atas.

Failregex sekarang dapat melakukan pekerjaan mengabaikanregex di dalam dirinya sendiri !!
Saya mengerti bahwa fungsi abaikanregex disediakan untuk memperjelas hal-hal dengan fungsi yang tersedia.
Contoh di atas memperjelas betapa fleksibelnya filter pada skenario yang berbeda.
Terima kasih atas waktu dan bantuan Anda.
Selamat siang, Pak :)

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

TommyFrass picture TommyFrass  ·  5Komentar

mvastola picture mvastola  ·  7Komentar

AleksCee picture AleksCee  ·  5Komentar

Vagrantin picture Vagrantin  ·  4Komentar

eNTi picture eNTi  ·  4Komentar