sendmailのバージョンアップ
HOME BACK

最新はSendmail-8.14.4です

最新はSendmail-8.14.4です。
2009-12-30 Sendmail 8.14.4 is available

Sendmail-8.13.6へのバージョンアップ

久しぶりにsendmailのサイトを覗いたら、かなり深刻なセキュリテイーバグが発見され、最悪の場合、リモートからサーバーが乗っ取られるとのことである。
Sendmail-8.13.6へバージョンアップするか、最低でもセキュリティー・パッチを当てる必要がある。我が家のサーバーは2006年2月にSendmail 8.13.5へバージョンアップしたが、それで安心して、その後の動向を気にしていなかった。Sendmail-8.13.6は2006-03-26にリリースされており、約2ヶ月間もその事実を見逃していたことになるが、早速、バージョンアップを実施した。
バージョンアップの手順は以前のとおりであるが、コンパイルでトラブルが発生した。sendmailを解凍したディレクトリーで
cd /sendmail-8.13.6/sendmail
%./Build
としたが、
../../sendmail/sendmail.h:1323: phclient.h: No such file or directory
*** Error code 1

Stop in /usr/home/mac/sendmail-8.13.6/obj.FreeBSD.4.10-RC3.i386/libsmutil.
*** Error code 1
Stop in /usr/home/mac/sendmail-8.13.6/obj.FreeBSD.4.10-RC3.i386/sendmail.
とエラーになってしまった。
READMEファイルを読んで-cオプションをつけて
%./Build -c
とすると無事コンパイルできた。
コンパイル後のインストールやcfファイルの作成は以前のメモどおりでOKである。

以前のバージョンアップに関するメモ

sendmailに重大なバク゜が発見された。このバグはリモートから管理者権限を奪取されてしまうというかなり深刻なものである。我が自宅サーバーのsendmailのバージョンは8.11.6で、もちろんバグを含んでいる。詳細はhttp://jvn.doi.ics.keio.ac.jp/vn/JVNCA-2003-07.htmlを参照してもらいたい。我が自宅サーバーで使用中のFreeBSD4.4Rにマッチしたセキュリティーパッチがなかったので、バグフィクスされたsendmail8.12.8にバージョンアップすることにした。これはFreeBSD4.4R+sendmail8.11.6からFreeBSD4.4R+sendmail8.12.8へのバージョンアップにおけるメモである。
このバージョンアップ直後にsendmailに別のセキュリティーホールが発見され、その対応版としてsendmail8.12.9がリリースされた。詳細はhttp://jvn.doi.ics.keio.ac.jp/vn/JVNCA-2003-12.htmlを参照してもらいたい。バージョンアップの方法はsendmail8.12.8をsendmail8.12.9と読み替えてもらいたい。私はすでにsendmail8.12.8にバージョンアップしていたので、sendmail8.12.9をダウンロードしコンパイルしてバイナリー本体をインストールしただけで、cf等はsendmail8.12.8のものをそのまま使用した。
その後、またまた別のセキュリティホールが発見され、最新はsendmail8.12.11になっている。現在、我がサイトはFreeBSD4.10R+sendmail8.12.11で運用している。

ソースの入手

最新バージョンはhttp://www.sendmail.org/8.12.8.htmlからダウンロードする。sendmailのサイトにはダウンロードしたファイルが信頼できるものかどうかPGP署名をかならずチェックせよと書いてある。IMPORTANT NOTICE: If you download the sendmail distribution you MUST verify the PGP signature. Do NOT use sendmail without verifying the integrity of the source code.
実はPGPとかは使ったことがないが、portsからインストールしてなんとか認証することができた。しかし、残念ながらこのあたりについてメモを書けるほど理解していないので別の機会にしたい。ソースの本体はsendmail.8.12.8.tar.gzであるが、PGPでチェックする場合、sendmail.8.12.8.tar.gz.sigも必要となる。とりあえず、ダウンロードしたファイルのチェックサムの確認方法は以下のとおりである。
%md5 sendmail.8.12.8.tar.gz
MD5 (sendmail.8.12.8.tar.gz) = 71b4ce8276536b82d4acdf6ec8be306a
%md5 sendmail.8.12.8.tar.gz.sig
MD5 (sendmail.8.12.8.tar.gz.sig) = 2ecf7890c2ff5035aed8d342473d85a5

ユーザーの登録

sendmailは8.12になってからインストールする際にsmmspというユーザーを作る必要がある。FreeBSD5.0ではmailnullというユーザーも必要らしいのでついでに登録した。ユーザーの登録はvipwというコマンドを使用する。これは/etc/master.passwd専用のエディターであり、使い方もviと同じである。
#vipw
で/etc/master.passwdを開き
smmsp:*:25:25::0:0:Sendmail Submission User:/var/spool/clientmqueue:/sbin/nologin
mailnull:*:26:26::0:0:Sendmail Default User:/var/spool/mqueue:/sbin/nologin
を追加する。/etc/groupも編集する。こちらは普通のviでOKである。
#vi /etc/group
smmsp:*:25:
mailnull:*:26:
を追加した。
ユーザー登録の際に指定したclientmqueueディレクトリーを作成し、パーミッションを変更する。
# mkdir /var/spool/clientmqueue
# chown smmsp.smmsp /var/spool/clientmqueue
# chmod 770 /var/spool/clientmqueue
# chmod 700 /var/spool/mqueue

コンパイル、インストールの準備

FreeBSD4.4Rにおけるsendmail本体は/usr/libexec/sendmail/sendmailなので、これを上書きできるようにsite.config.m4 を作成する。ソースを展開した場所の/sendmail-8.12.8/devtools/Siteへ移動して
%vi devtools/Site/site.config.m4
define(`confMBINDIR',`/usr/libexec/sendmail')
とする。
インストールに失敗したときの保険としてオリジナルのファイルを退避しておく。
# cp /usr/libexec/sendmail/sendmail /usr/libexec/sendmail/sendmail.bk
# cp /etc/mail/sendmail.cf /etc/mail/sendmail.cf.bk

コンパイル、インストール

いよいよコンパイル、インストールを実施する。
%cd sendmail-8.12.8/sendmail
%./Build
%su
# ./Build install
でインストール完了である。makemapを実施するためsendmail-8.12.8/makemapへ移動して
% ./Build
# ./Build install
とする。

submit.cfファイルの準備

sendmail8.12.8ではsendmail.cfの他にsubmit.cfも必要となる。/sendmail-8.12.8/cf/cfへ移動して
%vi submit.mc
define(`confCF_VERSION', `Submit')dnl
define(`__OSTYPE__',`')dnl dirty hack to keep proto.m4 from complaining
define(`_USE_DECNET_SYNTAX_', `1')dnl support DECnet
define(`confTIME_ZONE', `USE_TZ')dnl
define(`confRUN_AS_USER', `smmsp')dnl  #この行を追加した。
define(`confDONT_INIT_GROUPS', `True')dnl
dnl
dnl If you use IPv6 only, change [127.0.0.1] to [IPv6:::1]
FEATURE(`msp', `[127.0.0.1]')dnl
とした。 submit.cfを作るためには以下のコマンドを使う。
%make submit.cf
%su root
#cp submit.cf /etc/mail/
で/etc/mailへコピーする。
とりあえず、sendmail.cfは8.11.6で使用したもので試験してみる。

試験

現用のsendmail-8.11.6を停止しておく。
%ps ax
でsendmailのPIDを調べて
su root
# kill sendmailのPID
とする。
とりあえず、現用のsendmail.cfを使って試験してみる。
%sendmail -bt -C /etc/mail/sendmail.cf
sendmail-8.11.6で使用したsendmail.cfのままであるとcfのバージョンが違うとメッセージがでるはずである。
Warning: .cf file is out of date: sendmail 8.12.8 supports version 10, .cf file is version 9
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
また、アクセス制御の構文も違うとメッセージが出る。
*** WARNING: missing -T<TMPF> in argument of FEATURE(`access_db', hash -o /etc/mail/access)
このままでも動くはずであるが、sendmail.mcを手直しする。 sendmail-8.11.6で使っていたsendmail.mcは以下のとおりである。
divert(0)dnl
VERSIONID(`$Id$')
OSTYPE(`bsd4.4')dnl
DOMAIN(`generic')dnl
FEATURE(`access_db', `hash -o /etc/mail/access')dnl
FEATURE(`masquerade_envelope')dnl
MASQUERADE_AS(`mydomain.com')dnl
FEATURE(`local_lmtp')dnl
define(`confTO_IDENT', `0s')dnl
define(`confCW_FILE', `-o /etc/mail/local-host-names')dnl
define(`confNO_RCPT_ACTION', `add-to-undisclosed')dnl
define(`LOCAL_MAILER_FLAGS', LOCAL_MAILER_FLAGS`'P)dnl
define(`confMAX_MIME_HEADER_LENGTH', `256/128')dnl
define(`confPRIVACY_FLAGS', `authwarnings,noexpn,novrfy')dnl
MAILER(`local')dnl
MAILER(`smtp')dnl
5行目の構文を以下のように変更した。
FEATURE(`access_db', `hash -T<TMPF> -o /etc/mail/access')dnl
他は8.11.6で使用したsendmail.mcのままである。7行目のMASQUERADE はメールを送信した実際のホスト名ではなく、別名を使うという指定とのことである。実際はhogehoge@mail.mydomain.comであるが、ここに設定することにより、hogehoge@mydomain.comと表示されるようになる。なお MASQUERADE の設定を行った場合には/etc/mail/local-host-namesに、受け取るメールアドレスのドメイン名部分を書いておく必要があるので、
/etc/mail/local-host-names
mydomain.com
ns.mydomain.com
mail.mydomain.com
と記述する。最下行は外部のMXにmail.mydomain.comと設定したあるので念のためである。
FEATURE(`local_lmtp')dnlはFreeBSD4.2R以降では記述する必要がある。mail.localにSUIDにセットされなくなりそのためローカルユーザの配送に不具合がでるのを防ぐためである。 define(`confTO_IDENT', `0s')dnlはIDENT認証を行わないように待ち時間を0秒とするものである。これを設定することによりルーターで113を通す必要がなくなる。 access_dbは、メールの転送制限などを access_db で指定したファイルで行うために設定する。FreeBSD4.4には、 /etc/mail/access.sample というサンプルが用意されている。家庭内LANからメール転送を許可するには、 /etc/mail/accessに
192.168.0 RELAY
と記述する。
access_db はデータベースに変換しておく必要があるので以下のコマンドを実施する。
# makemap hash /etc/mail/access < /etc/mail/access
その後、
%make sendmail.cf
%su root
#cp sendmail.cf /etc/mail/
として、置き換える。

sendmailの起動

8.12.8では2つのプロセスを起動する必要がある。
#/usr/sbin/sendmail -L sm-mta -bd -q30m
#/usr/sbin/sendmail -L sm-msp-queue -Ac -q30m
でOKとなる。確認のため
%ps -ax | grep sendmail
とすると
221 ?? Ss 0:00.02 sendmail: accepting connections (sendmail)
223 ?? Is 0:00.01 sendmail: Queue runner@00:30:00 for /var/spool/clientmqueue (sendmail)
のようになるはずである。
%netstat -a
とすると
tcp4 0 0 *.smtp *.* LISTEN
のようにsmtpが1つだけであることも確認しておく。
ついでに、起動させたsendmailのバージョンを確認する。
%sendmail -d0.101
Version 8.12.8
と無事、最新のバージョンとなっていた。

セキュリティーチェック

これで、バージョンアップは完了したので、不正中継をしないか確認する。おすすめのhttp://www.abuse.net/relay.htmlでチェックすると全項目、無事パスした。 最後に、以下のファイルのパーミッションを確認しておく。
-r-xr-sr-x root smmsp ... /usr/libexec/sendmail/sendmail
drwxrwx--- smmsp smmsp ... /var/spool/clientmqueue
drwx------ root wheel ... /var/spool/mqueue
-r--r--r-- root wheel ... /etc/mail/sendmail.cf
-r--r--r-- root wheel ... /etc/mail/submit.cf

自動起動

FreeBSD4.4+sendmail-8.11.6では/etc/rc.confから起動するようになっていたが、sendmail-8.12.8では2つのプロセスを起動させるためこれでは都合が悪い。そのため、/etc/rc.confでの起動を停止してshスクリプトからの起動に変更する。
sendmail_enable="YES"
から
sendmail_enable="NONE"
とする。ここはただの"NO"ではなく"NONE"にする必要がある。
shスクリプトは以下のものを作り、/usr/local/etc/rc.d/sendmail.shとした。
#vi /usr/local/etc/rc.d/sendmail.sh

#!/bin/sh case "$1" in
start)
/usr/sbin/sendmail -L sm-mta -bd -q30m
/usr/sbin/sendmail -L sm-msp-queue -Ac -q30m
;;
stop)
kill `head -1 /var/spool/clientmqueue/sm-client.pid`
rm -f /var/spool/clientmqueue/sm-client.pid
echo -n " sendmail-smclient stopped. "
kill `head -1 /var/run/sendmail.pid`
rm -f /var/run/sendmail.pid
echo -n " sendmail-mta stopped. "
;;
*)
echo "Usage: `basename $0` {start|stop}" >&2
exit 64
;;
esac

exit 0

実行させるために
#chmod +x sendmail.sh
とする。

fmlのチェック

自宅サーバーではfmlによるメーリングリストを3つ稼働させているのでそちらもチェックした。各ML宛にメールを出し、
%less /var/log/maillog
としてキーボードでShift+Fとするとリアルタイムで配送状況を確認できる。特に問題ないが、やはりqmailの方が格段に速いようである。でも、せっかくバージョンアップしたので、FreeBSD+qmail環境のHDDの替わりにFreeBSD+sendmail環境のHDDでサーバー運用しよう。

HOME BACK

Last Update 17/Mar/2010 by mac