1と12のリビジョン間の差分 (その間の編集: 11回)
2021-03-24 06:19:02時点のリビジョン1
サイズ: 3164
コメント:
2021-12-11 04:32:24時点のリビジョン12
サイズ: 17861
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 4: 行 4:
 * 動作試験環境: FreeBSD12.2および13.0  * 動作試験環境: FreeBSD(12.2/12.3/13.0)、sendmail(8.17.1)。
行 6: 行 6:
 * 以下の観点からSASLAUTHDに依存しない。
   * 今回スケーラビリティ(スケールアウト)は考慮しない。
   * つまりsendmailとcyrus imapdは同一サーバー内に存在するものとし、双方をコンテナ化で分離しない。
   * 認証(SMTP AUTH)は全てSASLDBを参照する。
 * CyrusSASLの仕様上の制限からSASLAUTHDを使用しない。
   * SASLAUTHDは平文パスワード(LOGINおよびAUTH PLAIN)でしか使えないため。
   * 暗号パスワード(SCRAM、DIGEST-MD5、CRAM-MD5等)では、auxpropしか参照させることができない。
   * このことから認証(SMTP AUTH)は全てauxprop(SASLDB)を直接参照するものとする。
行 11: 行 11:
   * よってSASLAUTHD導入による権限分けは不要である。
 * `ports/mail/sendmail` をインストールするが現時点(2021年03月23日)でいくらか不備がある。
   * `cyruslookup.patch` にはいくつかのバグがあり [[https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=254495|mail/sendmail: overhaul cyruslookup.patch]] にて修正依頼中。
   * よってSASLAUTHDの導入の動機として、権限分けにともなう、権限ミスマッチを解消する目的があるが、本構成では不要である。
 * `ports/mail/sendmail` をインストールするが現時点(2021年12月11日)でいくらか不備がある。
行 17: 行 16:
     * 本問題を解消するために、CFLAGSに細工して対応しています。
行 18: 行 18:
 * 設定目標としては以下の通りとする。
  
* バーチャルドメインでの運用を前提とし、サーバー側のアカウント等の情報と完全に独立させる。
   * 従来の
資料を読み解くと、この辺りが混在していて暗黙のウチに動作しているケース(エイリアスの適用など)があるが、今回それ一切許さない。
   * サーバー側はサーバー側で(root宛のメールなど)、バーチャルドメイン側はバーチャルドメイン側で、切り離された環境を構築する。
   * その効能の一つとして、cyrus imapd側で持つメールボックスの存在確認をリアルタイムで行えるようにする。
     * sendmailをインストール後にmilterをインストールする必要がある。

==
設定目標 ==
* バーチャルドメインでの運用を前提とし、サーバー側のアカウント情報や各種設定とは独立した運用を目指す。
 * 各種
資料を読み解くと、この辺りが混在していて暗黙のウチに動作しているケース(エイリアスの適用など)があるが、今回それ一切許さない。
 * サーバー側はサーバー側で(root宛のメールなど)、バーチャルドメイン側はバーチャルドメイン側で、切り離された環境を構築する。
 * その効能の一つとして、cyrus imapd側で持つメールボックスの存在確認をリアルタイムで行えるようにする。
   * メールボックスが存在しない宛先への受信拒否が行える。
   * 従来、一旦受信してから受信拒否という流れになるが、その場合の対応がバウンスメールの発行となる。
   * いわゆるスパムメールに対するバウンスメールの送信は無意味なので、その分、キューイングや再送といった負荷が無くなる。

= インストール =
行 34: 行 41:
== /usr/local/etc/ports.conf ==
以下の内容を追記する。
 * `SOCKETMAP`: CyrusIMAPdのアカウント情報をリアルタイムで参照するための仕組みの有効化
 * `CYRUSLOOKUP`: CyrusIMAPd関連の判定、送信に関する情報の定義の有効化

== /usr/ports/mail/sendmail/Makefile.local ==
以下の内容でファイルを作成する(「先頭の空白」は全てタブで置き換えること)。

{{{#!highlight makefile numbers=disable
post-configure:
        ${ECHO_CMD} 'APPENDDEF(`conf_sendmail_ENVDEF'\'', `-D_FFR_TLS_USE_CERTIFICATE_CHAIN_FILE'\'')' >> ${WCONF}/site.config.m4
        ${ECHO_CMD} 'APPENDDEF(`conf_sendmail_ENVDEF'\'', `-D_FFR_MTA_STS'\'')' >> ${WCONF}/site.config.m4
        ${ECHO_CMD} 'APPENDDEF(`conf_sendmail_ENVDEF'\'', `-D_FFR_TLS_ALTNAMES'\'')' >> ${WCONF}/site.config.m4
        ${ECHO_CMD} 'APPENDDEF(`conf_sendmail_ENVDEF'\'', `-D_FFR_VRFY_TRUSTED_FIRST'\'')' >> ${WCONF}/site.config.m4
        ${ECHO_CMD} 'APPENDDEF(`conf_sendmail_ENVDEF'\'', `-D_FFR_QUEUE_GROUP_SORTORDER'\'')' >> ${WCONF}/site.config.m4
        ${ECHO_CMD} 'APPENDDEF(`conf_sendmail_ENVDEF'\'', `-UTLS_EC -DTLS_EC=2'\'')' >> ${WCONF}/site.config.m4
}}}

 * `_FFR_TLS_USE_CERTIFICATE_CHAIN_FILE`: いわゆる一般的なTLSサーバーと同じ指定(フルチェイン)の仕方にする
 * `_FFR_MTA_STS`: MTA STSサポート(期待した通り機能しないので検証中・8.17以降の機能)
 * `_FFR_TLS_ALTNAMES`: コモンネームだけでなくSANsも評価する
 * `_FFR_VRFY_TRUSTED_FIRST`: ルート証明書のどれかが生きていれば検証済とする設定
 * `_FFR_QUEUE_GROUP_SORTORDER`: キューグループ単位でソート順を指定可能にする(本運用では取り上げない)
 * `TLS_EC=2`: ECC暗号サポート/ECC暗号(特にキー交換の)指定無し(OpenSSLデフォルトに準拠)
 * (参考)`TLS_EC=1`: ECC暗号サポート/ECC暗号(特にキー交換は)prime256v1のみ指定(変更不可)

== インストール ==
{{{#!highlight shell numbers=disable
cd /usr/ports/mail/sendmail && make install
}}}

= セットアップ =

== /usr/local/lib/sasl2/Sendmail.conf ==
以下の内容のファイルを作成する。
行 38: 行 76:
mail/sendmail: CFLAGS=-O2 -pipe -DTLS_EC=2 -D_FFR_TLS_USE_CERTIFICATE_CHAIN_FILE -D_FFR_TLS_ALTNAMES -D_FFR_QUEUE_GROUP_SORTORDER
}}}

== インストール ==
pwcheck_method: auxprop
auxprop_plugin: sasldb
}}}

 * SendmailのSASLサポートコードにはSASL関連の設定に関するコードが含まれておらず、SASLライブラリがケアしてる設定ファイルにて設定を行う必要がある。
 * 平文パスワードでは `pwcheck_method` 設定が参照されるが、暗号パスワードでは直接 `auxprop_plugin` 設定が参照される。
 * これが意味するところは、事実上 `pwcheck_method: auxprop` として強制的に解釈されることを意味する。
 * `pwcheck_method: saslauthd` と設定しても、上記振る舞いから、意図した動作をしないため、設定しないこと。

本条件において適用可能なオプションとしては、下記の物があるが、CyruIMAPd側の設定との調整を考えるとデフォルトのままとする。

||<#FFFF00> 設定名 ||<#FFFF00> デフォルト値 ||<#FFFF00> 意味 ||
|| `sasldb_path` || `/usr/local/etc/sasldb2` || SASLDBファイル(本件ではLMDB)のパス ||
|| `sasldb_mapsize` || `1048576` バイト || (LMDB固有)全ユーザーをオンメモリにマッピングするためのサイズ ||
|| `sasldb_maxreaders` || `126` || (LMDB固有)SASLDBファイルを同時アクセス可能な最大セッション(プロセス)数 ||

 * 特に `sasldb_mapsize` と `sasldb_maxreaders` の設定はユーザー数が多くなってきたときに調整が必要となる。
 * ※IMAPサーバー側で同時アクセス数のリークを確認。再起動で改善する(2021年12月現在、問題が解消している)。

{{{#!wiki note
SASLクライアントが参照すべき設定ファイル名は sasl_server_init() 関数に引き渡される appname 引数により決定される。
マニュアルに明記されてないケースで、その振る舞いの調査が必要な場合は参考までに。

https://www.cyrusimap.org/sasl/sasl/reference/manpages/library/sasl_server_init.html
}}}

== /etc/mail/Makefile.local ==
以下のファイルを作成する。

{{{#!highlight makefile numbers=disable
SENDMAIL_CF_DIR=/usr/local/share/sendmail/cf
}}}

== /etc/mail/ホスト名.mc ==
いわゆるsendmail.cf作成準備

{{{#!highlight shell numbers=disable
ln -s freebsd.submit.mc /etc/mail/$(hostname).submit.mc
cd /etc/mail && make
}}}

= 切り替え =
{{{#!highlight shell numbers=disable
cd /usr/ports/mail/sendmail && make mailer.conf
}}}

なお切り戻しは下記の実行となる。

{{{#!highlight shell numbers=disable
rm -f /etc/mail/Makefile.local
touch /etc/mail/ホスト名.*mc && make
cd /usr/ports/mail/sendmail && make mailer.base
}}}

= /etc/mail/ホスト名.mc のカスタムポイント =

== TLS関連設定 ==

=== 変更箇所 ===
 * `confSERVER_CERT`
 * `confSERVER_KEY`
 * `confCLIENT_CERT`
 * `confCLIENT_KEY`
 * `confCACERT`
 * `confCACERT_PATH`

=== 追加設定 ===
 * `confSERVER_SSL_OPTIONS` ※OpenSSLのオプション(`,` でつなげて指定する)
   * `SSL_OP_NO_SSLv2`: SSLv2の無効化
   * `SSL_OP_NO_SSLv3`: SSLv3の無効化 →TLS1.0以降に対応する
   * `SSL_OP_NO_RENEGOTIATION`: リネゴシエーション機能の無効化
   * `SSL_OP_PRIORITIZE_CHACHA`: AES暗号とChaCha暗号の同一優先度
   * `SSL_OP_CIPHER_SERVER_PREFERENCE`: 暗号スイートをサーバー指定を優先する
 * `confCIPHER_LIST` ※暗号スイートの指定(`:` でつなげて指定する)
   * `TLS_AES_256_GCM_SHA384`
   * `TLS_CHACHA20_POLY1305_SHA256`
   * `TLS_AES_128_GCM_SHA256`
   * `ECDHE-ECDSA-AES256-GCM-SHA384`
   * `ECDHE-ECDSA-CHACHA20-POLY1305`
   * `ECDHE-ECDSA-AES128-GCM-SHA256`
   * `ECDHE-RSA-AES256-GCM-SHA384`
   * `ECDHE-RSA-CHACHA20-POLY1305`
   * `ECDHE-RSA-AES128-GCM-SHA256`
   * `DHE-RSA-AES256-SHA`
   * `DHE-RSA-AES128-SHA`
   * `AES256-SHA`
   * `AES128-SHA`
 * `confTLS_FALLBACK_TO_CLEAR` ※送信時にSTARTTLSに失敗した場合、STARTTLSしないで送信しようとするかどうかのオプション

{{{#!highlight cf numbers=disable
define(`confSERVER_SSL_OPTIONS', `SSL_OP_NO_SSLv2,SSL_OP_NO_SSLv3,SSL_OP_NO_RENEGOTIATION,SSL_OP_PRIORITIZE_CHACHA,SSL_OP_CIPHER_SERVER_PREFERENCE')dnl
define(`confCIPHER_LIST', `TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:AES256-SHA:AES128-SHA')dnl
define(`confTLS_FALLBACK_TO_CLEAR', `True')dnl
}}}

== 認証関連の設定 ==
 * `confAUTH_MECHANISMS`
   * `SCRAM-SHA-256`
   * `SCRAM-SHA-1`
   * `CRAM-MD5`
   * `PLAIN`

{{{#!highlight cf numbers=disable
define(`confAUTH_MECHANISMS', 'SCRAM-SHA-256 SCRAM-SHA-1 CRAM-MD5 PLAIN')
}}}

== CyrusIMAPd関連設定 ==
{{{#!highlight cf numbers=disable
FEATURE(mrs)
FEATURE(mrs_cyrus)
MAILER(cyrusv2)
}}}

`MAILER` 行は他の `MAILER` 行の周辺に置くこと。`FEATURE` 行は `MAILER` 行の前にあればどこでもよい。

== バーチャルホスト関連設定 ==

{{{#!highlight numbers=disable
define(`ALIAS_FILE', `/etc/mail/virtaliases,/etc/mail/aliases')dnl
VIRTUSER_DOMAIN_FILE(`-o /etc/mail/virtdomains')
}}}

= バーチャルホスト連携 =

== /etc/mail/virtdomains ==
{{{#!highlight numbers=disable
example.jp
}}}

== /etc/mail/mailertable ==
{{{#!highlight numbers=disable
example.jp mrs_cyrus_mailertable:
}}}

※ドメインの後の「空白」は「タブ」に置き換えること。`:` の後ろに指定は無いが、`:` の存在は必須である。

== /etc/mail/virtaliases ==
{{{#!highlight numbers=disable
}}}

= よくある質問とその答え =

== Q.下記のように `confLOCAL_MAILER` 設定すればいいぢゃん、なんでしないの? ==
{{{#!highlight numbers=disable
define(`confLOCAL_MAILER', `cyrusv2')dnl
}}}

A.sendmailが取り扱う全てのメールをローカルメーラーとして、CyrusIMAPdに送るということはできますが、以下のデメリットが嫌でそうしていません。

 * CyrusIMAPd側にシステムと同じアカウントが必要。もちろんエイリアスである程度集約させることは可能。
 * 当然SASLアカウント設定も(ある程度)同じ設定が要求される。
 * そのアカウントはローカルパートのみの指定となり、マルチドメイン運用はできない(混在させることは可能)。
 * MUAに設定する内容(アカウント情報)は、全てローカルパートベースとなって、マルチドメイン運用できない。
 * マルチドメインで運用するなら結局それなりのセットアップが要求される。
 * それならシステムメールは従来通り `/var/mail` で受けてもらって、サービスメールと分離させてしまうのが素直である。

※なおsendmailで受信して、CyrusIMAPdのメールボックスに送るだけなら、SASLアカウントの設定は不要。

== Q.この手の設定を他で見ると下記のように `/etc/mail/access` ファイルで設定してるぢゃん、何か違いは? ==
{{{#!highlight numbers=disable
example.jp: RELAY
}}}

A.sendmailのバーチャルドメイン機構を最大限生かすための設定です。
上記設定だけで、`/etc/mail/mailertable` や `confLOCAL_MAILER` の設定を忘れると、容易にサードパーティリレイできてしまいます。
`VIRTUSER_DOMAIN_FILE` を設定すれば、メールボックスの存在が必須になるため、存在しない場合にエラーになります。

== Q.portsで入れないと駄目なんですか? ==
A.ベースシステムにSASLライブラリが無いのでいかんともしがたいです。
ベースシステムに、ports/pkgでインストールされたSASLライブラリ付でビルドすることもできないでもないですが、
OSのバージョンアップ時のメンテナンスがめんどくさくなるのでオススメしません。

== Q.pkgで入れられないのですか? ==
A.CyrusIMAPd関連の設定(アカウント情報をリアルタイムに参照する設定と転送するための設定)がpkgには無いので、portsでないとダメです。

== Q.以下のエラーが出てメールの送信ができません ==
行 43: 行 253:
cd /usr/ports/mail/sendmail && make install
}}}
AUTH failure (XXXXXXXX): generic failure (-1) SASL(-1): generic failure: Unable to open MDB transaction, user=...
}}}

A.2021年12月現在、最新のCyrusIMAPdでは本問題が解消しているようです。またSendmailでは問題起きていません。

A.以下のコマンドを実行して、LMDBファイルに接続しているセッション数およびプロセスIDを確認する。

{{{#!highlight console numbers=disable
# mdb_stat -ne /usr/local/etc/sasldb2
Environment Info
    :
  Max readers: 126
  Number of readers used: 101
Status of Main DB
    :
}}}

上記の例の場合、最大126セッション中101セッション使用していることが分かる。

{{{#!highlight console numbers=disable
# mdb_stat -nr /usr/local/etc/sasldb2
Reader Table Status
    pid thread txnid
     15223 801e12000 -
     15229 801612000 -
   :
}}}

上記のように、具体的にLMDBファイルをつかんでるPIDのリストが取得できる。

{{{#!highlight console numbers=disable
# pgrep -lf -F <(mdb_stat -nr /usr/local/etc/sasldb2 | awk '/[0-9]/ { print $1 }')
15223 imapd: imaps: XXXXXX.XXXXXXXXXX.XXX [XXX.XXX.XXX.XXX] nork@ninth-nine.com ninth-nine.com!user.nork Idle
}}}
※ZSH/BASH拡張を使用しているので、SH等では実行できない点に注意。

ここで表示されるPIDのプロセスに対して、とりあえず再起動で。
SASLDBライブラリに接続リークを起こすことを確認。

=== Q.なんでLMDB使う?デフォルトのBDB1でええやん。 ===
A.LMDBと言えばなうでヤングなインメモリデータベースやん。スケーラビリティとか諸々安心といのうのが。

= 参考文献 =
 * [[https://www.cyrusimap.org/sasl/sasl/options.html|Cyrus SASL documentation &mdash; Options]]
 * [[https://www.cyrusimap.org/sasl/sasl/reference/manpages/library/sasl_server_init.html|sasl_server_init - SASL server authentication initialization]]
 * [[http://jmaimon.com/sendmail/anfi.homeunix.net/sendmail/rtcyrus2.html|Real Time Cyrus Integration Version 2 (sendmail,cyrus)]]
 * [[http://jmaimon.com/sendmail/anfi.homeunix.net/sendmail/mrs.html|Mailertable Rule Sets (sendmail)]]
 * [[http://jmaimon.com/sendmail/anfi.homeunix.net/sendmail/cyrusv2.html|cyrusv2 mailer - release B (sendmail)]]

CyrusIMAPdとの連携運用

前提条件

  • 動作試験環境: FreeBSD(12.2/12.3/13.0)、sendmail(8.17.1)。
  • 事前に OSのインストール および 環境構築 が済ませてあること。

  • CyrusSASLの仕様上の制限からSASLAUTHDを使用しない。
    • SASLAUTHDは平文パスワード(LOGINおよびAUTH PLAIN)でしか使えないため。
    • 暗号パスワード(SCRAM、DIGEST-MD5、CRAM-MD5等)では、auxpropしか参照させることができない。
    • このことから認証(SMTP AUTH)は全てauxprop(SASLDB)を直接参照するものとする。
    • またSASLDBを参照するにあたって、sendmailおよびcyrus imapd双方に権限上のミスマッチは存在していない。
    • よってSASLAUTHDの導入の動機として、権限分けにともなう、権限ミスマッチを解消する目的があるが、本構成では不要である。
  • ports/mail/sendmail をインストールするが現時点(2021年12月11日)でいくらか不備がある。

    • SSL回りの設定方法がいびつなので、これも修正していきたいです。
      • 現在のsendmailのSSL証明書の指定方法がよろしくない。
      • ECC暗号の使用がprime256v1のみに限定されている。
      • 本問題を解消するために、CFLAGSに細工して対応しています。
    • milterをインストール(コンパイル)する順番(依存)が存在しているが、見えにくい。
      • sendmailをインストール後にmilterをインストールする必要がある。

設定目標

  • バーチャルドメインでの運用を前提とし、サーバー側のアカウント情報や各種設定とは独立した運用を目指す。
  • 各種資料を読み解くと、この辺りが混在していて暗黙のウチに動作しているケース(エイリアスの適用など)があるが、今回はそれを一切許さない。
  • サーバー側はサーバー側で(root宛のメールなど)、バーチャルドメイン側はバーチャルドメイン側で、切り離された環境を構築する。
  • その効能の一つとして、cyrus imapd側で持つメールボックスの存在確認をリアルタイムで行えるようにする。
    • メールボックスが存在しない宛先への受信拒否が行える。
    • 従来、一旦受信してから受信拒否という流れになるが、その場合の対応がバウンスメールの発行となる。
    • いわゆるスパムメールに対するバウンスメールの送信は無意味なので、その分、キューイングや再送といった負荷が無くなる。

インストール

/etc/make.conf

以下の内容を追記する。

# for sendmail
mail_sendmail_SET=    LA NIS SEM TLS DANE SASL SHMEM MILTER SMTPUTF8
mail_sendmail_SET+=   SOCKETMAP BLACKLISTD CYRUSLOOKUP PICKY_HELO_CHECK
mail_sendmail_UNSET=  BDB LDAP SASLAUTHD
  • SOCKETMAP: CyrusIMAPdのアカウント情報をリアルタイムで参照するための仕組みの有効化

  • CYRUSLOOKUP: CyrusIMAPd関連の判定、送信に関する情報の定義の有効化

/usr/ports/mail/sendmail/Makefile.local

以下の内容でファイルを作成する(「先頭の空白」は全てタブで置き換えること)。

post-configure:
        ${ECHO_CMD} 'APPENDDEF(`conf_sendmail_ENVDEF'\'', `-D_FFR_TLS_USE_CERTIFICATE_CHAIN_FILE'\'')' >> ${WCONF}/site.config.m4
        ${ECHO_CMD} 'APPENDDEF(`conf_sendmail_ENVDEF'\'', `-D_FFR_MTA_STS'\'')'               >> ${WCONF}/site.config.m4
        ${ECHO_CMD} 'APPENDDEF(`conf_sendmail_ENVDEF'\'', `-D_FFR_TLS_ALTNAMES'\'')'          >> ${WCONF}/site.config.m4
        ${ECHO_CMD} 'APPENDDEF(`conf_sendmail_ENVDEF'\'', `-D_FFR_VRFY_TRUSTED_FIRST'\'')'    >> ${WCONF}/site.config.m4
        ${ECHO_CMD} 'APPENDDEF(`conf_sendmail_ENVDEF'\'', `-D_FFR_QUEUE_GROUP_SORTORDER'\'')' >> ${WCONF}/site.config.m4
        ${ECHO_CMD} 'APPENDDEF(`conf_sendmail_ENVDEF'\'', `-UTLS_EC -DTLS_EC=2'\'')'          >> ${WCONF}/site.config.m4
  • _FFR_TLS_USE_CERTIFICATE_CHAIN_FILE: いわゆる一般的なTLSサーバーと同じ指定(フルチェイン)の仕方にする

  • _FFR_MTA_STS: MTA STSサポート(期待した通り機能しないので検証中・8.17以降の機能)

  • _FFR_TLS_ALTNAMES: コモンネームだけでなくSANsも評価する

  • _FFR_VRFY_TRUSTED_FIRST: ルート証明書のどれかが生きていれば検証済とする設定

  • _FFR_QUEUE_GROUP_SORTORDER: キューグループ単位でソート順を指定可能にする(本運用では取り上げない)

  • TLS_EC=2: ECC暗号サポート/ECC暗号(特にキー交換の)指定無し(OpenSSLデフォルトに準拠)

  • (参考)TLS_EC=1: ECC暗号サポート/ECC暗号(特にキー交換は)prime256v1のみ指定(変更不可)

インストール

cd /usr/ports/mail/sendmail && make install

セットアップ

/usr/local/lib/sasl2/Sendmail.conf

以下の内容のファイルを作成する。

pwcheck_method: auxprop
auxprop_plugin: sasldb
  • SendmailのSASLサポートコードにはSASL関連の設定に関するコードが含まれておらず、SASLライブラリがケアしてる設定ファイルにて設定を行う必要がある。
  • 平文パスワードでは pwcheck_method 設定が参照されるが、暗号パスワードでは直接 auxprop_plugin 設定が参照される。

  • これが意味するところは、事実上 pwcheck_method: auxprop として強制的に解釈されることを意味する。

  • pwcheck_method: saslauthd と設定しても、上記振る舞いから、意図した動作をしないため、設定しないこと。

本条件において適用可能なオプションとしては、下記の物があるが、CyruIMAPd側の設定との調整を考えるとデフォルトのままとする。

設定名

デフォルト値

意味

sasldb_path

/usr/local/etc/sasldb2

SASLDBファイル(本件ではLMDB)のパス

sasldb_mapsize

1048576 バイト

(LMDB固有)全ユーザーをオンメモリにマッピングするためのサイズ

sasldb_maxreaders

126

(LMDB固有)SASLDBファイルを同時アクセス可能な最大セッション(プロセス)数

  • 特に sasldb_mapsizesasldb_maxreaders の設定はユーザー数が多くなってきたときに調整が必要となる。

  • ※IMAPサーバー側で同時アクセス数のリークを確認。再起動で改善する(2021年12月現在、問題が解消している)。

SASLクライアントが参照すべき設定ファイル名は sasl_server_init() 関数に引き渡される appname 引数により決定される。 マニュアルに明記されてないケースで、その振る舞いの調査が必要な場合は参考までに。

https://www.cyrusimap.org/sasl/sasl/reference/manpages/library/sasl_server_init.html

/etc/mail/Makefile.local

以下のファイルを作成する。

SENDMAIL_CF_DIR=/usr/local/share/sendmail/cf

/etc/mail/ホスト名.mc

いわゆるsendmail.cf作成準備

ln -s freebsd.submit.mc /etc/mail/$(hostname).submit.mc
cd /etc/mail && make

切り替え

cd /usr/ports/mail/sendmail && make mailer.conf

なお切り戻しは下記の実行となる。

rm -f /etc/mail/Makefile.local
touch /etc/mail/ホスト名.*mc && make
cd /usr/ports/mail/sendmail && make mailer.base

/etc/mail/ホスト名.mc のカスタムポイント

TLS関連設定

変更箇所

  • confSERVER_CERT

  • confSERVER_KEY

  • confCLIENT_CERT

  • confCLIENT_KEY

  • confCACERT

  • confCACERT_PATH

追加設定

  • confSERVER_SSL_OPTIONS ※OpenSSLのオプション(, でつなげて指定する)

    • SSL_OP_NO_SSLv2: SSLv2の無効化

    • SSL_OP_NO_SSLv3: SSLv3の無効化 →TLS1.0以降に対応する

    • SSL_OP_NO_RENEGOTIATION: リネゴシエーション機能の無効化

    • SSL_OP_PRIORITIZE_CHACHA: AES暗号とChaCha暗号の同一優先度

    • SSL_OP_CIPHER_SERVER_PREFERENCE: 暗号スイートをサーバー指定を優先する

  • confCIPHER_LIST ※暗号スイートの指定(: でつなげて指定する)

    • TLS_AES_256_GCM_SHA384

    • TLS_CHACHA20_POLY1305_SHA256

    • TLS_AES_128_GCM_SHA256

    • ECDHE-ECDSA-AES256-GCM-SHA384

    • ECDHE-ECDSA-CHACHA20-POLY1305

    • ECDHE-ECDSA-AES128-GCM-SHA256

    • ECDHE-RSA-AES256-GCM-SHA384

    • ECDHE-RSA-CHACHA20-POLY1305

    • ECDHE-RSA-AES128-GCM-SHA256

    • DHE-RSA-AES256-SHA

    • DHE-RSA-AES128-SHA

    • AES256-SHA

    • AES128-SHA

  • confTLS_FALLBACK_TO_CLEAR ※送信時にSTARTTLSに失敗した場合、STARTTLSしないで送信しようとするかどうかのオプション

'cf' の構文ハイライトはサポートされていません。パーサーのヘルプ を御覧下さい。
define(`confSERVER_SSL_OPTIONS', `SSL_OP_NO_SSLv2,SSL_OP_NO_SSLv3,SSL_OP_NO_RENEGOTIATION,SSL_OP_PRIORITIZE_CHACHA,SSL_OP_CIPHER_SERVER_PREFERENCE')dnl
define(`confCIPHER_LIST', `TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:AES256-SHA:AES128-SHA')dnl
define(`confTLS_FALLBACK_TO_CLEAR', `True')dnl

認証関連の設定

  • confAUTH_MECHANISMS

    • SCRAM-SHA-256

    • SCRAM-SHA-1

    • CRAM-MD5

    • PLAIN

'cf' の構文ハイライトはサポートされていません。パーサーのヘルプ を御覧下さい。
define(`confAUTH_MECHANISMS', 'SCRAM-SHA-256 SCRAM-SHA-1 CRAM-MD5 PLAIN')

CyrusIMAPd関連設定

'cf' の構文ハイライトはサポートされていません。パーサーのヘルプ を御覧下さい。
FEATURE(mrs)
FEATURE(mrs_cyrus)
MAILER(cyrusv2)

MAILER 行は他の MAILER 行の周辺に置くこと。FEATURE 行は MAILER 行の前にあればどこでもよい。

バーチャルホスト関連設定

'numbers=disable' の構文ハイライトはサポートされていません。パーサーのヘルプ を御覧下さい。
   1 define(`ALIAS_FILE', `/etc/mail/virtaliases,/etc/mail/aliases')dnl
   2 VIRTUSER_DOMAIN_FILE(`-o /etc/mail/virtdomains')

バーチャルホスト連携

/etc/mail/virtdomains

'numbers=disable' の構文ハイライトはサポートされていません。パーサーのヘルプ を御覧下さい。
   1 example.jp

/etc/mail/mailertable

'numbers=disable' の構文ハイライトはサポートされていません。パーサーのヘルプ を御覧下さい。
   1 example.jp   mrs_cyrus_mailertable:

※ドメインの後の「空白」は「タブ」に置き換えること。: の後ろに指定は無いが、: の存在は必須である。

/etc/mail/virtaliases

'numbers=disable' の構文ハイライトはサポートされていません。パーサーのヘルプ を御覧下さい。
   1 

よくある質問とその答え

Q.下記のように `confLOCAL_MAILER` 設定すればいいぢゃん、なんでしないの?

'numbers=disable' の構文ハイライトはサポートされていません。パーサーのヘルプ を御覧下さい。
   1 define(`confLOCAL_MAILER', `cyrusv2')dnl

A.sendmailが取り扱う全てのメールをローカルメーラーとして、CyrusIMAPdに送るということはできますが、以下のデメリットが嫌でそうしていません。

  • CyrusIMAPd側にシステムと同じアカウントが必要。もちろんエイリアスである程度集約させることは可能。
  • 当然SASLアカウント設定も(ある程度)同じ設定が要求される。
  • そのアカウントはローカルパートのみの指定となり、マルチドメイン運用はできない(混在させることは可能)。
  • MUAに設定する内容(アカウント情報)は、全てローカルパートベースとなって、マルチドメイン運用できない。
  • マルチドメインで運用するなら結局それなりのセットアップが要求される。
  • それならシステムメールは従来通り /var/mail で受けてもらって、サービスメールと分離させてしまうのが素直である。

※なおsendmailで受信して、CyrusIMAPdのメールボックスに送るだけなら、SASLアカウントの設定は不要。

Q.この手の設定を他で見ると下記のように `/etc/mail/access` ファイルで設定してるぢゃん、何か違いは?

'numbers=disable' の構文ハイライトはサポートされていません。パーサーのヘルプ を御覧下さい。
   1 example.jp: RELAY

A.sendmailのバーチャルドメイン機構を最大限生かすための設定です。 上記設定だけで、/etc/mail/mailertableconfLOCAL_MAILER の設定を忘れると、容易にサードパーティリレイできてしまいます。 VIRTUSER_DOMAIN_FILE を設定すれば、メールボックスの存在が必須になるため、存在しない場合にエラーになります。

Q.portsで入れないと駄目なんですか?

A.ベースシステムにSASLライブラリが無いのでいかんともしがたいです。 ベースシステムに、ports/pkgでインストールされたSASLライブラリ付でビルドすることもできないでもないですが、 OSのバージョンアップ時のメンテナンスがめんどくさくなるのでオススメしません。

Q.pkgで入れられないのですか?

A.CyrusIMAPd関連の設定(アカウント情報をリアルタイムに参照する設定と転送するための設定)がpkgには無いので、portsでないとダメです。

Q.以下のエラーが出てメールの送信ができません

AUTH failure (XXXXXXXX): generic failure (-1) SASL(-1): generic failure: Unable to open MDB transaction, user=...

A.2021年12月現在、最新のCyrusIMAPdでは本問題が解消しているようです。またSendmailでは問題起きていません。

A.以下のコマンドを実行して、LMDBファイルに接続しているセッション数およびプロセスIDを確認する。

# mdb_stat -ne /usr/local/etc/sasldb2
Environment Info
    :
  Max readers: 126
  Number of readers used: 101
Status of Main DB
    :

上記の例の場合、最大126セッション中101セッション使用していることが分かる。

# mdb_stat -nr /usr/local/etc/sasldb2
Reader Table Status
    pid     thread     txnid
     15223 801e12000 -
     15229 801612000 -
   :

上記のように、具体的にLMDBファイルをつかんでるPIDのリストが取得できる。

# pgrep -lf -F <(mdb_stat -nr /usr/local/etc/sasldb2 | awk '/[0-9]/ { print $1 }')
15223 imapd: imaps: XXXXXX.XXXXXXXXXX.XXX [XXX.XXX.XXX.XXX] nork@ninth-nine.com ninth-nine.com!user.nork Idle

※ZSH/BASH拡張を使用しているので、SH等では実行できない点に注意。

ここで表示されるPIDのプロセスに対して、とりあえず再起動で。 SASLDBライブラリに接続リークを起こすことを確認。

Q.なんでLMDB使う?デフォルトのBDB1でええやん。

A.LMDBと言えばなうでヤングなインメモリデータベースやん。スケーラビリティとか諸々安心といのうのが。

参考文献

sendmail/cyrus-imapd (最終更新日時 2022-01-06 10:49:07 更新者 NorikatsuShigemura)