Fail2ban: Opsi tidak terbuka untuk ruang nama systemd

Dibuat pada 15 Jan 2021  ·  7Komentar  ·  Sumber: fail2ban/fail2ban

Lingkungan:

  • Versi Fail2Ban (termasuk akhiran distribusi yang mungkin): 0.11.1

    • Kode yang dikonsultasikan di HEAD dan masalah yang dikonfirmasi tidak terselesaikan.

    • Mencoba dengan paket python3-systemd default OS dan HEAD dari ' git repo .

  • OS, termasuk nama/versi rilis: Ubuntu 20.04.1 LTS
  • [x] Fail2Ban diinstal melalui OS/mekanisme distribusi
  • [x] Anda belum menerapkan patch asing tambahan ke basis kode
  • [x] Beberapa penyesuaian dilakukan untuk konfigurasi (berikan detail di bawah ini)

Masalah:

Ini adalah perpanjangan dari #2793, tetapi saya tidak dapat menggunakan ruang nama systemd seperti yang disarankan dalam masalah itu. Yaitu, menambahkan _NAMESPACE=whatever ke filter tidak berfungsi.

Langkah-langkah untuk mereproduksi

Yang terbaik yang bisa saya katakan, ini adalah masalah dengan systemd-python . Dalam mempersempit masalah setelah menambahkan ke journalmatch tidak berhasil, saya menjalankan yang berikut:

from systemd import journal
j = journal.Reader()
j.this_boot()
j.add_match(_SYSTEMD_UNIT="ssh.service", _NAMESPACE='auth')
for entry in j:
    print(str(j))

Itu tidak menghasilkan output, sedangkan saya pasti memiliki ratusan pesan.

Rupanya, fitur ini baru tersedia beberapa bulan dalam perubahan terbaru pada paket systemd-python .

Menginstal kode terbaru itu dan kemudian menjalankan:

from systemd import journal
j = journal.Reader(namespace='auth')
j.this_boot()
j.add_match(_SYSTEMD_UNIT="ssh.service")
for entry in j:
    print(str(j))

Saya bisa melihatnya bekerja dengan sempurna.

Melihat ini lebih jauh, tampaknya solusinya harus sesederhana menambahkan backend = systemd[namespace="auth"] ke konfigurasi.

Namun, satu-satunya hal yang mencegahnya adalah metode FilterSystemd._getJournalArgs saat ini tidak mengenali/mengekstrak argumen ini. Jika demikian, secara teori , semuanya akan berhasil.

Perilaku yang diharapkan

fail2ban akan membuat journal.Reader di sini dengan parameter namespace yang diteruskan dalam dict jrnlargs .

Perilaku yang diamati

namespace parameter tidak diekstraksi oleh FilterSystemd._getJournalArgs dan dengan demikian tidak diteruskan ke konstruktor untuk journal.Reader . Alih-alih itu diteruskan ke konstruktor superclass' ( JournalFilter ), menghasilkan kesalahan:

2021-01-14 23:53:17,049 fail2ban                [3600053]: ERROR   NOK: ("__init__() got an unexpected keyword argument 'namespace'",)

Konfigurasi, dump, dan kutipan bermanfaat lainnya

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

Dalam filters.d/sshd-custom.conf :

[INCLUDES]
before = sshd.conf

[Definition]
logtype = journal
journalmatch = _SYSTEMD_UNIT=ssh.service + _COMM=sshd

Dalam jails.d/ssh.conf :

[sshd]
enabled = true
filter = sshd-custom
backend = systemd[namespace="auth"]

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

Lihat di atas

Baris yang relevan dari file log yang dipantau yang dimaksud:

T/A

enhancement how-to

Semua 7 komentar

salah (tidak tepat sasaran), disimpan untuk catatan...

backend = systemd[namespace="auth"]

Nah, ini bukan parameter backend systemd (lihat #1523 untuk opsi yang memungkinkan), melainkan filternya.
Singkatnya: argumen backend adalah opsi yang diberikan ke konstruktor jurnal, parameter journalmatch filter berisi ekspresi untuk kecocokan.

Untuk menambahkannya di filter, Anda harus melakukannya seperti yang dijelaskan di https://github.com/fail2ban/fail2ban/issues/2793#issuecomment -667551919 atau bahkan coba ini (tanpa menimpanya sepenuhnya, melainkan untuk memperpanjang parameter saat ini journalmatch ditentukan dalam sshd-filter), baik dalam jail.local :

[sshd]
filter = sshd[journalmatch="<known/journalmatch> + _NAMESPACE=auth"]

atau Anda dapat menulis ulang/memperpanjangnya di filter.d/sshd.local :

[Definition]
journalmatch = <known/journalmatch> + _NAMESPACE=auth

jadi Anda tidak benar-benar membutuhkan filters.d/sshd-custom.conf Anda, dalam file *.local Anda dapat menimpa setiap nilai yang mungkin Anda perlukan.

Nah, ini bukan parameter backend systemd (lihat #1523 untuk opsi yang memungkinkan), melainkan filternya.
Singkatnya: argumen backend adalah opsi yang diberikan ke konstruktor jurnal, parameter journalmatch filter berisi ekspresi untuk kecocokan.

Saya tahu ini bukan parameter untuk backend, maksud saya adalah bahwa itu perlu.

Pustaka python-systemd yang mendasarinya tidak berfungsi dengan filter yang berisi + _NAMESPACE=whatever digunakan. (Saya belum melihat mengapa hal ini terjadi, tetapi saya mendemonstrasikannya di atas.) Sebagai gantinya, menentukan namespace membutuhkan namespace untuk diberikan kepada konstruktor journal.Reader .

Cara yang jelas (dan sangat sederhana) untuk menyelesaikannya adalah dengan menambahkan beberapa baris ke metode FilterSystemd._getJournalArgs untuk mengekstrak opsi untuk args konstruktor jurnal.

Maaf, Anda salah paham.

Cara yang jelas (dan sangat sederhana) untuk menyelesaikannya adalah dengan menambahkan beberapa baris ke metode FilterSystemd._getJournalArgs untuk mengekstrak opsi untuk args konstruktor jurnal.

Tentu, dan karena implementasinya akan kompatibel ke belakang, itu cukup sederhana...

Harus diperbaiki di 164105fab12a8d97050eb1930cbc338b66d6e8eb sekarang untuk 0,10 cabang.
Saya akan menggabungkannya nanti di 0.11 dan 1.0.
Terima kasih!
Jangan ragu untuk ping saya jika saya melewatkan sesuatu.

Itu sangat cepat. Terima kasih! (Akan memberi tahu Anda jika ada masalah, tetapi ini adalah perbaikan sederhana yang tidak dapat saya bayangkan caranya.)

@sebres , sebenarnya hanya memikirkan hal-hal yang _mungkin_ ingin Anda tambahkan (tapi saya serahkan sepenuhnya kepada Anda):

  • Pesan kesalahan informatif jika versi python-systemd terlalu tua untuk mendukung argumen namespace dan diberikan.
  • Peringatan jika _NAMESPACE ada dalam jurnal yang cocok, karena dalam melihat python-systemd , sepertinya masalah yang mendasarinya adalah -- jika namespace akan difilter -- jurnal harus dibuka dengan namespace yang diberikan, artinya _NAMESPACE tidak akan pernah berfungsi.

    • Kemungkinan alternatif: Rupanya , panggilan ke sd_journal_open_namespace (yang dibuat oleh pythond-systemd ) dapat diberi flag SD_JOURNAL_ALL_NAMESPACES (melalui argumen flags) , yang kemudian akan membaca entri jurnal namespaces, yang kemudian secara teoritis memungkinkan filter _NAMESPACE . Jadi, Anda dapat memilih untuk mengaktifkan flag SD_JOURNAL_ALL_NAMESPACES secara default (atau setidaknya mengeksposnya sebagai opsi yang jelas). Ini juga akan membuat filtermatch lebih intuitif (karena namespace tidak harus disetel secara berbeda) serta memungkinkan filter yang lebih kompleks yang tidak terlihat hanya dalam satu namespace.

Bagaimanapun, bisakah Anda memperbaiki label pada masalah ini? Ini mungkin membuatnya lebih mudah untuk ditemukan. (Saya tahu saya pribadi akan lebih mungkin untuk melewatkan masalah apa pun yang ditandai closed-as-incorrect jika saya mencari untuk melihat apakah ada orang lain yang memiliki masalah saya.)

Terima kasih lagi!

Jadi, Anda dapat memilih untuk mengaktifkan flag SD_JOURNAL_ALL_NAMESPACES secara default (atau setidaknya mengeksposnya sebagai opsi yang jelas).

Yah, saya akan berhati-hati dengan tanda seperti itu, terutama secara default (terlalu sering terlihat masalah seperti kesalahan "terlalu banyak file terbuka", jadi misalnya #2444 melakukannya lebih ketat (saya masih tidak dalam mode untuk melonggarkannya) .

Untuk dokumennya masih harus diperpanjang ya...

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

TommyFrass picture TommyFrass  ·  5Komentar

szepeviktor picture szepeviktor  ·  8Komentar

Madh93 picture Madh93  ·  6Komentar

jakoch picture jakoch  ·  3Komentar

4Syno picture 4Syno  ·  6Komentar