HEAD
のコードを参照し、問題が解決されていないことを確認しました。python3-systemd
パッケージとそのgitリポジトリからのHEAD
の両方で試行されました。これは#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'",)
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"]
上記を参照
該当なし
正しくない(ポイントを逃した)、記録のために保存されました...
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_namespace
( pythond-systemd
によって行われる)への呼び出しにフラグSD_JOURNAL_ALL_NAMESPACES
を(flags引数を介して)与えることができます。これにより、ジャーナルエントリが読み取られます。名前空間。これにより、理論的には_NAMESPACE
フィルターが可能になります。 したがって、デフォルトSD_JOURNAL_ALL_NAMESPACES
フラグを有効にすることを選択できます(または少なくともクリアオプションとして公開します)。 これにより、 filtermatch
がより直感的になり(名前空間を別の方法で設定する必要がないため)、単一の名前空間だけを検索しない、より複雑なフィルターが可能になります。いずれにせよ、この問題のラベルを修正できますか? 見つけやすくなるかもしれません。 (他の誰かが私の問題を抱えているかどうかを検索している場合、私は個人的にclosed-as-incorrect
とタグ付けされた問題をスキップする可能性が高いことを知っています。)
再度、感謝します!
したがって、デフォルトでSD_JOURNAL_ALL_NAMESPACESフラグを有効にすることを選択できます(または少なくともクリアオプションとして公開します)。
ええと、特にデフォルトでは、そのようなフラグに注意します(「開いているファイルが多すぎます」エラーなどの問題が頻繁に見られるため、たとえば#2444はさらに厳密にしました(まだそれを緩めるモードではありません) 。
文書に関しては、まだ拡張する必要があります、確かに...