qmail : メールサーバ

qmailでセキュリティ安心

目的

1. qmail導入の前準備

    sendmailを除去する。

    ●qmailがシステム起動時に起動されないようにするためにスタートアップファイルS80sendmailを無効にする。
    # cd /etc/rc.d/rc3.d/
    # mv S80sendmail _S80sendmail

    sendmailそのものを使用されることを防ぐため、名前を変更し、更に実行権も無くしておこう。
    # which sendmail
    /usr/sbin/sendmail
    # cd /usr/sbin/
    # mv sendmail sendmail.bak
    # chmod 0 sendmail.bak

    ここで、再起動するが、筆者の場合MiracleLinuxを使っているので、miracleserviceと入力し実行して、エンターキー、Xキーで実行を止める。(TurboLinuxの場合、turboservice)
    # miracleservice (MiracleLinuxを使っている場合のみ)
    # reboot

    ●pop, imapサーバも起動しないようにする。(qmailはqmail用のpopサーバが付属している)
    /etc/inetd.confを変更する。
    # vi /etc/inetd.conf

    次のようにpop-3をコメントアウトする。imapも同様。
    #
    # Pop and imap mail services et al
    #
    #pop-2 stream tcp nowait root /usr/sbin/tcpd ipop2d
    #pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d
    #imap stream tcp nowait root /usr/sbin/tcpd imapd
    #
    この新しい設定を有効にするために次のコマンドを実行する。
    # killall -HUP inetd

    ●ダウンロード前の作業
    今回はダウンロード先を自分のディレクトリにtempディレクトリを作ってそこに保存した。
    # cd ~/
    # mkdir temp
    # cd temp

    ●qmailをゲットする。
    http://www.jp.qmail.org/(日本語)
    http://www.qmail.org/(英語)
    2001年7月現在、1.0.3を以下からダウンロードした。
    ftp://ftp.nlc.net.au/pub/unix/mail/qmail/qmail-1.03.tar.gz

    ●パッチファイルをゲットする。
    ヘッダ日付の世界標準時をローカルタイム日本時間に修正するパッチ。
    ftp://ftp.nlc.net.au/pub/unix/mail/qmail/qmail-date-localtime.patch

    ●checkpasswordをゲットする。
    パスワードチェックのプログラムで、qmailのpopが使用する。
    http://cr.yp.to/checkpwd/install.html
    checkpassword-0.90.tar.gzをダウンロードする。

    ●解凍する。
    tarコマンドを使って解凍する。
    tar -zxvf k

    解凍したらこのようになっているはず。(自分のディレクトリにtempディレクトリを作って作業した)
    # cd ~/temp
    # ls
    checkpassword-0.90.tar qmail-1.03.tar.gz
    checkpassword-0.90/ qmail-1.03/ qmail-date-localtime.patch

    ●パッチを当てる。
    qmailのディレクトリ内に移動して、patchコマンドを実行する。
    # cd qmail-1.0.3
    # patch < ../qmail-date-localtime.patch

    ftpで使用する主なコマンド
    ftp
    open
    ls
    !ls
    cd
    pwd
    bin
    asc
    bye
    字を間違えて入力したらctl+hでバックスペースの機能を果たす。

2. qmailをインストールしよう

    qmailディレクトリを作る。
    # mkdir /var/qmail

    ●グループnofilesとユーザの登録

      # groupadd nofiles
      # useradd -g nofiles -d /var/qmail/alias alias
      # useradd -g nofiles -d /var/qmail qmaild
      # useradd -g nofiles -d /var/qmail qmaill
      # useradd -g nofiles -d /var/qmail qmailp

    ●グループqmailとユーザの登録
    # groupadd qmail
    # useradd -g qmail -d /var/qmail qmailq
    # useradd -g qmail -d /var/qmail qmailr
    # useradd -g qmail -d /var/qmail qmails

    ●ユーザのシェルを変更
    デフォルトの/bin/bashではなく、/bin/trueに変更しよう。
    # vi /etc/passwd
    以下のように変更。
    alias:x:507:502::/var/qmail/alias:/bin/true
    qmaild:x:508:502::/var/qmail:/bin/true
    qmaill:x:509:502::/var/qmail:/bin/true
    qmailp:x:510:502::/var/qmail:/bin/true
    qmailq:x:511:503::/var/qmail:/bin/true
    qmailr:x:512:503::/var/qmail:/bin/true
    qmails:x:513:503::/var/qmail:/bin/true

    MEMO
    Linux以外のプラットホームでのユーザ登録方法
    http://www.jp.qmail.org/q103/jinstall/install.ids.html

    ●コンパイル&インストール
    いよいよコンパイルとインストールを実行する。
    qmailを解凍したディレクトリに移動する。そしてmakeコマンドを実行する。
    # cd ~/temp/qmail-1.0.3
    # make setup check
    わらわらとメッセージが表れるので眺めていればよい。
    速読のできる人以外は読めないしね(^^)
    メッセージの最後は./installと./instcheckで終わっていると思う。/var/qmailをのぞくといくつかのディレクトリができているはず。

    ●自分のホストの名前を設定する
    インストールが終わったら、やはりqmailを解凍したディレクトリでconfig-fastを実行する。
    # cd ~/temp/qmail-1.0.3
    # ./config-fast dns.mydomain.com
    Your fully qualified host name is dns.mydomain.com.
    Putting dns.mydomain.com into control/me...
    Putting mydomain.com into control/defaultdomain...
    Putting mydomain.com into control/plusdomain...
    Putting dns.mydomain.com into control/locals...
    Putting dns.mydomain.com into control/rcpthosts...
    Now qmail will refuse to accept SMTP messages except to dns.mydomain.com.
    Make sure to change rcpthosts if you add hosts to locals or virtualdomains!

    そして以下のようなファイルが/var/qmail/controlのディレクトリに作成されるので確認しよう。
    # ls -lt /var/qmail/control
    total 20
    -rw-r--r-- 1 root root 16 Jul 15 10:38 defaultdomain
    -rw-r--r-- 1 root root 20 Jul 15 10:38 locals
    -rw-r--r-- 1 root root 20 Jul 15 10:38 me
    -rw-r--r-- 1 root root 16 Jul 15 10:38 plusdomain
    -rw-r--r-- 1 root root 20 Jul 15 10:38 rcpthosts

    なぜ自分のホスト名を手動登録したかとゆうと、ネットワークダウンでDNS検索できない状態でもローカルでメール配送できるように配慮しているからだそうだ。

    ●エイリアスを登録する
    # cd /var/qmail/alias
    # touch .qmail-postmaster
    # touch .qmail-mailer-daemon
    # touch .qmail-root
    # chmod 644 .qmail*

    ●rcファイルをコピーする
    /var/qmail/boot/homeを/var/qmail/にコピーする。
    # cd /var/qmail/boot/
    # ls
    binm1* binm2* binm3* home* proc*
    binm1+df* binm2+df* binm3+df* home+df* proc+df*
    # cp home ../rc

    これでqmailのインストールは完了。お疲れさまでした(^^)
    筆者はここでコーヒータイムにしました。

3. qmailの動作確認

    ●ブートする
    ブートスクリプト/var/qmail/rcを実行しよう。qmailに必要なデーモンが起動される。
    # csh -cf /var/qmail/rc &
    psコマンドで確認してみよう。
    # ps ax
    ...
    4477 pts/0 S 0:00 -sh -cf /var/qmail/rc
    4478 pts/0 S 0:00 qmail-send
    4479 pts/0 S 0:00 splogger qmail
    4480 pts/0 S 0:00 qmail-lspawn ./Mailbox
    4481 pts/0 S 0:00 qmail-rspawn
    4482 pts/0 S 0:00 qmail-clean
    ...

    ●送信テスト
    qmail-injectを手動で実行して、手動でメールを送信しよう。qmail-injectは起動するとカーソルが表示されるだけなので、そのままタイプすればよい。ユーザ名はこのホストに登録してあるもの。
    # /var/qmail/bin/qmail-inject
    to: kitano
    test

    配送されたユーザのホームディレクトリにMailboxという名前のファイルが作られる。
    # ls -l /home/kitano/public_html/
    -rw------- 1 kitano users 366 Jul 15 11:43 Mailbox
    /etc/passwdの設定によってはログインディレクトリが違うのでチェックしておこう。筆者の場合はwebでの利用を中心としたユーザなのでpublic_htmlに設定してある。

    ローカル配送が無事確認できたら、外部アドレスにメールを送信してみよう。qmail-injectを実行しても何もメッセージが現れないが、to:と入力していく。タイトルのTestを入力してリターンした後はcontrol+Dで抜ける。

    # /var/qmail/bin/qmail-inject
    to: y_sasaki@mac.com
    Test

    自分にメールを送ってみた。ちゃんと受け取れたのを確認して感動にひたった筆者であった(^^)

    ●受信テスト
    qmailのSMTPデーモンであるqmail-smtpdを起動する。qmail-smtpdをinetdによって起動するように/etc/inetd.confを修正する。
    # vi /etc/inetd.conf
    次のように以前のsmtpはコメントアウトして新しい1行を追加する。
    #smtp stream tcp nowait root /usr/bin/smtpd smtpd
    smtp stream tcp nowait qmaild /var/qmail/bin/tcp-env tcp-env /var/qmail/bin/qmail-smtpd

    修正・保存したらinetdを再起動する。
    プロセス番号を調べる。
    # ps ax | grep inetd
    453 ? S 0:00 inetd
    HUPシグナルで再起動。
    # kill -HUP 453

    外部からこのホスト宛にメールを送ってみよう。kitano@dns.mydomain.comに送ってみた。
    受信できたかを確認しよう。
    # cd /home/kitano/public_html
    # vi Mailbox
    下の方に今送ったメールのメッセージが書かれているはずだ。

    メールログも確認しておこう。
    # vi /var/log/maillog
    下の方に今送信したメールアドレスなどが記録されているはず。

4. メールサーバとしての設定

    ●maildir形式を使う
    mbox形式よりmaildir形式の方が安全性が高く、効率的である。よってmaildir形式に変更する作業をする。
    まず、maildirを使用するユーザでログインして、
    $ /var/qmail/bin/maildirmake $HOME/Maildir
    $ ls $HOME/Maildir
    cur/ new/ tmp/
    自分のホームディレクトリにMaildirが作成され、その中に3つのディレクトリができあがる。

    次にMaildirにメールを配送するように.qmailファイルを記述する。ホームディレクトリに.qmailというファイルを作り1行加える。
    $ vi $HOME/.qmail
    次の1行を書き込む。
    ./Maildir/
    で保存する。

    以上をユーザごとに行なえばよい。

    ●qmailブートスクリプトである/var/qmail/rcをこのように修正する。
    # vi /var/qmail/rc
    このようにMailboxをMaildirに修正する。

    #!/bin/sh
    # Using splogger to send the log through syslog.
    # Using qmail-local to deliver messages to ~/Mailbox by default.

    exec env - PATH="/var/qmail/bin:$PATH" \
    qmail-start ./Maildir splogger qmail

    修正を有効にするため、qmailのデーモンを再起動する。
    # ps ax | grep qmail*
    4477 ? S 0:00 -sh -cf /var/qmail/rc
    4478 ? S 0:01 qmail-send
    4479 ? S 0:00 splogger qmail
    4480 ? S 0:00 qmail-lspawn ./Mailbox
    4481 ? S 0:00 qmail-rspawn
    4482 ? S 0:00 qmail-clean
    # kill 4477
    # csh -cf /var/qmail/rc &
    最後の&を付け忘れて実行したら、ctl + cで。

    ●qmail-pop3dを使おう
    前準備としてcheckpasswordをインストールしよう。さっき自分のホームディレクトリの下のtempディレクトリにftpしてあるので、そこに移動する。
    # cd ~/temp/checkpassword-0.90
    コンパイルとインストールを行なう。
    # make setup check

    inetd.confでqmail-pop3dを使えるようにしよう。
    # vi /etc/inetd.conf

    #
    # Pop and imap mail services et al
    #
    #pop-2 stream tcp nowait root /usr/sbin/tcpd ipop2d
    #pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d
    pop-3 stream tcp nowait root /usr/sbin/tcpd /var/qmail/bin/qmail-popup dns.mydomain.com /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir
    #imap stream tcp nowait root /usr/sbin/tcpd imapd
    #

    dns.mydomain.comを自分のサイト名で置き換えて、必ず1行で入力する。

    修正を有効にする。
    # killall -HUP inetd

    特定クライアントへのリレー許可とアクセス許可の設定
    # vi /etc/hosts.allow

    #
    # hosts.allow
    #

    tcp-env :127. :setenv = RELAYCLIENT
    tcp-env :192.168.0. :setenv = RELAYCLIENT
    tcp-env :ALL

    qmail-popup :ALL

    ALL :127.0.0.1
    ...

    この設定では、
    ・127.(ローカル接続)はリレー許可
    ・192.168.0.(クライアント達)もリレー許可
    ・ALL(外部から)はメールを受信するけどリレーはしないよ
    ・ALL(外部から)、メールを読むことができるよ

    このサーバが自宅から離れたところにあったとして、
    ・自宅からso-net等のメールでmydomain宛にメールを送信できる
    ・自宅からmydomainに届いたメールを読むことができる
    ・自宅からこのmydomainのアカウントでメールを送信できない(不正中継防止)
    ことを確認しよう。

5. その他の設定
sendmailをCGIからキックすることはよくある。このsendmailコマンドが使えるようにしよう。
●qmailのsendmail wrapperを使用可能にする
シンボリックリンクを張ろう。
# ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail
# ln -s /var/qmail/bin/sendmail /usr/lib/sendmail
/usr/libにsendmailのシンボリックリンクが存在してたら消しておこう。