SSL/TLS をメールサーバに導入すると,クライアントとサーバ間の通信の やり取りが暗号化できる.以下はその導入のためのドキュメントである.
この作業は再構築後に usuzumi から grey に変更されるために, もう一度証明書を作り直す.また,qmail の起動スクリプト には usuzumi と書かれているため,それも grey に修正する.
既に Debian のパッケージとしてインストールされている. OpenSSL 開発用パッケージを追加でインストール.
$ sudo apt install libssl-dev
ucspi-tcp (tcpserver を含む) とは,TCP 接続を管理する便利なサーバ制御ツールの一つ.
今年度から IPv6 に対応した ucspi-tcp6 の導入を目指す. まず,必要な C ライブラリをインストール.
$ wget https://www.fehcom.de/ipnet/fehQlibs/fehQlibs-27.tgz $ tar xzvf fehQlibs-27.tgz $ sudo -s # chown -R root:root fehQlibs-27 # cp -r fehQlibs-27 /usr/local/ # cd /usr/local/fehQlibs-27 # vim conf-build LIBDIR=/usr/local/lib HDRDIR=/usr/local/include # make -C src # make -C src shared # make -C src install # cd .. # ln -s fehQlibs-27 qlibs # echo "/usr/local/qlibs" >> /etc/ld.so.conf # ldconfig # exit $ cd
続いて,ucspi-tcp6 をインストール. 今年度は既に ucspi-tcp-0.88 をインストール してしまったので,上書きする形になる. 来年度以降は初めからこちらをインストールするのが好ましいだろう.
$ wget https://www.fehcom.de/ipnet/ucspi-tcp6/ucspi-tcp6-1.13.04.tgz $ tar xzvf ucspi-tcp6-1.13.04.tgz $ sudo -s # cp -r net /var/qmail/ # cd /var/qmail/net/ucspi-tcp6/ucspi-tcp6-1.13.04
このままでは,ビルドは成功するがインストールされない. (特にエラーメッセージなどは出ないが,/usr/local/bin/tcpserver など のタイムスタンプが更新されない.) ソースコードを読み,package/command-cp にコマンドのコピー先パスが書いておらず, シンボリックリンクを張るコマンドも指定されていないため, コピーもリンクも両方が実行されないためだと考えた. そのため,package/command-cp を編集してインストール.
# vim package/command-cp /usr/local/bin # この行を追記 Directories to copy commands into, one per line. The first empty line terminates the list. # ./package/install # exit $ cd
最後に ucspi-ssl をインストール.
$ wget wget https://www.fehcom.de/ipnet/ucspi-ssl/ucspi-ssl-0.13.04.tgz $ tar xzvf ucspi-ssl-0.13.04.tgz $ sudo -s # cp -r host /var/qmail/ # cd /var/qmail/host/superscript.com/net/ucspi-ssl-0.13.04 # vim package/command-cp /usr/local/bin # この行を追記 Directories to copy commands into, one per line. The first empty line terminates the list. # ./package/install # cd /usr/local/bin # ln -s sslserver tcpserver-ssl # /etc/init.d/qmail の記述に合わせる # exit
smtp over ssl を用いるため, qmail に smtp-auth のパッチをあてる. 以前 qmail のソースを展開したディレクトリに移動し, パッチをあてる.
# cd /usr/local/src # tar zxvf netqmail-1.06.tar.gz # cp -r netqmail-1.06 netqmail-1.06_smtps # cd netqmail-1.06_smtps # patch -p1 < ../qmail-103.patch # patch -p1 < ../qmail-date-localtime.patch # patch -p1 < ../qmail-smtpd-relay-reject # cp ../qmail-smtpd-auth-0.31/README.auth ./ # cp ../qmail-smtpd-auth-0.31/base64.c ./ # cp ../qmail-smtpd-auth-0.31/base64.h ./ # cd ./../qmail-smtpd-auth-0.31 # patch -d ../netqmail-1.06_smtps < auth.patch # cd ../netqmail-1.06_smtps/ # make # cp qmail-smtpd /var/qmail/bin/qmail-smtpd-auth
make が失敗したが,netqmail を入手しなおして再度試すと成功した. 原因不明.
2015 年度からUPKI サーバ証明書を導入した. qmail とdovecot では必要な証明書の型が違うので 注意が必要. 具体的には qmail には連結証明書 (秘密鍵 + ホスト証明書 + 中間証明書) が, dovecot では秘密鍵と連結証明書 (ホスト証明書 + 中間証明書) がそれぞれ別々に必要となる. また, 秘密鍵は事前にパスフレーズを外しておく必要がある. 詳細はこちらを参照されたい.
以下では,パスフレーズ解除済みの秘密鍵 (mail_out.key), 64 bit となるように 改行されたホスト証明書 (mail.ep.sci.hokudai.ac.jp.cer), 中間証明書 (nii-odca4g7rsa.cer) を usuzumi にダウンロード済みの状態からの作業を記述する.
証明書ファイルを結合する
# cat mail_out.key mail.ep.sci.hokudai.ac.jp.cer nii-odca4g7rsa.cer > qmail.pem
root 以外閲覧できないようにするし, 所定の位置にコピーする.
# chmod 600 qmail.pem # mkdir /var/qmail/server.key # cp qmail.pem /var/qmail/server.key/
Diffie-Hellman パラメータを設定する. これは DHE 鍵交換方式による TLS ハンドシェイクで必要.
# openssl dhparam -out /var/qmail/server.key/dhparams.pem 2048
起動スクリプトのコメントアウトを外す. また,ホスト名を usuzumi に直す. 今年度から ucspi-ssl を使用するため,一部記述を書き換える.
# vim /etc/init.d/qmail
. . . PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin #[ -f /var/qmail/rc ] || exit 0 [ -f /var/qmail/bin/qmail-start ] || exit 0 [ -f /var/qmail/bin/qmail-send ] || exit 0 # 証明書と鍵とDHパラメータの環境変数を明示的に指定 CERTFILE="/var/qmail/server.key/qmail.pem" #KEYFILE="/var/qmail/server.key/mail_out.key" # 必要なら秘密鍵と証明書を分離する DHFILE="/var/qmail/server.key/dhparams.pem" export CERTFILE #export KEYFILE export DHFILE case "$1" in start) . . . # For SMTP over SSL sh -c " /sbin/start-stop-daemon --start --quiet --user qmaild \ --pidfile /var/run/tcpserver_ssmtp.pid --make-pidfile \ --exec /usr/local/bin/tcpserver-ssl -- -s -HRv -u \ ` id -u qmaild ` -g ` id -g qmaild ` -x /etc/tcp.smtp.cdb \ 0.0.0.0 465 \ # -n /var/qmail/server.key/qmail.pem は消す /usr/local/bin/rblsmtpd -r bl.spamcop.net \ /var/qmail/bin/qmail-smtpd-auth usuzumi.ep.sci.hokudai.ac.jp \ /bin/checklocalpwd /bin/true 2>&1 \ | /var/qmail/bin/splogger smtpd 3 > /dev/null 2>&1 &" # For POP3 over SSL sh -c "/sbin/start-stop-daemon --start --quiet --user root \ --pidfile /var/run/tcpserver_pop3s.pid --make-pidfile \ --exec /usr/local/bin/tcpserver-ssl -- -s \ -v -u 0 -g 0 0.0.0.0 995 \ # -n /var/... は消す /var/qmail/bin/qmail-popup \ usuzumi.ep.sci.hokudai.ac.jp /bin/checkapoppw \ /var/qmail/bin/qmail-pop3d Maildir 2>&1 \ | /var/qmail/bin/splogger pop3d 3 > /dev/null 2>&1 &" stop) . . . /sbin/start-stop-daemon --user qmaild --stop --quiet --oknodo --pidfile /var/run/tcpserver_ssmtp.pid --exec /usr/local/bin/tcpserver-ssl # smtp over SSL /sbin/start-stop-daemon --user root --stop --quiet --oknodo --pidfile /var/run/tcpserver_pop3s.pid --exec /usr/local/bin/tcpserver-ssl # pop3s |
ここらで qmail-send や Stop daemons のコメントアウトも戻していいかもしれない. (昨年度のログには書いていないが,運用中の grey ではコメントアウトが外れている)
認証のために checklocalpwd を用いる. checklocalpwd のソースを落として展開する.
$ wget http://www.ep.sci.hokudai.ac.jp/~epmail/y2015/dvlop/script/checklocalpwd-1.0.tar.gz $ tar zxvf checklocalpwd-1.0.tar.gz $ cd checklocalpwd
パスワードファイルの名前を変更する.
$ vim checklocalpwd.c
#define CONFIG_FILE "/etc/poppasswd" → #define CONFIG_FILE "/etc/smtppasswd" |
make する.(Perl のパスでエラーが出る前提で作られている気がする)
# make install
権限を変更する.
# chown root:nofiles /bin/checklocalpwd # chmod 4710 /bin/checklocalpwd # chmod 750 /bin/poppasswd_change # chmod 750 /bin/poppasswd_basic
パスワード自動生成スクリプトを取得する.
$ wget http://www.ep.sci.hokudai.ac.jp/~epmail/y2015/dvlop/script/smtppwdbg
取得したパスワード生成スクリプトを /etc/cron.daily 以下に置く.
# chmod +x smtppwdbg # cp smtppwdbg /etc/cron.daily
crontab にsmtppwdbg を追加する.
# crontab -e
以下の一行を追加する.
50 * * * * /etc/cron.daily/smtppwdbg |
smtp-auth 用にパスワードファイルを作成する.
# poppasswd_basic > /etc/smtppasswd
パーミッション変更
# chmod 600 /etc/smtppasswd
パスワードの作成(ここではユーザ hogehoge のパスワードを password とした場合の例を載せる)
# poppasswd_change /etc/smtppasswd hogehoge password
qmail の再起動と挙動の確認
# systemctl restart qmail
# ss -ant | grep 995 # POP3S の確認 LISTEN 0 20 0.0.0.0:995 0.0.0.0:* # ss -ant | grep 110 # POP3 の確認 LISTEN 0 20 0.0.0.0:110 0.0.0.0:* # ss -ant | grep 25 # SMTP の確認 LISTEN 0 20 0.0.0.0:25 0.0.0.0:* # ss -ant | grep 465 # SMTPS の確認 LISTEN 0 20 0.0.0.0:465 0.0.0.0:* |
Thunderbird でいつも通りアカウント作成.
名前: mondohoge メールアドレス: mondohoge@usuzumi.ep.sci.hokudai.ac.jp |
手動設定も必要.
受信サーバ: POP ポート番号: 995 SSL: SSL/TLS 認証方式: 暗号化されたパスワード認証 送信サーバ: SMTP ポート番号: 465 SSL: SSL/TLS 認証方式: 通常のパスワード認証 |
自分宛にメールを出してみる.
上述のとおり, dovecot では秘密鍵と連結証明書 (ホスト証明書 + 中間証明書) がそれぞれ必要となる. UPKI 更新マニュアルを参考に進めること. それぞれ以下のところに格納する.
# cat mail.ep.sci.hokudai.ac.jp.cer nii-odca4g7rsa.cer > fullchain.pem # cp mail.ep.sci.hokudai.ac.jp.cer /etc/dovecot/dovecot.cer # cp mail_out.key /etc/dovecot/private/dovecot_key.pem # cp nii-odca4g7rsa.cer /etc/dovecot/nii-odca4g7rsa.cer # cp fullchain.pem /etc/dovecot/fullchain.pem # chmod 600 /etc/dovecot/private/dovecot_key.pem
/etc/dovecot/conf.d/ 以下のファイル を編集
# cd /etc/dovecot/conf.d/
# vim 10-master.conf
... service imap-login { inet_listener imap { port = 143 } inet_listener imaps { port = 993 # コメントアウトを外す ssl = yes # コメントアウトを外す } ... |
# vim 10-ssl.conf
ssl = yes ssl_cert = </etc/dovecot/fullchain.pem ssl_key = </etc/dovecot/private/dovecot_key.pem #ssl_ca = # コメントアウトを外さない |
dovecot を再起動する.
# systemctl restart dovecot
imaps の動作確認
# ss -ant | grep 993 # IMAPS の確認 LISTEN 0 100 0.0.0.0:993 0.0.0.0:* LISTEN 0 100 [::]:993 [::]:* # ss -ant | grep 143 # IMAP の確認 LISTEN 0 100 0.0.0.0:143 0.0.0.0:* LISTEN 0 100 [::]:143 [::]:* |
Thunderbird でいつも通りアカウント作成. この際, dovecotpwdbg が cron で動いていると /etc/dovecot.cram-md5 の中身が 書き換わってしまうので, MD5 認証データベースファイルの作成を 参考にMD5形式のパスワードを作成しなおす.
名前: mondohoge メールアドレス: mondohoge@usuzumi.ep.sci.hokudai.ac.jp |
手動設定.
受信サーバ: IMAP ポート番号: 993 SSL: SSL/TLS 認証方式: 暗号化されたパスワード認証 |
自分宛にメールを出してみる. このとき,/etc/smtppasswd にパスワードが書かれていないと失敗するので注意.
最終更新日:2025/07/29 (山本 峻大) | Copyright © 2000-2025 epcore |