maehachi08 Anything Blog

2012年05月04日
qmailインストール

qmailとパッチ

メールサーバとしては一番有名なsendmailですが、脆弱性の改善などでプログラムが巨大化し、複雑さを増しました。対してqmailはシンプルで堅牢性の高いメールサーバを目指して開発されたことから脆弱性がほとんど発見されず、現在の最新バージョンが1998年6月15日にリリースされた1.03であることには驚かされます。

それでも様々なパッチが作成されていますので、大規模なメールサーバ運用を行うためには多くのパッチをあてる必要があります。qmailパッチ集を提供するサイトとしてはQmailtoasterというサイトがあり、ここのRPMパッケージなどを活用すればパッチ適用が楽になります。

ソースの入手

qmailはライセンス形態の都合によりLinuxディストリビューションごとにコンパイル済みのパッケージとしての配布が難しい状態です。従ってソースからコンパイルしてインストールする手順を踏みます。

qmailのソース配布ミラーサイトは結構閉鎖しているサイトも多く、探すのに少し時間を要しました。
しかし、Bruteberry Engineering様で配布されていることが確認できましたので、今回はこちらを利用させて頂きます。

# wget http://www.bruteberry.com/wp-content/uploads/qmail-1.03.tar.gz
--2012-04-09 00:34:36--  http://www.bruteberry.com/wp-content/uploads/qmail-1.03.tar.gz
www.bruteberry.com をDNSに問いあわせています... 219.94.192.29
www.bruteberry.com|219.94.192.29|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 220668 (215K) [application/x-tar]
`qmail-1.03.tar.gz' に保存中

100%[================================================>] 220,668     1.05M/s 時間 0.2s

2012-04-09 00:34:36 (1.05 MB/s) - `qmail-1.03.tar.gz' へ保存完了 [220668/220668]

パッチの入手

様々なパッチがあるのだが、最低限あてておきたいパッチを2つ紹介します。それ以外のパッチはおいおい。。。


  • 日本標準時対応パッチ

  • ヘッダに記録される日付・時間情報をローカルタイムに合わせるためのパッチ『qmail-date-localtime.patch』を適用します。このパッチを適用したqmailサーバから配信されたメールには、日本標準時を意味する「+0900」が付加されます。該当URLにアクセスするとテキストでソースが表示されますので、curlコマンドでファイルにリダイレクトします。

    # curl http://www.ksknet.net/sample/qmail-date-localtime.patch > qmail-date-localtime.patch
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100  2603  100  2603    0     0   8885      0 --:--:-- --:--:-- --:--:-- 20023
    

  • DNS問合せの受信可能なレスポンスパケット数拡張パッチ

  • qmailではDNSサーバからのレスポンスを512バイトまでしか受け取らない仕様になっています。しかし、最近のDNSSEC対応によって512バイト以内のレスポンスは少なく、qmail側でドメインのメールサーバを確認できずに該当ドメインのメールサーバへメッセージを転送できないという事態に陥ります。該当URLにアクセスするとテキストでソースが表示されますので、curlコマンドでファイルにリダイレクトします。

    # curl http://www.ckdhr.com/ckd/qmail-103.patch > qmail-103.patch
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100  2104  100  2104    0     0   5186      0 --:--:-- --:--:-- --:--:--  134k
    

    パッチ適用

    ダウンロードしたqmailのソースtarボールを解凍して、パッチを適用します。

    # ls -l qmail-1.03.tar.gz
    -rw-r--r-- 1 root root 220668  5月 11 22:08 2011 qmail-1.03.tar.gz
    
    # tar xzvf qmail-1.03.tar.gz
    
    # cd qmail-1.03
    
    パッチを適用します。
    # patch -p1 < ../qmail-date-localtime.patch
    patching file date822fmt.c
    
    # patch -p1 < ../qmail-103.patch
    patching file dns.c
    
    

    qmail運用ディレクトリ作成

    qmailインストール先のprefixとなるディレクトリを作成します。デフォルトでは/var/qmailディレクトリにインストールされます。このディレクトリ以下にはqmailの実行可能ファイル、設定ファイル、メールキューディレクトリが配置されますので、慎重に決めましょう!今回はデフォルトの/var/qmailディレクトリとしたいと思います。

    # mkdir /var/qmail
    

    qmail設定パラメータの変更

    ソースtarボールを解凍して作成されるqmail-1.03ディレクトリにはconf-*で始まるファイルがあり、インストール時にqmailの設定に使用するパラメータとなります。

    # pwd
    /usr/local/src/qmail-1.03
    # ls -l conf*
    -rw-r--r-- 1 root bin  280  6月 15  1998 conf-break
    -rw-r--r-- 1 root bin   47  6月 15  1998 conf-cc
    -rw-r--r-- 1 root bin  215  6月 15  1998 conf-groups
    -rw-r--r-- 1 root bin   62  6月 15  1998 conf-ld
    -rw-r--r-- 1 root bin  189  6月 15  1998 conf-patrn
    -rw-r--r-- 1 root bin  521  6月 15  1998 conf-qmail
    -rw-r--r-- 1 root bin  168  6月 15  1998 conf-spawn
    -rw-r--r-- 1 root bin   42  6月 15  1998 conf-split
    -rw-r--r-- 1 root bin  347  6月 15  1998 conf-users
    -rw-r--r-- 1 root bin  973  6月 15  1998 config-fast.sh
    -rw-r--r-- 1 root bin 2059  6月 15  1998 config.sh
    

    各パラメータファイル説明については改めて記事にしたいと思います。

    qmailシステムユーザ/グループの作成

    qmailでは動作するモジュールごとに動作ユーザが異なります。先述したconf-usersファイルとconf-groupsファイルで指定されたユーザとグループを作成します。

    # groupadd nofiles
    # useradd -g nofiles -d /var/qmail/alias -s /bin/false alias
    # useradd -g nofiles -d /var/qmail -s /bin/false qmaild
    # useradd -g nofiles -d /var/qmail -s /bin/false qmaill
    # useradd -g nofiles -d /var/qmail -s /bin/false qmailp
    # groupadd qmail
    # useradd -g qmail -d /var/qmail -s /bin/false qmailq
    # useradd -g qmail -d /var/qmail -s /bin/false qmailr
    # useradd -g qmail -d /var/qmail -s /bin/false qmails
    
    # grep "qmail" /etc/passwd
    alias:x:5002:5003::/var/qmail/alias:/bin/false
    qmaild:x:5003:5003::/var/qmail:/bin/false
    qmaill:x:5004:5003::/var/qmail:/bin/false
    qmailp:x:5005:5003::/var/qmail:/bin/false
    qmailq:x:5006:5004::/var/qmail:/bin/false
    qmailr:x:5007:5004::/var/qmail:/bin/false
    qmails:x:5008:5004::/var/qmail:/bin/false
    
    # egrep 'qmail|nofiles' /etc/group
    nofiles:x:5003:
    qmail:x:5004:
    

    qmailのコンパイル

    さて、ここまでで必要なパッチを適用し、パラメータファイルの設定値を適宜変更しました。
    次はqmailのコンパイルですが、ソースディレクトリ内でコマンド1発というなんともシンプルなものです。

    64bitOSをお使いの方はここでエラーが出るので要注意です。

    # make setup check
     ・
     ・
     ・
    auto-str.c:8: 警告: conflicting types for built-in function ‘puts’
    ./load auto-str substdio.a error.a str.a
    /usr/bin/ld: errno: TLS definition in /lib64/libc.so.6 section .tbss mismatches non-TLS reference in substdio.a(substdo.o)
    /lib64/libc.so.6: could not read symbols: Bad value
    collect2: ld はステータス 1 で終了しました
    make: *** [auto-str] エラー 1
    

    どうやらconf-ccに記載されたqmailの.cソースコードファイルのコンパイルに使用するコンパイラコマンドをコマンドラインオプションがデフォルト設定だと64bitOSの場合はうまくコンパイル出来ないようです。正しいコンパイラオプションを追記しましょう。

    # echo "gcc -O2 --include /usr/include/errno.h" > conf-cc
    

    再度コマンドを実行します。

    # make setup check
    ( cat warn-auto.sh; \
            echo CC=\'`head -1 conf-cc`\'; \
            echo LD=\'`head -1 conf-ld`\' \
            ) > auto-ccld.sh
     ・
     ・
     ・
    nroff -man forgeries.7 > forgeries.0
    ./install
    ./instcheck
    
    # ./install
    
    # ./instcheck
    
    

    コンパイルとインストールが終了しました。

    configスクリプトでDNS逆引きチェック

    ソースディレクトリでconfigスクリプトを実行してFQDNの逆引きチェックを行います。configスクリプトを実行すると/var/qmail/controlディレクトリのパラメータファイルのいくつかを作成します。

    # ./config
    Your hostname is pachi01.maepachi.com.
    Your host's fully qualified name in DNS is v-183-181-54-112.ub-freebit.net.
    Putting v-183-181-54-112.ub-freebit.net into control/me...
    Putting ub-freebit.net into control/defaultdomain...
    Putting ub-freebit.net into control/plusdomain...
    
    Checking local IP addresses:
    127.0.0.1: Adding localhost to control/locals...
    183.181.54.112: Adding v-183-181-54-112.ub-freebit.net to control/locals...
    183.181.54.187: Adding v-183-181-54-187.ub-freebit.net to control/locals...
    
    If there are any other domain names that point to you,
    you will have to add them to /var/qmail/control/locals.
    You don't have to worry about aliases, i.e., domains with CNAME records.
    
    Copying /var/qmail/control/locals to /var/qmail/control/rcpthosts...
    Now qmail will refuse to accept SMTP messages except to those hosts.
    Make sure to change rcpthosts if you add hosts to locals or virtualdomains!
    

    configスクリプトの内容ではdnsfqなどのバイナリ実行ファイルでDNS問合せを行った結果を/var/qmail/controlディレクトリのいくつかのファイルに書き込みます。どのファイルを生成するのかはconfigスクリプトの内容を確認してみます。

    # grep "/var/qmail/control/" /usr/local/src/qmail-1.03/config
            echo "$fqdn" > /var/qmail/control/me
            chmod 644 /var/qmail/control/me
              echo "$ddom" > /var/qmail/control/defaultdomain
              chmod 644 /var/qmail/control/defaultdomain
              echo "$pdom" > /var/qmail/control/plusdomain
              chmod 644 /var/qmail/control/plusdomain
            : > /var/qmail/control/locals
            chmod 644 /var/qmail/control/locals
                    echo "$local" >> /var/qmail/control/locals
            echo you will have to add them to /var/qmail/control/locals.
            echo Copying /var/qmail/control/locals to /var/qmail/control/rcpthosts...
            cp /var/qmail/control/locals /var/qmail/control/rcpthosts
            chmod 644 /var/qmail/control/rcpthosts
    

    【余談】configスクリプトでDNS逆引きチェック出来ない場合

    ソースディレクトリでconfigスクリプトを実行してFQDNの逆引きチェックを行います。configスクリプトを実行すると/var/qmail/controlディレクトリのパラメータファイルのいくつかを作成します。
    qmailインストールホスト自身をDNS名前解決が出来ない場合、以下のエラーが表示されます。

    # ./config
    Your hostname is phoment01.
    hard error
    Sorry, I couldn't find your host's canonical name in DNS.
    You will have to set up control/me yourself.
    You have new mail in /var/spool/mail/root
    

    これはFQDNが正しく設定されていない場合や、所属ドメインのMXレコードが設定されていない場合などに表示されます。
    この場合は手動で各種パラメータファイルを設定します。

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

    インストール作業終了

    とりあえず、/var/qmailディレクトリ以下にqmail実行ファイル、設定ファイル、メールキューの格納ディレクトリが作成されたのでOKとしましょうか。

    # cd /var/qmail/
    
    # ls -l
    合計 32
    drwxr-sr-x  2 alias  qmail 4096  4月 21 19:42 alias
    drwxr-xr-x  2 root   qmail 4096  4月 21 19:42 bin
    drwxr-xr-x  2 root   qmail 4096  4月 21 19:42 boot
    drwxr-xr-x  2 root   qmail 4096  4月 21 19:48 control
    drwxr-xr-x  2 root   qmail 4096  4月 21 19:42 doc
    drwxr-xr-x 10 root   qmail 4096  4月 21 19:42 man
    drwxr-x--- 11 qmailq qmail 4096  4月 21 19:42 queue
    drwxr-xr-x  2 root   qmail 4096  4月 21 19:42 users