Mail/qmail

update at 2017.6.15

qmail の導入

セキュアで高速なMTAであるqmailのインストールを行う。qmailにはいくつかのパッチが提供されているが、推奨パッチを適用するのであれば、qmail-1.03にrecommended patchを追加した netqmail-1.06を用いるとインストールの手間を軽減できる。

qmalが提供する機能はMTAの基本機能に限られる。実運用ではPOPサービスでのユーザ認証やSMTPサービスの接続制限は必要となってくるため、それぞれ checkpasswordと、ucspi-tcp(tcpserver)を導入して対応する。

パッケージ入手

必要なパッケージを入手する

No. パッケージ URL 説明
1 qmail-1.03.tar.gz http://cr.yp.to/qmail.html MTA
2 netqmail-1.06.tar.gz http://qmail.org/ qmailにセキュリティパッチを充てたもの
3 ucspi-tcp-0.88.tar.gz http://cr.yp.to/ucspi-tcp.html tcpserver
3a ucspi-tcp-ssl.patch -- tcpserver のsslパッチ
4 checkpassword-0.90.tar.gz http://cr.yp.to/checkpwd.html ユーザパスワード認証
4a checkpassword-pam-0.96.tar.gz http://checkpasswd-pam.sourceforge.net ユーザパスワード認証。PAM版
5 qmail-smtpd-auth-0510_tgz_bin http://www.fehcom.de/qmail/smtpauth.html SMTP Auth パッチ

事前作業

実行アカウントの作成を行う。安全なMTA運用のために qmail関連のプロセスには root権限を持たない専用のアカウントを用意する。作成するグループ、アカウントは netqmail-1.06/INSTALL.idsで説明されている通りに準備する。

  # groupadd -g 900 nofiles
  # useradd -u 900 -g nofiles -d /var/qmail qmaild              …daemon user
  # useradd -u 901 -g nofiles -d /var/qmail qmaill              …log user
  # useradd -u 902 -g nofiles -d /var/qmail qmailp              …passwd user
  # useradd -u 903 -g nofiles -d /var/qmail/alias alias         …alias user
  # groupadd -g 901 qmail
  # useradd -u 904 -g qmail -d /var/qmail qmailq                …queue user
  # useradd -u 905 -g qmail -d /var/qmail qmailr                …remote user
  # useradd -u 906 -g qmail -d /var/qmail qmails                …send user

インストール

パッケージを取得・展開して、環境に応じてヘッダファイルの修正を行う。パッケージに含まれる error.hは古い glibc向けに作成されているため、必要に応じて修正を行う。ucspi-tcp は提供されているパッチを適用してもよい。インストール先をデフォルトから変更する場合は conf-homeファイルの設定内容を変更する。

netqmail-1.06
  > tar xfz netqmail-1.06.tar.gz
  > cd netqmail-1.06
  > vi conf-qmail        …インストール先を変更する場合に修正するファイル。(非推奨)
  > tar xfz qmail-smtpd-auth-0510.tgz  …SMTP AUTH 
  > ./install_smtpd-auth.sh 
...
cp: cannot create regular file '/var/qmail/doc/': No such file or directory
   ※README.auth のコピー失敗。後で手作業でコピーするのでここでは無視で良い。
...
  > make
  # make setup check
  # cp README.auth /var/qmail/doc/
  # chown root.qmail /var/qmail/doc/README.auth

checkpassword
  > tar xfz checkpassword-0.90.tar.gz
  > cd checkpassword-0.90
  > vi error.h
  - extern int errno;
  + #include <errno.h>
  > vi conf-home              …/var/qmail/bin をインストール先にする
  - /
  + /var/qmail
  > make
  # make setup check

ucspi-tcp
  > tar xfz ucspi-tcp-0.88.tar.gz
  > cd ucspi-tcp-0.88
  > patch < ../ucspi-tcp-ssl-20050405.patch  …ssl通信パッチ
patching file FILES
 ...
patching file tcpserver.c
patching file who@.1
  > vi conf-home
  - /usr/local
  + /usr/local/ucspi-tcp      …/usr/local/ucspi-tcp をインストール先にする
  > make
  # make setup check
HINT1: checkpasswordの動作確認方法
プロセス置換で descriptor 3へ流し込んだusernameとpasswordでテストできる。
# exec 3< <(echo -e "username\0password\0")
# /var/qmail/bin/checkpassword pwd
/home/sample
または、qmailのPOPプログラムでも確認できる。
# /var/qmail/bin/qmail-popup localhost /var/qmail/bin/checkpassword pwd
+OK <4368.1602393112@localhost>
user sample
+OK
pass pw1234
/home/sample
HINT2: PAM版のcheckpassword
checkpassword-pam -s checkpassword-pam
> tar xfz checkpassword-pam-0.96.tar.gz
> cd checkpassword-pam-0.96
> ./configure --prefix=/var/qmail
> make
# make install

# cat > /etc/pam.d/checkpassword-pam
#%PAM-1.0
#

auth        required     pam_nologin.so
auth        include      system-auth
account     include      system-auth
session     include      system-auth
EOF

設定

各種制御ファイルの設定を行う。基本設定は パッケージで一緒に提供される config-fastを利用するのが便利。メールドメインを引数にして実行すると、必要最小限の設定ファイルを自動生成してくれる。

  > cd netqmail-1.06
  # config-fast mail.domain.name
  Your fully qualified host name is mail.domain.name
  Putting mail.domain into control/me...
  Putting domain.name into control/defaultdomain...
  Putting domain.name into control/plusdomain...
  Putting mail.domain.name into control/locals...
  Putting mail.domain.name into control/rcpthosts...
  Now qmail will refuse to accept SMTP messages except to mail.domain.name
  Make sure to change rcpthosts if you add hosts to locals or virtualdomains!

外部へのメール転送を行うときに、ISPから中継サーバを指定されている場合は smtproutesファイルを生成する。

  # cat > /var/qmail/control/smtproutes          ... ISPから指定されたSMTPフォワード先(xxx.xxx.xx)を設定
  :xxx.xxx.xx

エイリアスの設定を行う。root@、mailer-daemon@、postmaster@宛のメールを管理者メールアドレス(user-accout@)へ転送されるようにしておく。その他転送が必要なアドレスがあればここで一緒に追加しておく。

  # cd /var/qmail/alias
  # echo "&user-account" > .qmail-root
  # echo "&root" > .qmail-mailer-daemon
  # echo "&root" > .qmail-postmaster
  # echo "&root@ > .qmail-webmaster

ucspi-tcp(tcpserver)の接続制限設定を行う。ローカルホストと、ローカルセグメント(10.0.0.0/24)にある端末からの外部サーバへのメール送信要求を許可(環境変数RELAYCLIENTをクリア)する。

  > cd /var/qmail/smtpd/
  # cat > smtp.cfg
  127.0.0.1:allow,RELAYCLIENT=""
  10.0.0.:allow,RELAYCLIENT=""
  :allow
  # /usr/local/bin/tcprules smtp.cdb smtp.tmp < smtp.cfg

SMTPS用のRSA鍵・SSL証明書を作成する

  # cat server.crt server.key > /var/qmail/smtpd/qmail.pem

ユーザ環境

  > cd ~
  > /var/qmail/bin/maildirmake Maildir
  > echo ./Maildir/ > .qmail

起動

qmail 起動スクリプト rc.qmail
SMTP-AUTH(checkpassword-pam)の場合

#!/bin/sh
#
# start/stop qmail daemon
#
# chkconfig: 2345 80 10
#
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

case "$1" in
        start)

        # qmail
        env - PATH="/var/qmail/bin:$PATH"               
                qmail-start ./Maildir/ splogger qmail &

        # SMTP
        tcpserver                               
                 -R                             # IDENTを行わない
                -u qmaild -g nofiles            # qmaild/nofiles 権限で起動
                -x /var/qmail/smtpd/smtp.cdb    # 接続制御データベース
                0                               # ホストを指定しない
                smtp                            # smtp ポート
                /var/qmail/bin/qmail-smtpd      # 起動プログラム
                /var/qmail/bin/checkpassword-pam -s checkpassword-pam /bin/true 2>&1                  
                | /var/qmail/bin/splogger smtpd 2 & # ロガー

        # SMTPS
        tcpserver                               
                -R                              # IDENTを行わない
                -s -n /var/qmail/smtpd/qmail.pem      
                -u qmaild -g nofiles            # qmaild/nofiles 権限で起動
                -x /var/qmail/smtpd/smtp.cdb    # 接続制御データベース
                0                               # ホストを指定しない
                smtps                           # smtps ポート
                /var/qmail/bin/qmail-smtpd      # 起動プログラム
                /var/qmail/bin/checkpassword-pam -s checkpassword-pam /bin/true 2>&1                  
                | /var/qmail/bin/splogger smtpd 2 & # ロガー

        ;;

        stop)
                PID=$(ps -aefw | grep qmail | awk '{print $2}')
                if [ ! -z "${PID}" ]; then
                        kill ${PID} 1> /dev/null 2>&1
                fi
        ;;

esac

exit 0



---
update at 2022/01/09 14:28:25

※注:当サイトは特定環境において確認できた事象のみを記述しています。他の環境での動作は一切保証しません。