さようならCourier-IMAPようこそDovecot

自前でIMAPサーバーを持つという今時流行らない事やってたんですが、Courier-IMAPのバージョンが5.0.0になったのを機に、CourierからDovecotへ移行しました。

だって、Courier-IMAPのメールディレクトリのマルチバイト文字コードが、5.0から強制的にUTF7-IMAPからUTF8に変更されたんだもの。

UTF8の採用自体は悪くないのかもだけど、他のIMAP serverがIMAP規格としてのUTF7-IMAP使っているのに、従来のUTF7-IMAPとの後方互換性も確保せずに強制移行とか、ついて行けない。

で、見切りを付けてDovecotにしたら動作がえらい早かった。早く移行しとけば良かった感。

sendmailのsmtp auth/TLS設定見直し

随分昔にsmtp auth/TLSは設定していたけれど、saslのローカールデータベースで認証させてました。ただ、いちいちアカウント作るのが面倒。

今時はsaslauthd経由でPAMが使えるらしいので設定見直し。FreeBSD/sendmailの基本的な設定は下記参照。

https://www.freebsd.org/doc/handbook/SMTP-Auth.html

そしてちょっと弄った結果。

dnl PAM経由だと平文(PLAINとLOGIN)しか通らない
TRUST_AUTH_MECH(`PLAIN LOGIN')dnl
define(`confAUTH_MECHANISMS', `PLAIN LOGIN')dnl

dnl A=認証をヘッダに記録, p=PLAIN/LOGIN認証にSSL/TLS必須, y=anonymnous login禁止
define(`confAUTH_OPTIONS', `A p y')dnl

dnl TLS1.1以前は蹴る
define(`confSERVER_SSL_OPTIONS',`+SSL_OP_NO_SSLv2 +SSL_OP_NO_SSLv3 +SSL_OP_NO_TLSv1 +SSL_OP_NO_TLSv1_1 +SSL_OP_CIPHER_SERVER_PREFERENCE')dnl
define(`confCLIENT_SSL_OPTIONS',`+SSL_OP_NO_SSLv2 +SSL_OP_NO_SSLv3 +SSL_OP_NO_TLSv1 +SSL_OP_NO_TLSv1_1')dnl

TLSの設定については割愛。あんまり見つからなかった、TLS1.1以前を蹴る設定だけ載せときます。PAM連係は実質TLS必須ですね。平文垂れ流しとか怖すぎる…。

Submissionポートを使ったSTARTTLSとしています。常時TLSなsmtpsのほうが良いんじゃ無いの?と思った物の、smtps非推奨っぽい。

IANA的にsmtpsは一度廃止方向になりつつも、なんとなく復活。ただport 465の用途はsmtpsとssmとがブッキングしたままとか。

confAUTH_OPTIONSでTLS強制してるからまぁいいかってな感じ。

しかしsendmailの設定、m4マクロのキーワードで検索するとテンプレばかりで詳細情報ぜんぜん引っかかりませんね。

設定内容について詳細に理解しようとしたら、cf側のキーワードで検索かけないとあかんっぽいです。日本語の情報はほとんど無いけど。

netatalk3.1.11&FreeBSD11.1/zfsのEAはいけてない

2019/11/7 追記

netatalk3.1.12&FreeBSD12.0では、3番目以降のEAが「読めたり、読めなかったり」します。ワケワカラン…。


プレビューやらXcodeやらのApple謹製アプリで上書き保存がエラーになる件、ea=auto|sys|sambaだとやっぱりnetatalk壊れてました。

FreeBSD/zfsにおける、netatalkのea=auto|sys|sambaについてまとめると…、

  • Apple謹製アプリの保存時、3つのEAが付けられる。
  • Netatalkは自身が扱うmeta情報としてFinderinfo?をorg.netatalk.MetadataとしてEAに保存する。
  • macOSからの書込みだと全てのEAはきちんと保存(FreeBSD内で確認)される。
  • macOSで読み出す時に「3番目以降のEA」が読めない。
  • EAにはファイルシステムとして格納順があるが、netatalkが保存するとランダム?な順で保存される。
  • 1番目/2番目にどのEAが格納されるかによって、上書き保存がエラーになったりならなかったりする。
  • ea=adでは問題無く全てのEAが読める。(finderinfoだけは、なぜかorg.netatalk.Metadataとして勝手にEAに保存される。)

元ファイルのEA

com.apple.lastuseddate#PS	  16
com.apple.metadata:_kMDItemUserTags	  42
com.apple.metadata:kMDLabel_m7fhm3f5avipv53sr4adlox73i	  89

↑をnetatalkへコピーしたファイルのEA(FreeBSD内からlsextattr)↓

com.apple.lastuseddate#PS
org.netatalk.Metadata
com.apple.metadata:_kMDItemUserTags
com.apple.metadata:kMDLabel_m7fhm3f5avipv53sr4adlox73i

↑をnetatalk経由でmacOSから見えるEA(ls -l@)↓

com.apple.lastuseddate#PS	  16
com.apple.metadata:_kMDItemUserTags	  42
com.apple.metadata:kMDLabe	  -1
_m7fhm3f5avipv53sr4adlox73i	  -1

他のOSやUFSは知らんけど、FreeBSD/zfsでnetatalkでマトモにEA扱うには._ファイルばらまきながらea=adで運用するしかないっぽい。

ただ制限として、dbdコマンドが使えなくなります。afp.confの内容見ずに、FilesystemがEA対応なら問答無用にAppleDoubleをEAに変換してぶち込んでしまいます。

ea=adとしても、org.netatalk.Metadataが勝手にEAに保存される件といい、EA対応のFilesystem上でのea=adのテストが十分に行われていないっぽい感じ。一方でFreeBSD/zfs側は、EAのon/offを制御出来ないというね…。

2017/12/20追記:

ea=adで使ってると,logに下記のようなエラーが大量に…。どないせーっちゅうねん。

afpd[xxx] {ad_open.c:547} (warn:ad): ad_valid_header_osx("/hoge/._hoge::EA::com.apple.quarantine"): not an adouble:osx file

blacklistd

不正アクセスを検知したらFirewallで遮断するアレの,Freebsd専用版。使い方はここ(freebsd.org)とかに書いてあるだけの情報しかまだないっぽい。

pfで運用するときの,ハマりポイントいくつか。

pfの設定ファイル名は"pf.conf"で無ければならない。名前を変えてrc.confpf_rules=とか指定しているとダメ。/etc/pf.confを決め打ちで覗きに行くっぽい。

blacklistd_flags="-f"(再起動ごとにブロックリスト初期化)での運用は危険。実際のアクセスブロックはpfのanchor機能使っているもんだから,ブロックされたルールはblacklistdやpf再起動してもanchorに残ったまま。

anchorにブロックルール残ったままblacklistdのデータベース初期化しちゃうと,ブロックルールが永遠に解除されない罠。そんなときは以下のようにして手動で削除が必要。

*ブロックされたアドレスの表示(ssh)
# pfctl -a blacklistd/22 -t port22 -T show

*ブロックされたアドレスの削除
# pfctl -a blacklistd/22 -t port22 -T delete $IP-address

blacklistctl dump -aとかで検知状況を見る事が出来るんだけど,実際の状態とは数秒のタイムラグがある。dumpの名の通り遅れて同期されるデータベースファイル見に行ってるだけで,実際に適用されているメモリ上のデータベースの状態が見られるわけではないっぽい。

そんなわけで11.0-releaseから搭載され,11.1-releaseでようやくsshdも対応したblacklistdですが,どうもまだ試験的っぽい感じ。smtpのsubmissionポートとかも対応させたいんだけれども,sendmailについての情報が見つけられない…。