qmail1.03のインストール(2001.06.06)

MTAの選択肢には何通りか(sendmail,qmail,postfix,その他)あると思うが、私はあえてqmailを使う。
まずセキュリティホールがないこと。高速なこと。それでいてバージョンアップが殆どないこと。

【qmailのインストール準備】
インストールを行う前に準備。
とりあえず
http://www.jp.qmail.org/
から最低限必要なものをダウンロード、最新版を落としてくること。
2001/06/06時点ではこれ↓
・qmail-1.03.tar.gz
・ucspi-tcp-0.88.tar.gz
・checkpassword-0.90.tar.gz
・qmailanalog-0.70.tar.gz(これは最低限必要というわけではないが・・・あったほうがいいでしょう)
     qmailanalogのインストールはこちら
もうひとつ忘れてはいけないものがある。
ftp://ftp.nlc.net.au/pub/unix/mail/qmail/
・qmail-date-localtime.patch(時間をちゃんと日本時間にしてくれるパッチ)

とりあえずサーバの作業ディレクトリにアップロードしておきましょう。

【インストール】
とりあえずソースたちはここにある。

[root@home5 qmail]# ls -l /work/qmail/
合計 320
-rw-r--r-- 1 nitta nitta 15631 6月 6 22:09 checkpassword-0.90.tar.gz
-rw-r--r-- 1 nitta nitta 220668 6月 6 22:09 qmail-1.03.tar.gz
-rw-r--r-- 1 nitta nitta 2603 6月 6 22:09 qmail-date-localtime.patch
-rw-r--r-- 1 nitta nitta 28416 6月 6 22:09 qmailanalog-0.70.tar.gz
-rw-r--r-- 1 nitta nitta 45848 6月 6 22:09 ucspi-tcp-0.88.tar.gz

1.パッチの適用
[root@home5 qmail]# tar zxvf qmail-1.03.tar.gz
[root@home5 qmail]#cd qmail-1.03
[root@home5 qmail-1.03]# patch < ../qmail-date-localtime.patch
patching file date822fmt.c

2.ディレクトリ作成
[root@home5 qmail-1.03]# mkdir /var/qmail

3.ユーザとグループの追加
※qmailは専用のアカウントが必要であるので追加する必要がある。
 また通常のユーザのようにログインシェルを与えてはいけない。
 よってログインシェルは何も出来ないものを追加しておく。

[root@home5 qmail-1.03]# groupadd qmail
[root@home5 qmail-1.03]# groupadd nofiles
[root@home5 qmail-1.03]# useradd -d /var/qmail -g nofiles -s /bin/true qmaild
[root@home5 qmail-1.03]# useradd -d /var/qmail -g nofiles -s /bin/true qmaill
[root@home5 qmail-1.03]# useradd -d /var/qmail -g nofiles -s /bin/true qmailp
[root@home5 qmail-1.03]# useradd -d /var/qmail/alias -g nofiles -s /bin/true alias
[root@home5 qmail-1.03]# useradd -d /var/qmail -g qmail -s /bin/true qmailq
[root@home5 qmail-1.03]# useradd -d /var/qmail -g qmail -s /bin/ture qmailr
[root@home5 qmail-1.03]# useradd -d /var/qmail -g qmail -s /bin/true qmails

ログインシェルをこうしておけば登録したユーザではログインできない。

登録できたかどうか確認しておく。
[root@home5 qmail-1.03]# grep qmail /etc/passwd
qmaild:x:501:502::/var/qmail:/bin/true
qmaill:x:502:502::/var/qmail:/bin/true
qmailp:x:503:502::/var/qmail:/bin/true
alias:x:504:502::/var/qmail/alias:/bin/true
qmailq:x:505:501::/var/qmail:/bin/true
qmailr:x:506:501::/var/qmail:/bin/true
qmails:x:507:501::/var/qmail:/bin/true
※ユーザIDやグループIDはその環境によって異なる!

4.いよいよコンパイル
 といってもさほど難しくはない。djbさんの作ったプログラムたちはmake setup check でコンパイルするのが
定石となっている。このへんでちょっと戸惑う方もいるかも?

[root@home5 qmail-1.03]# make setup check 2>&1|tee make-seup-check.log
※ここでSolarisではおそらくエラー出るでしょう。
   Solarisでエラーが出るのはconf-ldとconf-ccの中身が
   gccではなくccをつかみに行くように設定されてるからです。
   ccとなっている部分をgccに書き換えてあげましょう。

※redhat9やredhatAS3などでもエラーが出ます。
auto-str.c:17: 警告: `main' の戻り値の型が `int' ではありません
./load auto-str substdio.a error.a str.a
substdio.a(substdo.o)(.text+0x43): In function `allwrite':
: undefined reference to `errno'
collect2: ld はステータス 1 で終了しました
make: *** [auto-str] エラー 1
のような感じで。名のでerror.hファイルを編集してエラーが出ないようにします。
patchなども出ているようですがそこまでするほどではないです。

# vi error.h

extern int errno;
という行の下に追加して以下のようにする

extern int errno;
#include <errno.h>

とエラーが出なくなる。




5.初期設定
 ここで自ホストの名前を設定することになる。
こんな感じ。

[root@home5 qmail-1.03]# ./config-fast home5.jinjin.com 2>&1|tee config-fast.log
Your fully qualified host name is home5.jinjin.com.
Putting home5.jinjin.com into control/me...
Putting jinjin.com into control/defaultdomain...
Putting jinjin.com into control/plusdomain...
Putting home5.jinjin.com into control/locals...
Putting home5.jinjin.com into control/rcpthosts...
Now qmail will refuse to accept SMTP messages except to home5.jinjin.com.
Make sure to change rcpthosts if you add hosts to locals or virtualdomains!

6.エイリアスの登録
[root@home5 qmail-1.03]# cd /var/qmail/alias/
[root@home5 alias]# touch .qmail-postmaster
[root@home5 alias]# touch .qmail-mailer-daemon
[root@home5 alias]# touch .qmail-root
[root@home5 alias]# chmod 644 .qmail*

としたが私はさらに
[root@home5 alias]# echo '&nitta' > .qmail-mailer-daemon
[root@home5 alias]# echo '&nitta' > .qmail-postmaster
[root@home5 alias]# echo '&nitta' > .qmail-root
としておいた。
これで、これらに届いたメールはnittaユーザに配送される。


【POPのインストール】
凄く簡単!
[root@home5 checkpassword-0.90]# cd /work/qmail/checkpassword-0.90
[root@home5 checkpassword-0.90]# make setup check 2>&1|tee make-seup-check.log
[root@home5 checkpassword-0.90]# type checkpassword
checkpassword is /bin/checkpassword

【tcp-serverのインストール】
[root@home5 ucspi-tcp-0.88]# cd /work/qmail/ucspi-tcp-0.88
[root@home5 ucspi-tcp-0.88]# make setup check 2>&1|tee make-seup-check.log

-------あえなくインストール完了----

●設定

smtp用のデータベース作成
・中継を許可するホストを設定ファイルを作成する。

[root@home5 /etc]# cat /etc/tcp.smtp

192.168.128.:allow,RELAYCLIENT=""
127,:allow,RELAYCLIENT=""


・中継を許可するホストのデータベースtcp.smtp.cdbを作成
[root@home5 /etc]# /usr/local/bin/tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp <
/etc/tcp.smtp



pop3用データベース作成
[root@home5 qmail]# cat /etc/tcp.pop3

192.168.128.:allow
127.:allow
:deny

[root@home5 qmail]# /usr/local/bin/tcprules /etc/tcp.pop3.cdb /etc/tcp.pop3.tmp
< /etc/tcp.pop3



------------/etc/rc.localの最後の方に追加---------------

#qmail-smtpd起動 (1行で書く)
/usr/local/bin/tcpserver -x /etc/tcp.smtp.cdb -v -u 501 -g 501 0 smtp /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 &
#qmail-pop3d起動(1行で書く)
/usr/local/bin/tcpserver -x /etc/tcp.pop3.cdb -v 0 pop3 /var/qmail/bin/qmail-popup home5.jinjin.com /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir 2>&1 | /var/qmail/bin/splogger pop3d 3 &
#qmail boot-up
if [ -f /var/qmail/rc ]
then
/bin/csh -cf /var/qmail/rc &
fi


-----------------------------------------
※1:-u 501 の501はqmaildユーザのuid
※2:-g 501 の501はnofilesのグループのgid

 適宜システムの環境に合わせて変更してください。

●ユーザのMaildir形式の採用
qmailは/var/mail/アカウント名 のメール配送ではなく$HOME/Maildirの配送形式を
強く推奨しているので当然それを採用する。
 ※ただし、その場合はメールが全てホームディレクトリに配送されるので/home
  パーティションは必ず計算したサイズで切ることが前提となる。

/homeや/export/homeパーティションは通常よりファイル数が多くなると考えられる。maildirの場合は
1通に1ファイルできるのでもしかするとinodeを少し大きくしたほうがいいかもしれませんね。
特にプロバイダーなどユーザ数が何千と何万と知るところは特に。
実作業は以下のとおり

・qmailのブートファイルをMaildirにであがるように作成・編集
[root@home5 qmail]# cd /var/qmail/boot
[root@home5 boot]# cp home ../rc
[root@home5 boot]# cd ../
[root@home5 qmail]# cp rc rc.org
[root@home5 qmail]# vi rc
root@home5 qmail]# diff rc.org rc
7c7
< qmail-start ./Mailbox splogger qmail
---
> qmail-start ./Maildir/ splogger qmail

・実際にユーザのホームディレクトリに必要なファイルの作成
[root@home5 qmail]# cat /home/nitta/.qmail
./Maildir/
[root@home5 bin]# chown nitta:nitta /home/nitta/.qmail

※必ずユーザ一人一人にこの.qmailのファイルは必要

[root@home5 qmail]# cd /var/qmail/bin
[root@home5 bin]# ./maildirmake /home/nitta/Maildir
 ※一般的にはよく/var/qmail/bin/maildirmake $HOME/Maildir
とあらわされているが別に同じ意味なのでこれでいい。
[root@home5 bin]# ls -l /home/nitta/Maildir/
合計 12
drwx------ 2 root root 4096 6月 12 22:15 cur
drwx------ 2 root root 4096 6月 12 22:15 new
drwx------ 2 root root 4096 6月 12 22:15 tmp
[root@home5 bin]# chown -R nitta:nitta /home/nitta/Maildir

・sendmailラッパーも入れておきましょう
全ての作業が完了したと思ったが、まだ残ったことがあった。
sendmail wrapperの設定を忘れてはいけない。
これはmailコマンドやmailxコマンドを使ったときに標準のsendmailを呼びに行ってしまうので
まずもともとのsendmailを除去して、ラッパーに入れ替えてやる。


インストールしたばかりの状態でsendmailはここにある。
[root@home5 alias]# find / -name sendmail
/usr/lib/sendmail←これは/usr/sbin/sendmailへのシンボリックリンクになってる(RedHat7.3の場合)
/usr/sbin/sendmail

/work/qmail/qmail-1.03/sendmail
/var/qmail/bin/sendmail
/etc/sysconfig/sendmail
/etc/rc.d/init.d/sendmail

findで見つかったこの2つ(上の下線部分)がsendmailなので、こうする↓
[root@home5 alias]# rm /usr/lib/sendmailただのシンボリックリンクなので削除してもよい(RedHat7.3の場合)
[root@home5 alias]# mv /usr/sbin/sendmail /usr/sbin/sendmail.org
[root@home5 alias]# ln -s /var/qmail/bin/sendmail /usr/lib/sendmail
[root@home5 alias]# ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail

ここでsendmailはとりあえず停止してしまいます。
ちょっとせこいかもしれないけど楽すると
[root@home5 alias]# setup
でとめてしまいましょう。(sendmailデーモンが起動してるならそれも停止する。)
※solarisなら/etc/rc2.d/S88sendmail stop
っていうか別にsendmail使わないなら
上のシンボリックリンクする前にsendmail削除してもかまわないでしょう
こんな↓感じで。
---------------------
私はqmail使う予定なのでsendmail関係も削除
#RedHat7.1で実際にやりました。Solarisの方には無用ですね。

[root@home5 /root]# rpm -e sendmail-cf-8.11.2-14
[root@home5 /root]# rpm -e sendmail-8.11.2-14
エラー: これらのパッケージを削除すると依存性を破壊します:
smtpdaemonは fetchmail-5.7.4-4 に必要とされています
smtpdaemonは mutt-1.2.5i-9 に必要とされています

別にnodepsつけて削除してもいいんですけどmuttもfetchmail(これは使うかも・・・)
ということでこいつらも削除
[root@home5 /root]# rpm -e fetchmail-5.7.4-4
[root@home5 /root]# rpm -e mutt-1.2.5i-9
[root@home5 /root]# rpm -e sendmail-8.11.2-14

※削除するんだったら必ず上のシンボリックリンクの作業をする前に
やらないと、シンボリックリンクした後にsendmailをrpmで削除すると
せっかくのシンボリックリンクが削除されてしまいます。
#また張りなおせばいいだけの話ですが・・・


---------------------

これでqmailを起動する準備が整いましたので一度テストしてみましょう。
いちいち先ほどのrc.localに追加したのを手であげるのはめんどくさいので
荒っぽいかもしれないけど
[root@home5 alias]# /etc/rc.local
[root@home5 alias]# ps -ef |grep qmail|grep -v grep
qmaild 6505 1 0 22:27 pts/3 00:00:00 /usr/local/bin/tcpserver -x /etc
root 6506 1 0 22:27 pts/3 00:00:00 /var/qmail/bin/splogger smtpd 3
root 6508 1 0 22:27 pts/3 00:00:00 /var/qmail/bin/splogger pop3d 3
root 6509 1 0 22:27 pts/3 00:00:00 /bin/csh -cf /var/qmail/rc
qmails 6510 6509 0 22:27 pts/3 00:00:00 qmail-send
qmaill 6511 6510 0 22:27 pts/3 00:00:00 splogger qmail
root 6512 6510 0 22:27 pts/3 00:00:00 qmail-lspawn ./Maildir/
qmailr 6513 6510 0 22:27 pts/3 00:00:00 qmail-rspawn
qmailq 6514 6510 0

[root@home5 alias]# mail nitta
Subject: test
test
.
Cc:
[root@home5 alias]# tail -10 /var/log/maillog
Jun 12 22:27:41 home5 qmail: 992352461.245581 status: local 0/10 remote 0/20
Jun 12 22:29:17 home5 qmail: 992352557.175255 new msg 124546
Jun 12 22:29:17 home5 qmail: 992352557.175736 info msg 124546: bytes 234 from <n
itta@home5.jinjin.com> qp 6523 uid 0
Jun 12 22:29:17 home5 qmail: 992352557.181426 starting delivery 1: msg 124546 to
local nitta@home5.jinjin.com
Jun 12 22:29:17 home5 qmail: 992352557.181552 status: local 1/10 remote 0/20
Jun 12 22:29:17 home5 qmail: 992352557.195503 delivery 1: success: did_1+0+0/
Jun 12 22:29:17 home5 qmail: 992352557.195620 status: local 0/10 remote 0/20
Jun 12 22:29:17 home5 qmail: 992352557.195661 end msg 124546

[root@home5 alias]# ls -l /home/nitta/Maildir/new/
合計 4
-rw------- 1 nitta nitta 309 6月 12 22:29 992352557.6526.home5
[root@home5 alias]#

[root@home5 qmail]# telnet localhost 110
Trying 127.0.0.1...
Connected to home5.
Escape character is '^]'.
+OK <6645.992354470@home5.jinjin.com>
user nitta
+OK
pass killdjb55
+OK
list
+OK
1 309
.
RETR 1
+OK

Return-Path: <nitta@home5.jinjin.com>
Delivered-To: nitta@home5.jinjin.com
Received: (qmail 6523 invoked by uid 0); 12 Jun 2001 22:29:17 +0900
Date: 12 Jun 2001 22:29:17 +0900
Message-ID: <20010612132917.6522.qmail@home5.jinjin.com>
From: nitta@home5.jinjin.com
To: nitta@home5.jinjin.com
Subject: test

test

.

quit
+OK
Connection closed by foreign host.

本当は内内・内外・外内のテストをちゃんとすべきです。
そのときのログも全部確認するべきです。
でもこれはただのメモだけなので実際にはやってみましたが、メモには書いてません。

どうやら成功みたいですね。


sendmail使いの人には一番最初はなぜかqmailは凄くとっつきにくい感じがする。
本当はよっぽどqmailの方が管理もしやすいし、インストールも簡単なのに・・・


qmailのインストールは終わりですけど
qmailの管理ツールであるqmailanalogってやつも
インストールしたいので、参照したい場合はqmailanalogインストールの項を
参照してください。

・qmailの必要なdデフォルトファイルの一覧
::::::::::::::
/var/qmail/rc

#!/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


::::::::::::::
/var/qmail/control/defaultdomain

jinjin.com


::::::::::::::
/var/qmail/control/locals

home5.jinjin.com


::::::::::::::
/var/qmail/control/me

home5.jinjin.com


::::::::::::::
/var/qmail/control/plusdomain

jinjin.com


::::::::::::::
/var/qmail/control/rcpthosts

home5.jinjin.com



::::::::::::::
/etc/tcp.smtp

192.168.128.:allow,RELAYCLIENT=""
127.:allow,RELAYCLIENT=""


::::::::::::::
/etc/rc.local

#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
####DMA有効#######
/sbin/hdparm -d 1 /dev/hda
/sbin/hdparm -d 1 /dev/hdd
/sbin/hdparm -d 1 /dev/hdc
##################

if [ -f /etc/redhat-release ]; then
R=$(cat /etc/redhat-release)

arch=$(uname -m)
a="a"
case "_$arch" in
_a*) a="an";;
_i*) a="an";;
esac

NUMPROC=`egrep -c "^cpu[0-9]+" /proc/stat`
if [ "$NUMPROC" -gt "1" ]; then
SMP="$NUMPROC-processor "
if [ "$NUMPROC" = "8" -o "$NUMPROC" = "11" ]; then
a="an"
else
a="a"
fi
fi

# This will overwrite /etc/issue at every boot. So, make any changes you
# want to make to /etc/issue here or you will lose them when you reboot.
echo "" > /etc/issue
echo "$R" >> /etc/issue
echo "Kernel $(uname -r) on $a $SMP$(uname -m)" >> /etc/issue

cp -f /etc/issue /etc/issue.net
echo >> /etc/issue
fi
touch /var/lock/subsys/local

#qmail-smtpd起動
/usr/local/bin/tcpserver -x /etc/tcp.smtp.cdb -v -u 501 -g 501 0 smtp /var/qmail
/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 &
echo "qmail-smtpd start!"
#qmail-pop3d起動
/usr/local/bin/tcpserver -x /etc/tcp.pop3.cdb -v 0 pop3 /var/qmail/bin/qmail-pop
up home5.jinjin.com /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir 2>&1 |
/var/qmail/bin/splogger pop3d 3 &
echo "qmail-pop3d start!"
#qmail boot-up
if [ -f /var/qmail/rc ]
then
/bin/csh -cf /var/qmail/rc &
fi
echo "qmail is boot-up!"

rc.localから起動するのがポリシーに合わない場合は
白文字の部分の内容を/etc/rc.d/init.d/qmailに記述して
# ln -s /etc/rc.d/init.d/qmail /etc/rc3.d/S80qmail
# ln -s /etc/rc.d/init.d/qmail /etc/rc5.d/S80qmail
# chmod 755 /etc/rc.d/init.d/qmail
# chmod 755 /etc/rc3.d/S80qmail
# chmod 755 /etc/rc5.d/S80qmail
なんてしてもよいかもしれません。

【セキュリティホールへの対処】
セキュリティホールがないということでしたが
ひとつだけ対処しておかなくてはならものがあります。
コンパイルなどは必要ありません。
ただ以下のようにするだけです。

[root@home5 qmail]# cd /var/qmail/bin
[root@home5 qmail]# mv qmail-smtpd qmail-smtpd2
[root@home5 qmail]# vi qmail-smtpd
#/bin/sh
ulimit -d 1024
exec /var/qmail/bin/qmail-smtpd2 ${1+"$@"}
[root@home5 qmail]# chown root qmail-smtpd
[root@home5 qmail]# chgrp qmail qmail-smtpd
[root@home5 qmail]# chmod 755 qmail-smtpd

後はqmailをもう一度起動しなおして起きましょう。
止めれないサイトではどうしてよいかわかりませんが・・・

pop before smtpとかsmtp authなんかやりたい場合は
さらに他ツールを入れる必要があります。
apopやimapを使うときも他にインストールする必要があります.

本サイトではそこまで触れません。qmailのインストールができる管理者なら後は余裕でできるでしょ。