はてなブックマークに追加する Twitterに投稿する Facebookで共有する Googleブックマークに追加する Evernoteクリップに追加する Share Yahoo!ブックマークに追加する livedoorクリップに追加する

Cyberam Documents Project

qmailとは
MTA(メール転送エージェント)にはsendmail、qmail、postfixなどがあります。もっともシェアがあるのはsendmailですが、
sendmailにはいくつものセキュリティーの脆弱性が発見されバージョンアップされています。その反面、
qmailは最新バージョンである1.03を維持し続けています。これはqmailがそれぞれの機能で、デーモンが分かれておりほとんどが個別の一般ユーザ
権限で動作しているためである。SUIDプログラムも一つのみである。ここからも高いセキュリティーが見て取れます。
またqmailは高速なメール配送が実現できます。
qmailのインストール
まず最初にsendmailが自動起動されていないか確認し、されている場合は停止します。
#/etc/rc.d/init.d/sendmail stop
#chkconfig --level 123456 sendmail off
chkconfigが使用できない場合は、起動ランレベルのディレクトリ内のファイル名を直接変更することで停止させます。
#cd /etc/rc.d/rc4.d
#mv S80sendmail _S80sendmail
次に専用のディレクトリおよびユーザ、グループを作成します。
#mkdir /var/qmail
#groupadd nofiles
#groupadd qmail
#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
#useradd -g nofiles -d /var/qmail/alias -s /bin/false alias
#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
これらのユーザでログインする必要はないので"-s /bin/false"を指定します。


qmailのインストール
次にqmailおよび各種パッチをダウンロードし、解凍します。(パッチは必ず必要ではありません。)
qmail-1.03.tar.gz
qmail-date-localtime.patch時刻の表示をローカルタイム(JST) にする。
qmail-103.patch512バイト以上のDNS応答パケットに対応する。
qmail-smtpd-relay-rejectMailアドレスのユーザ名部分に"@"、"!"、"%"が含まれているメールを拒否する。
qmail-0.0.0.0.patchIPアドレス0.0.0.0をローカルアドレスとする。
qmailqueue-patchqmail-scanner導入時に必要である。
#tar xvfz qmail-1.03.tar.gz
#cd qmail-1.03
#patch -s -p1 <../qmail-date-localtime.patch
#patch -s -p1 <../qmail-103.patch
#patch -s -p1 <../qmail-smtpd-relay-reject
#patch -s -p1 <../qmail-0.0.0.0.patch
また、glibcのバージョンが2.3.1以降の場合は次のパッチもあてます。
qmail-1.03.errno.patch  qmail-1.03.qmail_local.patch
#patch -s -p1 <../qmail-1.03.errno.patch
#patch -s -p1 <../qmail-1.03.qmail_local.patch
インストールします。
#make
#make setup check

tcpserverのインストール
qmailの起動にtcpserverを通すことで、IPアドレスやドメイン名によるアクセス制限等の機能を追加できる。
tcpserverをダウンロードし、解凍します。
ucspi-tcp-0.88.tar.gz
#tar xvfz ucspi-tcp-0.88.tar.gz
#cd ucspi-tcp-0.88
また、glibcのバージョンが2.3.1以降の場合は次のパッチもあてます。
ucspi-tcp-0.88.errno.patch  ucspi-tcp-0.88.a_record.patch  ucspi-tcp-0.88.nobase.patch
#patch -s -p1 <../ucspi-tcp-0.88.errno.patch
#patch -s -p1 <../ucspi-tcp-0.88.a_record.patch
#patch -s -p1 <../ucspi-tcp-0.88.nobase.patch
インストールします。
#make
#make setup check

次に./config-fastを実行します。(自ドメイン名を指定します。)
#cd qmail-1.03
#./config-fast cyberam.dip.jp
SMTPサーバの構築
以下の5つのファイルが存在するか確認します。

ファイル名説明
defaultdomain ヘッダなどにドメイン名が省略された場合に補完されるドメイン名を指定する
locals ローカル扱いされるドメイン名を指定する
me 自ドメイン名(FQDN)を指定する
plusdomain ドメイン部の末尾が+の場合に補完されるドメイン名を指定する
rcpthosts メールの転送を許可するドメイン名を指定する

管理者アカウント(MAILER-DAEMON、postmaster、root)のメールアドレスにエイリアスを付けて、 実際に管理しているアカウントにこれら管理者アカウント宛のメールが届くように設定します。
#cd /var/qmail/alias
#echo '&webmaster@cyberam.dip.jp' >  .qmail-mailer-daemon
#echo '&webmaster@cyberam.dip.jp' >  .qmail-postmaster
#echo '&webmaster@cyberam.dip.jp' >  .qmail-root
#chmod 644 .qmail-*
以上でMAILER-DAEMON、postmaster、root宛(root@cyberam.dip.jp等)のメールはwebmaster@cyberam.dip.jp に送られます。

次にメールボックスをmbox形式からmaildir形式に変更します。
まず、既存ユーザをmaildir形式に対応させるには
#/var/qmail/bin/maildirmake /home/ユーザ名/Maildir
#echo './Maildir/' > /home/ユーザ名/.qmail
を実行します。
また、新規にユーザを作成したときに自動でmaildir形式に対応するように
#/var/qmail/bin/maildirmake /etc/skel/Maildir
#echo './Maildir/' > /etc/skel/.qmail
を実行します。これでユーザ作成時にそのユーザのホームディレクトリにMaildirディレクトリ が作成されます。
最後にqmail起動スクリプトをコピーし、編集します。
#cp /var/qmail/boot/home /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
次にtcpserverを使用してqmailを起動する設定をします。
tcpserverを使用するとIPアドレスやホスト名によるアクセス制限を行うことができセキュリティが向上します。

最初にアクセス制御ファイル(cdb)を生成するためのアクセス制御情報が記述されたファイルを作成します。
ここではIPアドレスが192.168.0.1から192.168.0.10までの範囲にあるものを許可する設定とします。
#vi /etc/tcpserver
192.168.0.1-10:allow,RELAYCLIENT=""
127.:allow,RELAYCLIENT=""
そしてアクセス制御ファイルを生成します。
# /usr/local/bin/tcprules /etc/tcpserver.cdb /etc/tcpserver.tmp < /etc/tcpserver
最後に自動起動できるようにqmailの起動スクリプトを作成します。(ファイル名はqmail)
#vi /etc/rc.d/init.d/qmail
#!/bin/sh
PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin
[ -f /var/qmail/rc ] || exit 0
case "$1" in
  start)
        echo 'Starting qmail: '
        csh -cf '/var/qmail/rc &'
        #SMTP
        tcpserver -v -u qmaild -g nofiles -x /etc/tcpserver.cdb \
        0 smtp /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 &
        echo
        touch /var/lock/qmail
        ;;
  stop)
        echo "Stoping qmail: "
        PID=`/bin/ps -aefw | grep qmail | awk '{print $2}'`
        if [ ! -z "$PID" ] ;  then
            /bin/kill ${PID} 1> /dev/null 2>&1
        fi
        echo
        rm -f /var/lock/qmail
        ;;
  *)
        echo "Usage: S99qmail {start|stop}"
        exit 1
esac
exit 0
この起動スクリプトのパーミッションを変更します。
#chmod 755 /etc/rc.d/init.d/qmail
そして起動するランレベルにシンボリックリンクを張ります。
#cd /etc/rc.d/rc3.d/
#ln -s ../init.d/qmail ./S25qmail
そして起動確認をします。
#./S25qmail start
POPサーバの構築
qmailのPOPデーモンに認証機能を付けるにはcheckpasswordをインストールします。checkpassword は平文でパスワードをやり取りします。


checkpasswordのインストール
まずcheckpasswordをダウンロードし、解凍します。
checkpassword-0.90.tar.gz
#tar xvfz checkpassword-0.90.tar.gz
#cd checkpassword-0.90
また、glibcのバージョンが2.3.1以降の場合は次のパッチもあてます。
checkpassword-0.90.errno.patch
#patch -s -p1 <../checkpassword-0.90.errno.patch
インストールします。
#make
#make setup check

以上で完了です。後は先ほど作成したqmailの起動スクリプトに下線部を追加します。
#!/bin/sh
PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin
[ -f /var/qmail/rc ] || exit 0
case "$1" in
  start)
        echo 'Starting qmail: '
        csh -cf '/var/qmail/rc &'
        #SMTP
        tcpserver -v -u qmaild -g nofiles -x /etc/tcpserver.cdb \
        0 smtp /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 &
        #POP
        tcpserver -v 0 pop3 /var/qmail/bin/qmail-popup サーバのドメイン名 /bin/checkpassword \
        /var/qmail/bin/qmail-pop3d Maildir 2>&1 | /var/qmail/bin/splogger pop3d 3 &
        echo
        touch /var/lock/qmail
        ;;
  stop)
        echo "Stoping qmail: "
        PID=`/bin/ps -aefw | grep qmail | awk '{print $2}'`
        if [ ! -z "$PID" ] ;  then
            /bin/kill ${PID} 1> /dev/null 2>&1
        fi
        echo
        rm -f /var/lock/qmail
        ;;
  *)
        echo "Usage: S99qmail {start|stop}"
        exit 1
esac
exit 0
POP before SMTPによるSPAM対策
SPAM対策としてtcpserverの送信元ドメイン名やIPアドレスによるアクセス制御は効果的だが利便性では劣る面がいくつもある。 例えばIPアドレスがDHCPで動的に割り当てられるクライアントの制御は現実的に無理である。

POP before SMTPとはその名のとおりPOP(受信処理)で認証を行った後にSMTP(送信処理)を行うことであり、 POPでユーザを認証し、そのユーザのIPアドレスをサーバ側に一定時間保持することでそのIPアドレスからのメール送信を許可します。
一定時間過ぎれば保持していたIPアドレスを消去するので、またPOPで認証するまではメール送信できません。

しかしながらPOP before SMTPにも問題点はいくつかあります。

IPマスカレードなどのアドレス変換機能によりインターネットに接続しているLANのクライアントが認証されると そのLANのほかの認証されていないクライアントがメール送信できてしまう。(グローバルIPアドレスが同じであるため)

DHCPなどでIPアドレスが動的に割り振られている場合、POP認証された後にユーザが接続を切断し、そのユーザが使用していた IPアドレスが別のユーザに割り振られた場合も認証されていないクライアントがメール送信できてしまう。などなど。

まずqmailでPOP before SMTPを実現するにはrelay-ctrlとdaemontoolsをインストールします。


relay-ctrlのインストール
まずrelay-ctrlをダウンロードし、解凍します。
relay-ctrl-3.1.1.tar.gz
#tar xvfz relay-ctrl-3.1.1.tar.gz
インストールします。
#cd relay-ctrl-3.1.1
#make
#./installer

daemontoolsのインストール
まず/ディレクトリに作業ディレクトリを作成する必要があります。
#mkdir -p /package
そして作成したpackageディレクトリのパーミッションを変更します。(スティッキービットをセットします)
#chmod 1755 /package
次にdaemontoolsをダウンロードし、解凍します。
daemontools-0.76.tar.gz
#cd /package
#tar xvpfz daemontools-0.76.tar.gz
#cd admin/daemontools-0.76
また、glibcのバージョンが2.3.1以降の場合は次のパッチもあてます。
daemontools-0.76.errno.patch
#patch -s -p1 <./daemontools-0.76.errno.patch
インストールします。
#./package/install

インストールが完了したら次のことを確認してください。
1. /ディレクトリにcommand、serviceディレクトリが作成される。 commandディレクトリにはコマンドのシンボリックリンクが保存されている。
#ls -l /command
lrwxrwxrwx    1 root     root           41  7月 19 18:57 envdir -> /package/admin/daemontools/command/envdir
lrwxrwxrwx    1 root     root           44  7月 19 18:57 envuidgid -> /package/admin/daemontools/command/envuidgid
lrwxrwxrwx    1 root     root           41  7月 19 18:57 fghack -> /package/admin/daemontools/command/fghack
lrwxrwxrwx    1 root     root           43  7月 19 18:57 multilog -> /package/admin/daemontools/command/multilog
lrwxrwxrwx    1 root     root           43  7月 19 18:57 pgrphack -> /package/admin/daemontools/command/pgrphack
lrwxrwxrwx    1 root     root           48  7月 19 18:57 readproctitle -> /package/admin/daemontools/command/readproctitle
lrwxrwxrwx    1 root     root           42  7月 19 18:57 setlock -> /package/admin/daemontools/command/setlock
lrwxrwxrwx    1 root     root           44  7月 19 18:57 setuidgid -> /package/admin/daemontools/command/setuidgid
lrwxrwxrwx    1 root     root           44  7月 19 18:57 softlimit -> /package/admin/daemontools/command/softlimit
lrwxrwxrwx    1 root     root           44  7月 19 18:57 supervise -> /package/admin/daemontools/command/supervise
lrwxrwxrwx    1 root     root           38  7月 19 18:57 svc -> /package/admin/daemontools/command/svc
lrwxrwxrwx    1 root     root           39  7月 19 18:57 svok -> /package/admin/daemontools/command/svok
lrwxrwxrwx    1 root     root           41  7月 19 18:57 svscan -> /package/admin/daemontools/command/svscan
lrwxrwxrwx    1 root     root           45  7月 19 18:57 svscanboot -> /package/admin/daemontools/command/svscanboot
lrwxrwxrwx    1 root     root           41  7月 19 18:57 svstat -> /package/admin/daemontools/command/svstat
lrwxrwxrwx    1 root     root           41  7月 19 18:57 tai64n -> /package/admin/daemontools/command/tai64n
lrwxrwxrwx    1 root     root           46  7月 19 18:57 tai64nlocal -> /package/admin/daemontools/command/tai64nlocal
2. /etc/inittabの最終行に下線部の一行が追加される。
#cat /etc/inittab
----------------省略----------------
SV:123456:respawn:/command/svscanboot
次に各種ディレクトリを作成します。
#mkdir -p /var/spool/relay-ctrl/allow ←IPアドレスファイルを保存するディレクトリ
#mkdir /etc/relay-ctrl ←設定ファイルを保存するディレクトリ
#chmod 700 /var/spool/relay-ctrl
#chmod 777 /var/spool/relay-ctrl/allow
設定ファイルを作成します。
RELAY_CTRL_DIRはIPアドレスが記録されたファイルが保存されるディレクトリを指定し、 RELAY_CTRL_EXPIRYではIPアドレスが記録されたファイルの保持時間(秒)を指定します。
#cd /etc/relay-ctrl
#echo '/var/spool/relay-ctrl/allow' > RELAY_CTRL_DIR
#echo '120' > RELAY_CTRL_EXPIRY
そしてRELAY_CTRL_EXPIRYで指定した保持時間を超えている場合に、 RELAY_CTRL_DIRで指定したディレクトリ内のIPアドレスが記録されたファイルを削除するコマンドをcronに登録します。
#crontab -e
*/2 * * * * /usr/local/bin/envdir /etc/relay-ctrl /usr/local/bin/relay-ctrl-age
以上で完了です。起動スクリプトの引数startの処理を下記のように編集します。
#!/bin/sh
PATH=/var/qmail/bin:/usr/local/bin:/bin:/usr/bin
[ -f /var/qmail/rc ] || exit 0
case "$1" in
  start)
        echo "Starting qmail: "
        csh -cf '/var/qmail/rc &'
        #SMTP
        envdir /etc/relay-ctrl relay-ctrl-chdir \
        tcpserver -v -u qmaild -g nofiles 0 smtp \
        relay-ctrl-check /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 &
        #POP3
        envdir /etc/relay-ctrl relay-ctrl-chdir \
        tcpserver -v 0 pop3 /var/qmail/bin/qmail-popup サーバのドメイン名 /bin/checkpassword \
        relay-ctrl-allow /var/qmail/bin/qmail-pop3d Maildir 2>&1 | /var/qmail/bin/splogger pop3d 3 &
        echo
        touch /var/lock/qmail
        ;;
  stop)
        echo "Stoping qmail: "
        PID=`/bin/ps -aefw | grep qmail | awk '{print $2}'`
        if [ ! -z "$PID" ] ;  then
            /bin/kill ${PID} 1> /dev/null 2>&1
        fi
        echo
        rm -f /var/lock/qmail
        ;;
  *)
        echo "Usage: S99qmail {start|stop}"
        exit 1
esac
exit 0
はてなブックマークに追加する
Evernoteクリップに追加する
Share on Tumblr