サイズ: 8631
コメント:
|
サイズ: 15062
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 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)を直接参照するものとする。 |
行 12: | 行 12: |
* `ports/mail/sendmail` をインストールするが現時点(2021年03月25日)でいくらか不備がある。 | * `ports/mail/sendmail` をインストールするが現時点(2021年12月11日)でいくらか不備がある。 |
行 22: | 行 22: |
* 各種資料を読み解くと、この辺りが混在していて暗黙のウチに動作しているケース(エイリアスの適用など)があるが、今回それを一切許さない。 | * 各種資料を読み解くと、この辺りが混在していて暗黙のウチに動作しているケース(エイリアスの適用など)があるが、今回はそれを一切許さない。 |
行 41: | 行 41: |
== /usr/local/etc/ports.conf == 以下の内容を追記する。 {{{ mail/sendmail: CFLAGS=-O2 -pipe -DTLS_EC=2 -D_FFR_TLS_USE_CERTIFICATE_CHAIN_FILE -D_FFR_TLS_ALTNAMES -D_FFR_QUEUE_GROUP_SORTORDER |
* `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 |
行 69: | 行 78: |
※SendmailのSASLサポートコードにはSASLの設定に関するコードが含まれておらず、 | * SendmailのSASLサポートコードにはSASL関連の設定に関するコードが含まれておらず、 |
行 71: | 行 80: |
適用可能なオプションとしては下記の物があるが、CyruIMAPd側の設定との調整を考えるとデフォルトのままで良いかと。 |
* 平文パスワードでは `pwcheck_method` 設定が参照されるが、暗号パスワードでは直接 `auxprop_plugin` 設定が参照される。 * これが意味するところは、事実上 `pwcheck_method: auxprop` として強制的に解釈されることを意味する。 * `pwcheck_method: saslauthd` と設定しても、上記振る舞いから、意図した動作をしないため、設定しないこと。 本条件において適用可能なオプションとしては、下記の物があるが、CyruIMAPd側の設定との調整を考えるとデフォルトのままとする。 |
行 80: | 行 92: |
* ※IMAPサーバー側で同時アクセス数のリークを確認。再起動で改善する。 | * ※IMAPサーバー側で同時アクセス数のリークを確認。再起動で改善する(2021年12月現在、問題が解消している)。 |
行 84: | 行 96: |
マニュアルに明記されてないケースで調査が必要な際は参考までに。 | マニュアルに明記されてないケースで、その振る舞いの調査が必要な場合は参考までに。 |
行 87: | 行 99: |
行 105: | 行 116: |
行 113: | 行 122: |
= /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` 行の周辺に置くこと。 == バーチャルホスト関連設定 == {{{#!highlight cf 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 }}} |
|
行 121: | 行 214: |
== Q.pkgで入れられないのですか? == A.CyrusIMAPd関連の設定(アカウント情報をリアルタイムに参照する設定と転送するための設定)がpkgには無いので、portsでないとダメです。 |
|
行 126: | 行 222: |
A.2021年12月現在、最新のCyrusIMAPdでは本問題が解消しているようです。またSendmailでは問題起きていません。 |
|
行 128: | 行 226: |
{{{#!highlight shell numbers=disable mdb_stat -ne /usr/local/etc/sasldb2 mdb_stat -nr /usr/local/etc/sasldb2 }}} ここで表示されるPIDのプロセスに対して、とりあえず再起動で。IMAPdでちょっとしたリークを確認。 |
{{{#!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と言えばなうでヤングなインメモリデータベースやん。スケーラビリティとか諸々安心といのうのが。 |
CyrusIMAPdとの連携運用
前提条件
- 動作試験環境: FreeBSD(12.2/12.3/13.0)、sendmail(8.17.1)。
- 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をインストールする必要がある。
- SSL回りの設定方法がいびつなので、これも修正していきたいです。
設定目標
- バーチャルドメインでの運用を前提とし、サーバー側のアカウント情報や各種設定とは独立した運用を目指す。
- 各種資料を読み解くと、この辺りが混在していて暗黙のウチに動作しているケース(エイリアスの適用など)があるが、今回はそれを一切許さない。
- サーバー側はサーバー側で(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
TLS_EC=2: ECC暗号サポート/ECC暗号(特にキー交換の)指定無し(OpenSSLデフォルトに準拠)
(参考)TLS_EC: ECC暗号サポート/ECC暗号(特にキー交換は)prime256v1のみ指定(変更不可)
_FFR_TLS_USE_CERTIFICATE_CHAIN_FILE: いわゆる一般的なTLSサーバーと同じ指定(フルチェイン)の仕方にする
_FFR_TLS_ALTNAMES: コモンネームだけでなくSANsも評価する
_FFR_QUEUE_GROUP_SORTORDER: キューグループ単位でソート順を指定可能にする(本運用では取り上げない)
インストール
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_mapsize と sasldb_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
なお切り戻しは 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しないで送信しようとするかどうかのオプション
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
define(`confAUTH_MECHANISMS', 'SCRAM-SHA-256 SCRAM-SHA-1 CRAM-MD5 PLAIN')
CyrusIMAPd関連設定
FEATURE(mrs)
FEATURE(mrs_cyrus)
MAILER(cyrusv2)
MAILER 行は他の MAILER 行の周辺に置くこと。
バーチャルホスト関連設定
define(`ALIAS_FILE', `/etc/mail/virtaliases,/etc/mail/aliases')dnl
VIRTUSER_DOMAIN_FILE(`-o /etc/mail/virtdomains')
バーチャルホスト連携
/etc/mail/virtdomains
/etc/mail/mailertable
/etc/mail/virtaliases
よくある質問とその答え
Q.portsで入れないと駄目なんですか?
A.ベースシステムにSASLライブラリが無いのでしょうがないです。 ベースシステムにインストールされた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と言えばなうでヤングなインメモリデータベースやん。スケーラビリティとか諸々安心といのうのが。