Fail2ban: systemd名前空間に公開されていないオプション

作成日 2021年01月15日  ·  7コメント  ·  ソース: fail2ban/fail2ban

環境:

  • Fail2Banバージョン(可能な配布サフィックスを含む):0.11.1

    • HEADのコードを参照し、問題が解決されていないことを確認しました。

    • OSのデフォルトのpython3-systemdパッケージとそのgitリポジトリからのHEADの両方で試行されました。

  • リリース名/バージョンを含むOS:Ubuntu 20.04.1 LTS
  • [x]OS/配信メカニズムを介してインストールされたFail2Ban
  • [x]コードベースに追加の外部パッチを適用していません
  • [x]構成に対していくつかのカスタマイズが行われました(以下の詳細を提供してください)

問題:

これは#2793の拡張ですが、その問題で提案されているようにsystemd名前空間を使用できません。 つまり、フィルターに_NAMESPACE=whateverを追加しても機能しません。

再現する手順

私が知る限り、これはsystemd-pythonの問題です。 journalmatchに追加しても問題が解決しなかったため、次のように実行しました。

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))

私は間違いなく何百ものメッセージを持っていますが、それは出力を生成しませんでした。

どうやら、この機能は、 systemd-pythonパッケージへの最近の変更で数か月しか利用できませんでした。

その最新のコードをインストールしてから実行します。

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))

私はそれが完全に機能するのを見ることができます。

これをさらに調べると、解決策は構成にbackend = systemd[namespace="auth"]を追加するのと同じくらい簡単なはずです。

ただし、これを妨げる唯一のことは、現在のFilterSystemd._getJournalArgsメソッドがこの引数を認識/抽出しないことです。 そうすれば、理論的には、すべてが機能します。

予想される行動

fail2banは、 jrnlargs dictで渡されたnamespaceパラメーターを使用して、ここjournal.Readerを作成します。

観察された行動

namespaceパラメーターはFilterSystemd._getJournalArgsによって抽出されなかったため、 journal.Readerのコンストラクターに渡されませんでした。 代わりに、スーパークラス'( JournalFilter )コンストラクターに渡され、エラーが生成されました。

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

構成、ダンプ、およびその他の役立つ抜粋

/ etc /fail2ban/構成に対して行われたカスタマイズ

filters.d/sshd-custom.conf

[INCLUDES]
before = sshd.conf

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

jails.d/ssh.conf

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

/var/log/fail2ban.logファイルの関連部分:

上記を参照

問題の監視対象ログファイルからの関連行:

該当なし

enhancement how-to

全てのコメント7件

正しくない(ポイントを逃した)、記録のために保存されました...

backend = systemd[namespace="auth"]

これはsystemdバックエンドのパラメーターではなく(可能なオプションについては#1523を参照)、フィルターのパラメーターです。
簡単に言うと、バックエンドの引数はジャーナルコンストラクターに提供されるオプションであり、フィルターのパラメーターjournalmatchには一致する式が含まれています。

フィルタに追加するには、 https: //github.com/fail2ban/fail2ban/issues/2793#issuecomment -667551919で説明されているように行うか、これを試してください(完全に上書きせずに、現在のパラメータを拡張するjournalmatchはsshd-filterで指定されています)、 jail.localのいずれかで:

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

または、 filter.d/sshd.localで書き換え/拡張することもできます:

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

したがって、 filters.d/sshd-custom.confは実際には必要ありません。 *.localファイルでは、必要なすべての値を上書きできます。

これはsystemdバックエンドのパラメーターではなく(可能なオプションについては#1523を参照)、フィルターのパラメーターです。
簡単に言うと、バックエンドの引数はジャーナルコンストラクターに提供されるオプションであり、フィルターのパラメーターjournalmatchには一致する式が含まれています。

私はそれがバックエンドへのパラメータではないことを知っています、私のポイントはむしろそれが必要であるということです。

基になるpython-systemdライブラリは、 + _NAMESPACE=whateverを含むフィルターでは機能しません。 (これがなぜであるかは調べていませんが、上で説明しました。)代わりに、名前空間を指定するには、 journal.Readerコンストラクターにnamespace指定する必要があります。

これを行うための明白な(そして非常に簡単な)方法は、 FilterSystemd._getJournalArgsメソッドに数行を追加して、ジャーナルコンストラクター引数のオプションを抽出することです。

すみません、あなたを誤解しました。

これを行うための明白な(そして非常に簡単な)方法は、FilterSystemd._getJournalArgsメソッドに数行を追加して、ジャーナルコンストラクター引数のオプションを抽出することです。

確かに、実装には下位互換性があるため、十分に単純です...

0.10ブランチの場合、164105fab12a8d97050eb1930cbc338b66d6e8ebで修正する必要があります。
後で0.11と1.0でマージします。
どうも!
私がまだ何かを逃した場合は、遠慮なく私にpingしてください。

それは超高速でした。 ありがとう! (問題がある場合はお知らせしますが、これは簡単な修正であり、方法は想像できません。)

@sebres 、実際にはあなたが追加したいことを考えただけです(しかし私はそれを完全にあなたに任せます):

  • python-systemdのバージョンが古すぎて、 namespace引数をサポートできず、表示された場合の情報エラーメッセージ。
  • _NAMESPACEがジャーナルの一致に存在する場合の警告。 python-systemdを見ると、根本的な問題は次のように見えるためです。名前空間をフィルタリングする場合、ジャーナルは次のようになります。指定された名前空間で開かれます。つまり、_NAMESPACEは機能しません。

    • 考えられる代替案:どうやらsd_journal_open_namespacepythond-systemdによって行われる)への呼び出しにフラグSD_JOURNAL_ALL_NAMESPACESを(flags引数を介して)与えることができます。これにより、ジャーナルエントリが読み取られます。名前空間。これにより、理論的には_NAMESPACEフィルターが可能になります。 したがって、デフォルトSD_JOURNAL_ALL_NAMESPACESフラグを有効にすることを選択できます(または少なくともクリアオプションとして公開します)。 これにより、 filtermatchがより直感的になり(名前空間を別の方法で設定する必要がないため)、単一の名前空間だけを検索しない、より複雑なフィルターが可能になります。

いずれにせよ、この問題のラベルを修正できますか? 見つけやすくなるかもしれません。 (他の誰かが私の問題を抱えているかどうかを検索している場合、私は個人的にclosed-as-incorrectとタグ付けされた問題をスキップする可能性が高いことを知っています。)

再度、感謝します!

したがって、デフォルトでSD_JOURNAL_ALL_NAMESPACESフラグを有効にすることを選択できます(または少なくともクリアオプションとして公開します)。

ええと、特にデフォルトでは、そのようなフラグに注意します(「開いているファイルが多すぎます」エラーなどの問題が頻繁に見られるため、たとえば#2444はさらに厳密にしました(まだそれを緩めるモードではありません) 。

文書に関しては、まだ拡張する必要があります、確かに...

このページは役に立ちましたか?
0 / 5 - 0 評価