健全性と完全性と機械学習の尺度の関係

健全性(soundness)と完全性(completeness)

ある特徴・性質Cを満たすモノを識別/生成するために提案・構築された手法Mがある。

手法Mの出力の集合をOm、特徴・性質Cを満たすモノの集合をOcとしたとき、

  • OmがOcの部分集合である → 手法Mは健全(sound)である。
    • つまり、手法Mで識別/生成された結果は必ず性質Cを満たしている。
    • でも、手法Mですべての性質Cを識別/生成できるとは保証していない。
  • OcがOmの部分集合である → 手法Mは完全(complete)である。
    • つまり、手法Mですべての性質Cを持つモノを識別/生成できる。
    • でも、手法Mで識別/生成された結果が必ず性質Cを満たしていることは保障していない。
  • OcとOmが等しい → 手法Mは健全であり、完全である。
    • 手法Mで識別/生成された結果は必ず性質Cを満たしている。
    • さらに手法Mですべての性質Cを持つモノを識別/生成できる。

真陽性、偽陽性、真陰性、偽陰性

ある特徴・性質cを満たすモノを識別/生成するために提案・構築された手法Mがあるとする。

理想的には手法Mは健全か完全、あるいは健全かつ完全であることが好ましいが、実際のところそういう手法を開発するのは難しい。実際のところは、以下の図のように、手法Mによって特徴・性質Cを満たすモノの一部を識別/生成できるが、すべてを識別/生成できるわけではない。しかも、特徴・性質Cを満たさないモノについても手法Mは誤って識別/生成してしまう。

f:id:next49:20191126224205p:plain
真陽性、偽陽性、真陰性、偽陰性

  • 真陽性(true positive, TP):手法Mによって「性質Cを満たす」と判定され、かつ、本当に性質Cを満たしている
  • 偽陽性(false positive, FP):手法Mによって「性質Cを満たす」と判定されるが、実際は、性質Cを満たしていない
  • 真陰性(true negative, TN):手法Mによって「性質Cを満たさない」と判定され、かつ、本当に性質Cを満たしていない
  • 偽陰性(false negative, FN):手法Mによって「性質Cを満たさない」と判定さるが、実際は、性質Cを満たしている
性質Cを満たす 性質Cを満たさない
手法Mでは「満たす」判定 真陽性 偽陽性
手法Mでは「満たさない」判定 偽陰性 真陰性

正解率・精度、適合率、再現率・感度、特異度、F値

機械学習で使われる尺度は以下のリンクの通り。
ibisforest.org

  • 正解率・精度(accuracy) = (真陽性 + 真陰性)/ (真陽性 + 真陰性 + 偽陽性 + 偽陰性)
  • 適合率・精度(precision) = 真陽性 / (真陽性 + 偽陽性) = 手法Mが「満たす」と正しく判定出来た数 / 手法Mの判定結果の総数
  • 再現率(recall)・感度(sensitivity) = 真陽性 / (真陽性 + 偽陰性) = 手法Mが「満たす」と正しく判定出来た数 /性質Cを満たすモノの総数
  • 特異度 (specificity) = 真陰性 / (真陰性 + 偽陽性) = 手法Mが「満たさない」と正しく判定出来た数 /性質Cを満たさないモノの総数
  • F値 = (2 × 適合率 × 再現率)/ (適合率 + 再現率)

健全性と完全性と機械学習の尺度の関係

手法Mが健全であるということは、偽陽性になることがないということ。
よって、適合率と特異度が1となる。

手法Mが完全であるということは、偽陰性になることがないということ。
よって、再現率・感度が1となる。

手法Mが健全かつ完全であるということは、偽陽性にも偽陰性にもなることがないということ。
よって、正解率が1、適合率が1、再現率が1、特異度が1、F値が1となる。

機械学習で使われる尺度と検査

手法Mがガン検診の方法、性質Cが当該のガンであるという性質の場合。「1滴の血液から13種類のがんいずれかの有無を99%の精度で検出できる」という説明が何の尺度について話しているの?そもそも、ガンである人の総数が分かるの?(真陽性、真陰性、偽陽性、 偽陰性の数が求められるの?)という話。
natrom.hatenablog.com

Debian 10上でmbox形式をmail_dir形式に移行する

はじめに

Debian 10 (buster)上でPostfixとDovecotを用いてSMTP認証+TLS - 発声練習でIMAPを導入したのでMailBox形式(すべてのメールを1ファイルで管理する)からMailDir形式(1メールを1ファイルで管理する)に移行する。

mb2mdによる移行

移行方法を調べたところ Dovecotのこまんとdoveadmを用いることで変換できるようだったが、いまいち使い方がわからなかったので利用法がわかりやすく、Debian 10のパッケージとして提供されているmb2mdを用いることとした。

メールサーバの停止

PostfixとDovecotを停止する。

% sudo sytemctl stop dovecot
% sudo systemctl stop postfix

Postfixの設定の変更

/etc/postfix/main.cf に以下を追記する。これで新着うメールは /home/ユーザ/Maildir に配送される。

home_mailbox = Maildir/

Dovecotの設定の変更

/etc/dovecot/conf.d/10-mail.confの以下の部分を変更する。

変更前: mail_location = mbox:~/mail:INBOX=/var/mail/%u
変更後: mail_location = maildir:~/Maildir

mb2mdによる変換

メールは /var/mail/ユーザ名 にある。これを ~/home/ユーザ名/Maildirに変換する。

% sudo su
# su ユーザ名
% cd
% mb2md -m -s /var/mail/ユーザ名
% ls -l ~/Maildir/cur

官邸Webサイトの「桜を見る会」のページ

2011年の菅首相および2012年の野田首相のページはなかった。開催されなかったのかな?

1995年(平成7年)は阪神・淡路大震災[16]、2011年(平成23年)は東日本大震災[17]、2012年(平成24年)は北朝鮮の弾道ミサイル発射への対応を理由として中止された[18][19]。
桜を見る会 - Wikipediaより)

それにしても国立国会図書館インターネット資料収集保存事業は優秀。土屋 大洋:日米両国の行政ホームページ利用の進展-三年目の動向と課題-(PDF)によると、首相官邸ホームページは1994年8月に開設とのこと。歴代内閣情報(HP開設以降)をみると、「総理のうごき」というコンテンツができたのは小渕首相からである様子。よって、官邸Webサイト上の「桜を見る会」のページは全部残っているといえる。

 今回の桜を見る会、64回目ですが、ということでございますが、山口さんや皆さんと共に政権を奪還してから、7回目の桜を見る会となりました。12年前にも皆さん忘れておられるかもしれませんが、私1年間総理大臣をやっておりますので、私は総理大臣としては8回目となるわけでございます。

平成30年4月21日、安倍総理は、東京都内の新宿御苑で桜を見る会を開催しました。
安倍総理は、文化・芸能、スポーツなど各界からの招待客を前に、次のように挨拶しました。

平成29年4月15日、安倍総理は、東京都内の新宿御苑で桜を見る会を開催しました。
安倍総理は、文化・芸能、スポーツなど各界からの招待客を前に、次のように挨拶しました。

平成28年4月9日、安倍総理は、東京都内の新宿御苑で桜を見る会を開催しました。文化・芸能、スポーツ界等の代表者などの招待客でにぎわいました。

平成27年4月18日、安倍総理は、東京都内の新宿御苑で桜を見る会を開催しました。文化・芸能、スポーツ界等の代表者などの招待客でにぎわいました。

平成26年4月12日、安倍総理は東京都内の新宿御苑で、桜を見る会を開催しました。文化・芸能、スポーツ界等の代表者など約1万4千人の招待客でにぎわいました。

平成25年4月20日、安倍総理は東京都内の新宿御苑で、桜を見る会を開催しました。文化・芸能、スポーツ界等の代表者など約1万2千人の招待客でにぎわいました。

平成22年4月17日、鳩山総理は東京都内の新宿御苑で、桜を見る会を開催しました。 八重桜の咲く中、文化・芸能、スポーツ界等の代表者等約1万の招待者でにぎわいました。

鳩山総理は、招待客を前に「桜を見ながら、雪も見れるという大変な日になりましたが、ようこそお出ましをいただきました。このような時になると、必ず、私から申し上げる言葉があります。人生には、二人の友がいる。晴天の友と雨天の友である。晴れた時には、人知れず人は集まって来る。しかし、いったん、人生に雨が降ると、一人去り、二人去り、消えてしまうものだと、雨の時に、集まってくれる友こそ、真の友である。雨天の友という言葉がございます。皆様方はこの鳩山政権における、お一人お一人が雨天の友でございます。心からお集まりに感謝を申し上げます。」と挨拶を述べました。

平成21年4月18日、麻生総理は東京都内の新宿御苑で、桜を見る会を開催しました。 見ごろとなった八重桜のもとで、各界の代表者や、文化・芸能、スポーツ界など約1万1千人の招待者でにぎわいました。

平成20年4月12日、福田総理は東京都内の新宿御苑で桜を見る会を開催し、見ごろとなった遅咲きの八重桜と晴れ渡った空のもとで、各界の代表者や、文化・芸能、スポーツ界など約1万人の招待者でにぎわいました。

平成19年4月14日、安倍総理は東京都内の新宿御苑で桜を見る会を開催し、すっきりと晴れ渡った空のもとで、各界の代表者や、文化・芸能、スポーツ界など約1万1千人の招待者でにぎわいました。

 平成18年4月15日、総理主催の「桜を見る会」が東京都新宿区の新宿御苑で開催され、政財界や文化・芸能、スポーツ界など約11,000人の招待者でにぎわいました。

平成17年4月9日、総理主催の「桜を見る会」が東京都新宿区の新宿御苑で開催され、政財界や文化・芸能、スポーツ界など約8,700人の招待者でにぎわいました。

平成16年4月17日、総理主催の「桜を見る会」が東京都新宿区の新宿御苑で開催され、政財界や文化・スポーツ界など約8000人の招待者でにぎわいました。

平成15年4月19日、総理主催の「桜を見る会」が新宿御苑で開催され、政財界や文化・スポーツ界、国際貢献・国際ボランティア関係者など、招待者でにぎわいました。

平成14年4月20日、総理主催の「桜を見る会」が新宿御苑で開催され、政財界や文化、スポーツ界関係者など約8,000人の招待者でにぎわいました。

総理主催の「桜を見る会」が、平成13年4月21日午前、東京の新宿御苑で、政財界や文化、スポーツ界関係者、国際貢献及び国際ボランティアに参加した人達約1万人を招いて開催されました。森総理は、八重桜の下で、招待客らとの握手や記念撮影に気さくに応じました。

総理主催の「桜を見る会」が、平成12年4月15日午前、東京の新宿御苑で、政財界や文化、スポーツ界関係者、国連平和維持活動に参加した隊員ら約8500人を招いて開催された。森総理は「いろいろな問題をしっかり受けとめ、日本の新生を図っていきたい」とあいさつし、八重桜の下で、招待客らとの握手や記念撮影に気さくに応じた。

小渕総理は東京の新宿御苑で恒例の「桜を見る会」を開催し、政財界をはじめ、各国大使やスポーツ選手、文化人など約1万1000人の招待者でにぎわった。

メモ:「桜を見る会」の論点

私が感じるもやもやは以下の2つのエントリーでだいたいまとまっていた。

根本的な論点はこちらのエントリー。
note.mu

政権についた政党が、公費で後援会活動を行った場合ならば、違法にならないのか。もしそれが「脱法行為」として許されるのならアンフェアではないか。

招待名簿を「遅滞なく破棄」しているために検証ができない状態が作られるという公文書管理・情報公開の問題や、当初は政治家の招待枠がないかのように振舞っていた「虚偽答弁」あるいは「不誠実答弁」の問題については、今や永田町の日常風景になってしまった。

細かいお金周りの話はこちら
webronza.asahi.com

Debian 10 + nftables + fail2ban

はじめに

インストールはこちら

nftablesを使ったアクセス制御はこちら

fail2banとは

ログを監視してTCPで提供されているサービスに過剰にアクセスしてくるIPアドレスを一定時間アクセスさせないようにするソフトウェア。

Debian 10での注意点

Debian 9まではiptablesで動いており、Debian 10でもデフォルトの設定はiptablesベースになっている。このため、nftablesを使ってアクセス制御をしている場合には、適宜設定変更をしてあげないといけない。

fail2banのインストールと設定

インストールする。

% sudo apt install fail2ban

設定ファイルは /etc/fail2ban以下におかれる構成は以下の通り。

% ls -1
action.d/ 
fail2ban.conf
fail2ban.d/
filter.d/
jail.conf
jail.d/
paths-arch.conf
paths-common.conf
paths-debian.conf
paths-opensuse.conf

jail.conf を編集する。 ignoreipで監視対象外のIPアドレスを指定し、banactionとbanaction_allportsでiptablesからnftablesを使うように設定を変更する。

% cd /etc/fail2ban
% sudo cp -p jail.conf jail.conf.org
% sudo vi jail.conf
% iff jail.conf.org jail.conf
54a55
> ignoreip = 127.0.0.1/8 ::1 XXX.XXX.XXX.XXX/24  # 監視対象外のIPアドレス
167,168c168,171
< banaction = iptables-multiport
< banaction_allports = iptables-allports
---
> #banaction = iptables-multiport
> banaction = nftables-multiport
> #banaction_allports = iptables-allports
> banaction_allports = nftables-allports

Debian 10では標準でsshがfail2banの監視対象となっている。どのポート(サービス)を監視するのかは jail.confにサービスと設定の一覧があるので、それを利用する。たとえば、 SMTP, SMTP AUTH, POP3, POP3Sなどをまとめて監視する postfix-sasl は /etc/jail.conf に以下のように定義されている。

[postfix-sasl]

filter   = postfix[mode=auth]
port     = smtp,465,submission,imap,imaps,pop3,pop3s
# You might consider monitoring /var/log/mail.warn instead if you are
# running postfix since it would provide the same log lines at the
# "warn" level but overall at the smaller filesize.
logpath  = %(postfix_log)s
backend  = %(postfix_backend)s

これを有効にする場合には以下のように /etc/jail.d/以下にファイルをおき、有効にする。

% cd jail.d/
% sudo touch postfix-sasl.conf
% sudo vi postfix-sasl.conf

postfix-sasl.confの内容は以下のように記載する。

[postfix-sasl]
enabled = true


繰り返しBanされるIPを長期間Banする。

% sudo touch recidive.conf
% sudo vi recidive.conf

recidive.conf内容は以下のとおり。

[recidive]
enabled = true

ただし、nftablesを使っている場合は上記の設定のままではうごかない(nftablesが /etc/services に記載されているポート名を参照しているため。postfix-saslの
ルールの場合 "465"というポート名が /etc/services に存在しない)

自分用のルールを /etc/jail.localとして記載する。

% sudo touch /etc/fail2ban/jail.local
% sudo vi /etc/fail2ban/jail.local

jail.localの内容を以下のようにする。(postfix-saslから 465, imap, imapsを除いている)

[postfix-sasl-custom]

filter   = postfix[mode=auth]
port     = smtp,submission,pop3,pop3s
logpath  = %(postfix_log)s
backend  = %(postfix_backend)s

postfix-sasl.confの内容を以下のように編集する。

[postfix-sasl-custom]
enabled = true

fail2banを再起動する。

% sudo systemctl stop fail2ban
% sudo systemctl start fail2ban

しばらくたつと、fail2banがnftablesに自動的にルールを追記してくれる。fail2banの再起動時のログをみる。

% tail /var/log/fail2ban.log
2019-11-18 14:19:22,813 fail2ban.server         [30494]: INFO    Starting Fail2ban v0.10.2
2019-11-18 14:19:22,819 fail2ban.database       [30494]: INFO    Connected to fail2ban persistent database '/var/lib/fail2ban/fail2ban.sqlite3'
2019-11-18 14:19:22,820 fail2ban.jail           [30494]: INFO    Creating new jail 'sshd'
2019-11-18 14:19:22,828 fail2ban.jail           [30494]: INFO    Jail 'sshd' uses pyinotify {}
2019-11-18 14:19:22,830 fail2ban.jail           [30494]: INFO    Initiated 'pyinotify' backend
2019-11-18 14:19:22,830 fail2ban.filter         [30494]: INFO      maxLines: 1
2019-11-18 14:19:22,852 fail2ban.server         [30494]: INFO    Jail sshd is not a JournalFilter instance
2019-11-18 14:19:22,853 fail2ban.filter         [30494]: INFO    Added logfile: '/var/log/auth.log' (pos = 10278741, hash = e1979e4153ef60220060b0b8d7d29f43e947154f)
2019-11-18 14:19:22,853 fail2ban.filter         [30494]: INFO      encoding: UTF-8
2019-11-18 14:19:22,854 fail2ban.filter         [30494]: INFO      maxRetry: 5
2019-11-18 14:19:22,854 fail2ban.filter         [30494]: INFO      findtime: 600
2019-11-18 14:19:22,855 fail2ban.actions        [30494]: INFO      banTime: 600
2019-11-18 14:19:22,857 fail2ban.jail           [30494]: INFO    Creating new jail 'recidive'
2019-11-18 14:19:22,857 fail2ban.jail           [30494]: INFO    Jail 'recidive' uses pyinotify {}
2019-11-18 14:19:22,860 fail2ban.jail           [30494]: INFO    Initiated 'pyinotify' backend
2019-11-18 14:19:22,863 fail2ban.server         [30494]: INFO    Jail recidive is not a JournalFilter instance
2019-11-18 14:19:22,863 fail2ban.filter         [30494]: INFO    Added logfile: '/var/log/fail2ban.log' (pos = 3405917, hash = 6fcbaf803079b747ecdbd1658eb6884f5241503f)
2019-11-18 14:19:22,865 fail2ban.filter         [30494]: INFO      encoding: UTF-8
2019-11-18 14:19:22,866 fail2ban.filter         [30494]: INFO      maxRetry: 5
2019-11-18 14:19:22,866 fail2ban.filter         [30494]: INFO      findtime: 86400
2019-11-18 14:19:22,866 fail2ban.actions        [30494]: INFO      banTime: 604800
2019-11-18 14:19:22,869 fail2ban.jail           [30494]: INFO    Creating new jail 'postfix-sasl-custom'
2019-11-18 14:19:22,870 fail2ban.jail           [30494]: INFO    Jail 'postfix-sasl-custom' uses pyinotify {}
2019-11-18 14:19:22,872 fail2ban.jail           [30494]: INFO    Initiated 'pyinotify' backend
2019-11-18 14:19:22,877 fail2ban.server         [30494]: INFO    Jail postfix-sasl-custom is not a JournalFilter instance
2019-11-18 14:19:22,878 fail2ban.filter         [30494]: INFO    Added logfile: '/var/log/mail.log' (pos = 11829048, hash = 5f203d2833f79fe76e8db1a83af3c1419b8708dd)
2019-11-18 14:19:22,879 fail2ban.filter         [30494]: INFO      encoding: UTF-8
2019-11-18 14:19:22,880 fail2ban.filter         [30494]: INFO      maxRetry: 5
2019-11-18 14:19:22,880 fail2ban.filter         [30494]: INFO      findtime: 600
2019-11-18 14:19:22,881 fail2ban.actions        [30494]: INFO      banTime: 600
2019-11-18 14:19:22,885 fail2ban.jail           [30494]: INFO    Jail 'sshd' started
2019-11-18 14:19:22,889 fail2ban.jail           [30494]: INFO    Jail 'recidive' started
2019-11-18 14:19:22,891 fail2ban.jail           [30494]: INFO    Jail 'postfix-sasl-custom' started
2019-11-18 14:19:29,395 fail2ban.filter         [30494]: INFO    [postfix-sasl-custom] Found 46.38.144.32 - 2019-11-18 14:19:29
〜省略〜

Debian 10 (buster)のnftablesでアクセス制御 - 発声練習で設定したとおりに/etc/nftable.confを設定しておくと、banしたIPアドレスが存在したときに fail2banが勝手に nftにルールを追加してくれる。たとえば以下のとおり。

# nft list ruleset
table inet filter {
	set f2b-postfix-sasl-custom {                                     # fail2banが自動追加
		type ipv4_addr                                                  # fail2banが自動追加
		elements = { 46.38.144.32, 46.38.144.179 }    # fail2banが自動追加
	}

	chain input {
		type filter hook input priority 0; policy accept;
		tcp dport { smtp, pop3, submission, pop3s } ip saddr @f2b-postfix-sasl-custom reject   # fail2banが自動追加
	}

	chain forward {
		type filter hook forward priority 0; policy accept;
	}

	chain output {
		type filter hook output priority 0; policy accept;
	}
}
〜 以下、略 〜

現時点でbanされているIPアドレスをみる場合は以下のコマンドで調べる。たとえば、私の環境では以下のようになった。

% sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed:	0
|  |- Total failed:	0
|  `- File list:	/var/log/auth.log
`- Actions
   |- Currently banned:	0
   |- Total banned:	0
   `- Banned IP list:	

% sudo fail2ban-client status postfix-sasl-custom
Status for the jail: postfix-sasl-custom
|- Filter
|  |- Currently failed:	5
|  |- Total failed:	66
|  `- File list:	/var/log/mail.log
`- Actions
   |- Currently banned:	5
   |- Total banned:	12
   `- Banned IP list:	46.38.144.57 46.38.144.146 92.118.38.38 46.38.144.17 92.118.38.55

トラブルシューティング: nftableへの切替設定ミス

nftablesでアクセス制限しているのに、/etc/jail.conf では iptables-multiport, iptables-allportを設定していると以下のようなエラーログが/var/log/fail2ban.logにでる。

2019-11-15 22:28:39,154 fail2ban.utils          [440]: Level 39 7f65406a1e68 -- exec: iptables -w -n -L INPUT | grep -q 'f2b-sshd[ \t]'
2019-11-15 22:28:39,154 fail2ban.utils          [440]: ERROR   7f65406a1e68 -- stderr: "iptables v1.8.2 (nf_tables): table `filter' is incompatible, use 'nft' tool."
2019-11-15 22:28:39,154 fail2ban.utils          [440]: ERROR   7f65406a1e68 -- stderr: ''
2019-11-15 22:28:39,154 fail2ban.utils          [440]: ERROR   7f65406a1e68 -- returned 1
2019-11-15 22:28:39,154 fail2ban.CommandAction  [440]: ERROR   Invariant check failed. Trying to restore a sane environment
2019-11-15 22:28:39,217 fail2ban.utils          [440]: Level 39 7f65406a1e68 -- exec: iptables -w -n -L INPUT | grep -q 'f2b-sshd[ \t]'
2019-11-15 22:28:39,218 fail2ban.utils          [440]: ERROR   7f65406a1e68 -- stderr: "iptables v1.8.2 (nf_tables): table `filter' is incompatible, use 'nft' tool."
2019-11-15 22:28:39,218 fail2ban.utils          [440]: ERROR   7f65406a1e68 -- stderr: ''
2019-11-15 22:28:39,218 fail2ban.utils          [440]: ERROR   7f65406a1e68 -- returned 1
2019-11-15 22:28:39,218 fail2ban.CommandAction  [440]: CRITICAL Unable to restore environment
2019-11-15 22:28:39,218 fail2ban.actions        [440]: ERROR   Failed to execute ban jail 'sshd' action 'iptables-multiport' info 'ActionInfo({'ip': '2
22.186.180.147', 'family': 'inet4', 'ip-rev': '147.180.186.222.', 'ip-host': None, 'fid': '222.186.180.147', 'failures': 9, 'time': 1573824514.0, 'matches': 'Nov 15 22:28:10 ホスト名 sshd[985]: Failed password for root from 222.186.180.147 port 3320 ssh2\n
〜省略〜
': 9, 'ipjailfailures': 9})': Error banning 222.186.180.147

トラブルシューティング: nftablesに設定しているルールセットと一致していないとき

デフォルトでは「chain input」であることが記載されているがnftablesに設定しているルールセットで「chain INPUT」と設定されていると以下のサイトのようなエラーがでる。

トラブルシューティング: jail.conf で設定されているルールのサービスが /etc/services に存在しない

fail2banがnftablesへのルールセットにルールを追加する際に'Error: Could not resolve service: Servname not found in nft services list'というエラーがでている。

2019-11-17 01:02:27,961 fail2ban.utils          [1958]: Level 39 7f4fa70e3e40 -- exec: nft add set inet filter f2b-postfix-sasl \{ type ipv4_addr\; \}
nft insert rule inet filter input tcp dport \{ smtp,465,submission,imap,imaps,pop3,pop3s \} ip saddr @f2b-postfix-sasl reject
2019-11-17 01:02:27,961 fail2ban.utils          [1958]: ERROR   7f4fa70e3e40 -- stderr: 'Error: Could not resolve service: Servname not found in nft services list'
2019-11-17 01:02:27,961 fail2ban.utils          [1958]: ERROR   7f4fa70e3e40 -- stderr: 'insert rule inet filter input tcp dport { smtp,465,submission,
imap,imaps,pop3,pop3s } ip saddr @f2b-postfix-sasl reject'
2019-11-17 01:02:27,961 fail2ban.utils          [1958]: ERROR   7f4fa70e3e40 -- stderr: ' ^^^^'
2019-11-17 01:02:27,961 fail2ban.utils          [1958]: ERROR   7f4fa70e3e40 -- returned 1
2019-11-17 01:02:27,962 fail2ban.actions        [1958]: ERROR   Failed to execute ban jail 'postfix-sasl' action 'nftables-multiport' info 'ActionInfo(
{'ip': '46.38.144.179', 'family': 'inet4', 'ip-rev': '179.144.38.46.', 'ip-host': None, 'fid': '46.38.144.179', 'failures': 5, 'time': 1573920146.0, 'matches': 
'Nov 17 00:58:02 ホスト名 postfix/smtpd[24572]: warning: unknown[46.38.144.179]: SASL LOGIN authentication failed: authentication failure\n 〜略〜', 'ipfailures': 5, 'ipjailfail
ures': 5})': Error starting action Jail('postfix-sasl')/nftables-multiport

/etc/servicesの行頭に列挙されたサービス名でないとエラーがでる。調べ方は以下のとおり。上の例では"465"がひっかからないのでエラーとなっている。

% grep ^smtp /etc/services
smtp		25/tcp		mail

% grep ^465 /etc/services