1月 03 2008

Mailサーバをqmailに変更

投稿者 Lonely-Wolf at 14:04:33 カテゴリー サーバ構築備忘録

厄介なSendmail。
なにが厄介って、複雑極まりない仕様で設定ファイルは呪文みたいだし、セキュリティは脆弱だしでメンテが大変。
ってことで、ラクチン設定&高セキュリティなqmailサーバを構築。

まずは、準備とインストール

qmailのダウンロード
qmail-1.03.tar.gzファイルを以下のURLからダウンロードします。
http://www.qmail.jp/qmail.html

qmail運用ディレクトリの作成
qmailがインストールされるディレクトリを作成します。

# mkdir /var/qmail

qmail用アカウントの作成
qmailでは複数の一意のユーザ名とグループ名を使用してメールシステムのセキュリティを制御します。
qmailはセキュリティを考慮しrootでの配送作業を行いません。その為、rootに代わるqmail用のグループとユーザを作成しなければいけません。

# 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
# groupadd qmail
# useradd -g qmail -d /var/qmail qmailq
# useradd -g qmail -d /var/qmail qmailr
# useradd -g qmail -d /var/qmail qmails

qmailグループの設定確認
/etc/groupに

nofiles::GID1:
qmail::GID2:

が追加されてることを確認します。

qmailユーザ群の設定確認
/etc/passwdに

alias:x:UID1:GID1::/var/qmail/alias:/bin/sh
qmaild:x:UID2:GID1::/var/qmail:
/bin/sh
qmaill:x:UID3:GID1::/var/qmail:
/bin/sh
qmailp:x:UID4:GID1::/var/qmail:
/bin/sh
qmailq:x:UID5:GID2::/var/qmail:
/bin/sh
qmailr:x:UID6:GID2::/var/qmail:
/bin/sh
qmails:x:UID7:GID2::/var/qmail:
/bin/sh

qmail用のユーザでログインできないように
シェルを/bin/shから/etc/noshellに変更

alias:x:UID1:GID1::/var/qmail/alias:/etc/noshell
qmaild:x:UID2:GID1::/var/qmail:
/etc/noshell
qmaill:x:UID3:GID1::/var/qmail:
/etc/noshell
qmailp:x:UID4:GID1::/var/qmail:
/etc/noshell
qmailq:x:UID5:GID2::/var/qmail:
/etc/noshell
qmailr:x:UID6:GID2::/var/qmail:
/etc/noshell
qmails:x:UID7:GID2::/var/qmail:
/etc/noshell

が追加されていることを確認します。

コンパイルとインストール
ダウンロードしたファイルqmail-1.03.tar.gzを解凍します。

# gzip -d qmail-1.03.tar.gz
# tar -xf qmail-1.03.tar

コマンドライン1行で実行するには
# gunzip -c qmail-1.03.tar.gz | tar xvf -

GUNtarがインストールされていれば
# gtar zxvf qmail-1.03.tar.gz

ファイルのあったディレクトリに“qmail-1.03”というディレクトリができます。 
qmail-1.03ディレクトリに移動し、コンパイルします。

# cd qmail-1.03
# make setup check

これでコンパイルされ、/var/qmailに必要なファイルがインストールされます。

コントロールファイルの作成
qmailの動作設定ファイルを作成します。
ホスト名をDNSで検索できない場合

# ./config-fast FQDN

FQDN(Fully Qualified Domain Name)…マシンの名前をドメインで修飾した形式
ドメイン名がtest.com、ホスト名がintelの場合、FQDNはintel.test.comとなります

ホスト名をDNSで検索できる場合

# ./config

configファイルは、qmailサーバのホスト名をDNS検索し、検索に成功すると、適切なホスト名情報を使用してファイルを作成します。
これにより、/var/qmail/controlディレクトリ内に下記のファイルができます。

# ls /var/qmail/control
defaultdomain locals me plusdomain rcpthosts

qmailの設定
コントロールファイルの設定
/var/qmail/controlディレクトリ内のファイルの説明です。
ファイルの内容は、ドメイン名がtest.com、ホスト名がintelの場合の記述例です。


ファイル名 ファイルの内容 説明
defaultdomain test.com メール送信時にあて先もしくは送信者のドメイン部にドットがない場合、自動的に後ろに付加するドメイン名を指定します。
locals localhost
intel.test.com
test.com
intel
ローカル配送として処理すべきドメインを1行に1つずつ指定します。
空ファイルまたは省略されるとmeファイルを使うが、どちらもなければ、 qmail-sendは起動されません。

user@domainというアドレスはdomainがlocals にあるときローカルだと判定されます。
me intel.test.com メールサーバ自身のホスト名をFQDNで指定します。
meファイルがなければqmailは起動されません。
plusdomain test.com ドメイン部が+で終わっている場合に付加されるドメインです。ホスト名がドットを含まず、最後がプラスのときは
defaultdomainではなくplusdomainを追加します。
rcpthosts localhost
intel.test.com
test.com
.test.com
ネットワーク経由できたメールのうち、受理すべきドメインを1行に1つずつ指定します。
rcpthostsを設定しないとあらゆるメッセージを受け取ってしまうので、受け取りを許可するホスト名やドメインをファイルに記述します。
以下のファイルは必要に応じて作成して下さい。
defaulthost test.com ホスト部のないアドレスにはこの名前を追加します。
smtproutes test.com SMTPの経路を指定します。
badmailfrom xxx@xxx.xx.xx
@xxx.xx.xx
アドレス指定受信拒否、ドメイン指定受信拒否を行う場合に設定するファイルです。
@hostという書式で記述された場合、hostというアドレス(ドメイン部)からのメールを拒否します。
ココに記述された以外の制御ファイルについてはこちらを参照して下さい。

エイリアスの設定
Postmaster、MAILER-DAEMON、root宛てのメールを受信する為にエイリアスを設定します。

qmail組み込みのエイリアスを使用せず、大きなエイリアスが扱い易い/etc/aliasesファイルを使用します。
qmail本体は/etc/aliasesをサポートできないので、fastforwardパッケージを導入します。
fastforwardを導入することにより/etc/aliasesをqmailで使用することが可能になります。

fastforwardパッケージのインストール
fastforward-0.51.tar.gzファイルをダウンロードします。
ダウンロードしたファイルを解凍します。

# gzip -d fastforward-0.51.tar.gz
# tar -xf fastforward-0.51.tar

コマンドライン1行で実行するには
# gunzip -c fastforward-0.51.tar.gz | tar xvf -

GUNtarがインストールされていれば
# gtar zxvf fastforward-0.51.tar.gz

ファイルのあったディレクトリに“fastforward-0.51”というディレクトリができます。 ディレクトリに移動し、コンパイルします。

# cd fastforward-0.51
# make setup check

これでコンパイルされ、/var/qmail/binにfastforwardと/etc/aliasesからqmail用のaliases.cdbを作成するnewaliasesがインストールされます。

qmailへの設定
/var/qmail/aliasディレクトリに.qmail-defaultファイルを作成し、qmailがfastforwardを使用して/etc/aliases.cdbを利用できるように設定します。

# cd /var/qmail/alias
# echo "| fastforward -d /etc/aliases.cdb" > .qmail-default

# more .qmail-default
| fastforward -d /etc/aliases.cdb

/etc/aliasesの設定
/etc/aliasesには、Postmaster、MAILER-DAEMONのエイリアスが記述されています。必要に応じて変更します。

# more /etc/aliases
——————–省略——————–
Postmaster: admin@test.com
——————–省略——————–
# should be routed to our local Postmaster.
MAILER-DAEMON: postmaster
——————–省略——————–
#######################
# Local aliases below #
#######################
root: admin@test.com

この例では、Postmaster、MAILER-DAEMON、root宛のメールはadmin@test.comへ配信されます。

/etc/aliasesの更新後、qmail用の/etc/aliases.cdbを作成します。
この作業は/etc/aliasesを更新した時に必ず行います。

# /var/qmail/bin/newaliases

maildir形式への配送設定
多くのUNIXに標準で導入されているSendmailは、受信したメールをmbox形式で保存します。mbox形式とは、1つのmboxファイルに複数のメールを格納する形式です。
このmbox形式は、メールの受信中にシステムがクラッシュしてしまうと、mboxファイルが破壊される可能性がある為、信頼性に欠けています。

maildir形式は、mbox形式のように1ファイルに複数のメールを格納することはしません。専用のディレクトリを作り、その中に1メール1ファイルという形で保管します。
このmaildir形式は、メッセージを受け取っている間のシステムのクラッシュに耐えることが可能です。

既存ユーザへの設定
ホームディレクトリにMailディレクトリがないとメールを受け取る事ができないので作成します。

# /var/qmail/bin/maildirmake $HOME/Mail

Mailディレクトリを作成することで、配下にtmp、new、curというディレクトリが作成されます。メールを受信するとnewディレクトリに保管されます。

作成したMailディレクトリを使用する為に、ホームディレクトリに.qmailというqmail環境設定ファイルを作成し、そのファイルに./Mail/と記述します。

# echo "./Mail/" > $HOME/.qmail

$HOMEはユーザのホームディレクトリを指します。

※rootで作業した場合、Mailディレクトリと.qmailファイルの所有者、グループ名を変更する必要があります。所有者をユーザID、グループ名をユーザが属するグループに変更します。

新規ユーザの追加
新しいユーザを追加した場合にもMailディレクトリとqmail環境設定ファイルを作成しなければいけません。
ユーザの追加とこの作業を自動的に行えるようシェルスクリプトを作成します。

シェルスクリプトの流れ
1.useraddコマンドでユーザを追加
2.ユーザのパスワード設定
3.maildirmakeコマンドでMailディレクトリを作成
4.Mailディレクトリの所有者とグループ名を変更
5.qmail環境設定ファイルの作成
6.qmail環境設定ファイルの所有者、グループ、アクセス権を変更

# vi /var/qmail/bin/qmail-useradd
#!/usr/bin/sh
#
username=$1
groupname=$2
/usr/sbin/useradd -g $groupname -d /export/home/$username -m $username
/usr/bin/passwd $username
/var/qmail/bin/maildirmake /export/home/$username/Mail
/usr/bin/chown -R $username:$groupname /export/home/$username/Mail
echo "./Mail/" >> /export/home/$username/.qmail
/usr/bin/chown $username:$groupname /export/home/$username/.qmail
/usr/bin/chmod 600 /export/home/$username/.qmail

シェルスクリプトの使用法
1.qmail-useraddファイルに実行権を追加します。
2.qmail-useraddにユーザIDとグループ名の引数を指定、実行します。

# chmod 700 /var/qmail/bin/qmail-useradd
# /var/qmail/bin/qmail-useradd ユーザID グループ名

adminユーザをsysadminグループとして、追加する場合

# /var/qmail/bin/qmail-useradd admin sysadmin

qmail起動スクリプトの設定
qmail起動スクリプトの雛型が、/var/qmail/bootディレクトリに置いてあります。
homeファイルをrcファイルにコピーして編集し、起動スクリプトを作成します。

# cp /var/qmail/boot/home /var/qmail/rc

コピーしたrcファイルを編集します。
qmail-start ./Mailbox splogger qmail の行の./Mailbox./Mail/に変更します。

# vi /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
./Mail/ splogger qmail

qmailの配送テスト
qmailの手動起動
作成したqmail起動スクリプトを使用し、qmailを起動します。

# csh -cf ‘/var/qmail/rc &’

qmailのプロセスが起動しているか確認します。qmailの5つのプロセスが起動されているか確認します。

# ps -ef | grep qmail
qmails 457 424 2 05:11:00 pts/5 0:00
qmail-send
qmaill 458 457 1 05:11:00 pts/5 0:00
splogger qmail
root 459 457 0 05:11:00 pts/5 0:00
qmail-lspawn ./Mail/
qmailr 460 457 1 05:11:00 pts/5 0:00
qmail-rspawn
qmailq 461 457 0 05:11:00 pts/5 0:00
qmail-clean

syslogでの確認も行います。

# tail /var/log/syslog
——————省略——————
—-省略—-
qmail: status:local 0/10 remote 0/20

メールの配送テスト
動作確認のためにqmail-injectを使用してメール配送の確認を行います。

# echo to: admin | /var/qmail/bin/qmail-inject
# echo to: admin@test.com | /var/qmail/bin/qmail-inject

adminユーザのMailディレクトリに空メールが届けられます。
同時に/var/log/syslogに送信ログが記述されます。

;

# tail /var/log/syslog
qmail: new msg 118349
qmail: info msg 118349: bytes 227 from <root@test.com> qp 12166 uid
0
qmail: starting delivery 16: msg 118349 to local admin@test.com
qmail: status: local 1/10 remote 0/20
qmail: delivery 16: success: did_1+0+1/
qmail: status: local 0/10 remote 0/20
qmail: end msg 118349

この他にリモートのユーザ、存在しないユーザを宛先として配送テストを行い、動作確認を行います。

Sendmailからqmailへの移行
Sendmailの無効化
Sendmailプログラムのバイナリファイルを待避し、モードの変更を行います。setuidを無効にし、ユーザがSendmailプログラムを使用できないようにします。

# mv /usr/lib/sendmail /usr/lib/sendmail.bak
# chmod 0 /usr/lib/sendmail.bak

Sendmailを利用するプログラム(例えばcronなど)がメールの機能を使えるように設定します。qmailには、Sendmail互換の形で要求を受け、それをqmailへの要求として受け付けるSendmailラッパーが付属されています。このSendmailラッパーにシンボリックリンクを張ります。

# ln -s /var/qmail/bin/sendmail /usr/lib/sendmail

.forwardをqmailで使用する
Sendmailで使用されていた.forwardをそのまま利用できるようにdot-forward互換ツールをインストールします。

dot-forward互換ツールのインストール
dot-forward-0.71.tar.gzファイルをダウンロードします。
ダウンロードしたファイルを解凍します。

# gzip -d dot-forward-0.71.tar.gz
# tar -xf dot-forward-0.71.tar

コマンドライン1行で実行するには
# gunzip -c dot-forward-0.71.tar.gz | tar xvf -

GUNtarがインストールされていれば
# gtar zxvf dot-forward-0.71.tar.gz

ファイルのあったディレクトリに“dot-forward-0.71”というディレクトリができます。 ディレクトリに移動し、コンパイルします。

# cd dot-forward-0.71
# make setup check

これでコンパイルされ、/var/qmail/binにdot-forwardと/var/qmail/bootに設定ファイルの雛型がインストールされます。

dot-forwardプログラムの利用
dot-forwardプログラムで.forwardファイルが使用できるようにqmail起動スクリプトを変更します。

# cp /var/qmail/boot/home+df /var/qmail/rc

コピーしたrcファイルを編集します。
./Mailbox‘ splogger qmail の行の./Mailbox./Mail/に変更します。

# vi /var/qmail/rc
#!/bin/sh

# Using splogger to send the log through syslog.
# Using dot-forward to support sendmail-style ~/.forward files.
# Using qmail-local to deliver messages to ~/Mailbox by default.

exec env – PATH="/var/qmail/bin:$PATH" \
qmail-start ‘|dot-forward .forward
./Mail/‘ splogger qmail

tcpserverの導入
ネットワークからの要求を待ち受けているデーモンプロセスinetdでqmailプロセスを起動する方法が一般的ですが、inetdに負荷をかけない為にtcpserverを導入します。

ucspi-tcpパッケージのインストール
tcpserverはucspi-tcpパッケージに含まれています。ucspi-tcp-0.88.tar.gzファイルをダウンロードします。
ダウンロードしたファイルを解凍します。

# gzip -d ucspi-tcp-0.88.tar.gz
# tar -xf ucspi-tcp-0.88.tar

コマンドライン1行で実行するには
# gunzip -c ucspi-tcp-0.88.tar.gz | tar xvf -

GUNtarがインストールされていれば
# gtar zxvf ucspi-tcp-0.88.tar.gz

ファイルのあったディレクトリに“ucspi-tcp-0.88”というディレクトリができます。 ディレクトリに移動し、コンパイルします。

# cd ucspi-tcp-0.88
# make
# make setup check

これでコンパイルされ、/usr/local/binにtcpserverがインストールされます。

qmail-smtpdの起動設定
qmail-smtpd自体にはSMTP接続を受け付ける機能はないので、tcpserverを経由してSMTP接続を受け付けるように設定します。

# vi /var/qmail/rc
#!/bin/sh

# Using splogger to send the log through syslog.
# Using dot-forward to support sendmail-style ~/.forward files.
# Using qmail-local to deliver messages to ~/Mailbox by default.

exec env – PATH="/var/qmail/bin:/usr/local/bin:$PATH" \
qmail-start ‘|dot-forward .forward
./Mail/’ splogger qmail

tcpserver -c 10000 -v -u UID2 -g GID1 0 smtp qmail-smtpd \
2>&1 | splogger smtpd 3 &

tcpserverがインストールされたディレクトリ/usr/local/binをPATHに追加、tcpserverの実行コマンドを追記します。
UID2はqmaildのUIDを、GID1はnofilesのGIDを設定します。
tcpserverは同時に40までのqmail-smtpdを扱えます。この設定では、tcpserver -c 10000とし、制限を10000に設定しています。

qmail-pop3dの利用
maildir形式によるqmailは、mboxを前提としたpop接続を受け付けることができません。maildir形式に対応したqmail-pop3dを使用します。
また、qmail-pop3dではパスワード認証ができませんので、パスワード認証モジュールcheckpasswordをインストールします。

checkpasswordのインストール
checkpassword-0.90.tar.gzファイルをダウンロードします。
ダウンロードしたファイルを解凍します。

# gzip -d checkpassword-0.90.tar.gz
# tar -xf checkpassword-0.90.tar

コマンドライン1行で実行するには
# gunzip -c checkpassword-0.90.tar.gz | tar xvf -

GUNtarがインストールされていれば
# gtar zxvf checkpassword-0.90.tar.gz

ファイルのあったディレクトリに“checkpassword-0.90”というディレクトリができます。 ディレクトリに移動し、コンパイルします。

# cd checkpassword-0.90
# make
# make setup check

これでコンパイルされ、/binにcheckpasswordがインストールされます。

qmail-pop3dの起動設定
qmail-pop3dにはpop接続要求を受け付ける機能はないので、tcpserverを経由してpop接続を受け付けるように設定します。

# vi /var/qmail/rc
#!/bin/sh

# Using splogger to send the log through syslog.
# Using dot-forward to support sendmail-style ~/.forward files.
# Using qmail-local to deliver messages to ~/Mailbox by default.

exec env – PATH="/var/qmail/bin:/usr/local/bin:$PATH" \
qmail-start ‘|dot-forward .forward
./Mail/’ splogger qmail

tcpserver -c 10000 -v -u UID2 -g GID1 0 smtp qmail-smtpd \
2>&1 | splogger smtpd 3 &

tcpserver -vHR 0 pop3 qmail-popup intel.test.com \
checkpassword qmail-pop3d Mail 2>&1 \
| splogger pop3d &

tcpserverの実行コマンドを追記します。intel.test.comはFQDNを設定して下さい。

クライアントからqmailサーバを利用する
smtpを受け付けるクライアント(ネットワーク)を設定します。
受付を許可するホストのアクセス制御情報を記述したデータベースファイルを準備し、tcpserverに認識させます。
受付を許可するホストのアクセスリストを作成します。

# vi /var/qmail/control/tcp.smtp
10.1.1.:allow,RELAYCLIENT=""
127.:allow,RELAYCLIENT=""

ここでは、IPアドレスが 10.1.1.*と127.* であるホストからの接続許可を意味しています。

作成したアクセスリストを使用してデータベースファイルを作成します。

# cd /var/qmail/control
# /usr/local/bin/tcprules ./tcp.smtp.cdb ./tcp.smtp.tmp < ./tcp.smtp

データベースファイルをtcpserverに認識させます。

# vi /var/qmail/rc
#!/bin/sh

# Using splogger to send the log through syslog.
# Using dot-forward to support sendmail-style ~/.forward files.
# Using qmail-local to deliver messages to ~/Mailbox by default.

exec env – PATH="/var/qmail/bin:/usr/local/bin:$PATH" \
qmail-start ‘|dot-forward .forward
./Mail/’ splogger qmail

tcpserver -c 10000 -x /var/qmail/control/tcp.smtp.cdb \
-v -u UID2 -g GID1 0 smtp qmail-smtpd \
2>&1 | splogger smtpd 3 &

tcpserver -vHR 0 pop3 qmail-popup intel.test.com \
checkpassword qmail-pop3d Mail 2>&1 \
| splogger pop3d &

qmailの自動起動
システムの起動と同時にqmailが起動するように起動スクリプトを作成、設定します。
起動スクリプト/etc/init.d/qmailを作成します。作成後ファイルに実行権を設定します。

# vi /etc/init.d/qmail

#!/bin/sh

case "$1" in
‘start’)
     csh -cf ‘/var/qmail/rc &’
     ;;

‘stop’)
     pkill qmail
     pkill -9 tcpserver
     ;;

‘restart’)
     pkill qmail
     pkill -9 tcpserver
     csh -cf ‘/var/qmail/rc &’
     ;;

*)
     echo "Usage: $0 { start | stop | restart }"
     exit 1
     ;;
esac
exit 0

# chmod 744 /etc/init.d/qmail

作成した起動スクリプトを利用して、システム起動と同時にqmailが起動するように設定します。また、ランレベル変更時にqmailが停止するように設定します。

# ln /etc/init.d/qmail /etc/rc2.d/S88qmail
# ln /etc/init.d/qmail /etc/rc0.d/K36qmail
# ln /etc/init.d/qmail /etc/rc1.d/K36qmail
# ln /etc/init.d/qmail /etc/rcS.d/K36qmail

起動時(ランレベル3)に、/etc/rc2.d/S88qmailに引数startを付けてqmailを起動します。

qmailの再起動
作成した/etc/init.d/qmail、/var/qmail/rcの2つのファイルを使用して、qmailを再起動します。

# /etc/init.d/qmail restart

# ps -ef | grep qmail
qmail-lspawn |dot-forward .forward./Mail/
qmail-rspawn
splogger qmail
qmail-send
qmail-clean
tcpserver -vHR 0 pop3 qmail-popup intel.test.com checkpassword qmail
tcpserver -c 10000 -x /var/qmail/control/tcp.smtp.cdb -v -u 102 -g 100
0 smtp

qmailの送受信テスト
telnetでsmtpに接続し、メールの送受信テストを行います。

# telnet localhost 25
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
220 intel.test.com ESMTP
helo dude
250 intel.test.com
mail <admin@test.com>
250 ok
rcpt <admin@test.com>
250 ok
data
354 go ahead
Subject: test
This is a test.
.

250 ok 1112158996 qp 17366
quit
221 intel.test.com
Connection closed by foreign host.

$HOME/Mail/newにメールが届いているかチェックします。

1つのコメントがあります

One Response to “Mailサーバをqmailに変更”

  1. 元外科医 より:

    :cool:
    自宅にSolaris10でサーバを構築しましたが、sendmailがわからず、windowsマシンにメールサーバだけ入れていました(^^;)
    このページ見てqmailをいれてみましたところうまくいきました。少々手直ししただけです。(PATHやアドレスなど) pop before SMTPは使っていないので
    外からのメール配送には少々使いにくいのですが、サーバーとしてはwebとBlogとメールがあればいいのでとりあえずできあがりました。実践的な記事をありがとうございます。

Leave a Reply