このエントリーをはてなブックマークに追加
スポンサーリンク

sendmailの設定

sendmailとは

sendmailとはRedHat系など多くのディストリビューションで標準のメールサーバーであり、大抵はLinuxをCDからインストールすれば自動的にインストールされていると思います。

メールサーバーには他にqmailやpostfixがあり、それらを愛用するユーザーにとってsendmailは色々問題があるように言われていますが、なんといっても標準搭載されているディストリビューションの多さは大変な強みです。なぜなら、設定でわからない事がある場合にGoogleで検索して知りたい情報にヒットする可能性が高いからです。

ただし、それは諸刃の剣であり、標準搭載という事は攻撃者に狙われるケースが多く、セキュリティーパッチは常に当てておく必要があります。

脆弱性に注意

先に述べたように、sendmailは常に最新にバージョンアップしておくのが望ましい所ですが、Linuxの場合脆弱性の報告が思いのほか多く、アップデート作業がおっつかない場合がほとんどだと思います。そのため、アップデート作業そのものを放棄してしまう人も少なくありません。

しかしながら、8.13系を使っている場合はSendmail 8.13.6以降に、また8.12系を使っている場合はSendmail 8.12.9以降にバージョンアップしてない場合は、sendmailを起動させる前にバージョンアップしておきましょう。このタイミングでのパッチはroot権限を乗っ取られてしまう成功率(危険度?)の高い脆弱性に対するパッチであり、しかもその方法も有名になっています。

という筆者も一度サーバーをsendmailからroot権限が乗っ取られ、SPAM発生装置にされてしまった事があります。というわけで、sendmailはできる限り新しいバージョンを使う事にしましょう。

cfファイルの生成

sendmailの動作は、/etc/mail/sendmail.cfというファイルで設定します。ところが、このcfファイルの書式は複雑で、人間が理解するには非常に困難です。そこで、mcというファイルを作っておき、そこからcfファイルを生成するのが一般的です。

linuxをCDからインストールした状態では、/etc/mail/sendmail.mcというファイルができていると思います。sendmailの挙動を変えるためには、このファイルを変更します。

先頭にdnlと書かれた行はコメント行ですので、無視してかまいません。

デリバリーモード

define(`confDELIVERY_MODE', `モード')dnl

モードの所には、メールをどのように送信するかを指定します。標準ではiになっていると思います。iは1通ずつ送信が完了してから次のメールを処理するというモードです。

ただし、SPAMメール メーリングリストやメールマガジン等で大勢に同報通信したい場合、1通ずつ処理していたのでは配信が遅くなってしまいますんので、いったん全部のメールをキューにためてから、数通ずつバックグラウンドで処理させたい場合があります。その場合、モードにbかqを指定します。bを指定した場合、キューにたまるだけですので、定期的にcrontab でsendmail -qコマンドを発動させてキューにたまったメールを送信してあげる必要があります。

qを指定した場合は、/etc/sysconfig/sendmailで、SMQUEUE=で指定したタイミング毎にメールの送信を試み、それで配信できなかったメールはQUEUE=で指定したタイミング毎に再送を試みられます。

逆引きしてないアドレスからのメールを受け取る

FEATURE(`accept_unresolvable_domains')dnl

ホスト名が引けない送信元からのメールを受け取りを許可します。この指定がないと、送信元が逆引きできないSMTPサーバーを使っている場合に、受け取りを拒否してしまいます。ただし、SPAMメール防止のために、あえてホスト名が引けない送信元からのメールを拒否するのであれば、この指定は不要です。標準ではこの設定になっているので、dnlをつけてコメントアウトします。

submissionポートを有効にする

DAEMON_OPTIONS(`Name=MSA, Port=submission,M=C')dnl

プロバイダによっては・・・というより、もうほとんどのプロバイダでは外部からの25番ポートへの接続を禁止しています。

今や世界中でSPAMメールが氾濫しており、このホームページの代表アドレス宛てにも1日最低でも100通はSPAMメールが来ます。代表アドレスだけでなく、Linuxでデフォルトで作られるユーザー宛てにも同様に100通ぐらいずつメールが来ます。

という状況なので、プロバイダからすれば外部から25番ポート宛に来るパケット自体が負荷という事になります。しかし、自サーバーにつながってるプロバイダと、会社や自宅が使っているプロバイダが異なる場合、会社や自宅から自サーバーへメールを送ろうとしても、会社や自宅の使っているプロバイダが25番ポート宛てのパケットをドロップしてしまうので、メールが送れません。

そこで、端末からサーバーへ向けてメールを送信する際には、25番ポートではなく587番ポートを使う事が推奨されています。また、587番ポートを開放するにあたり、IPアドレスによる制限や、SMTP-AUTHの制限をかける事は必須になっています。なので、587番を開放する際には後述のSMTP-AUTHも併せて設定しておきます。

生成する

mcファイルができあがったら、 m4 を使い、sendmail.cfを生成します。

cd /etc/mail
m4 sendmail.mc > sendmail.cf

設定ファイルの変更

・ローカルホスト名の追加

自分宛のメールを受け取れるように、local-host-nameファイルに自ホスト名を記述します。

vi /etc/mail/local-host-names

例)
# local-host-names - include all aliases for your machine here.
mail.aufheben.net
www.aufheben.net
aufheben.net
この例では、 @aufheben.net 、 @mail.aufheben.net 、 @www.aufheben.net 宛のメールは自分宛であると認識させます。

※注意
最初に設定するのであれば良いのですが、最初にはなかったドメインを後で追加する場合は注意が必要です。「バーチャルホストの追加」という仕事を依頼されると大抵はapacheの設定の事だけしか頭に浮かばず、/etc/mail/local-host-namesを設定しない事が多いからです。

いや、実際にバーチャルホストの設定というとapacheの設定の事なんですが、ほとのどのお客さんはバーチャルホストの設定というとメールも受信できるようになると思ってますので、 メールも受信できないようにしておかないと完全に設定する側のミス(依頼側のミスではなく)とみなされるので、注意が必要です。

なので、「バーチャルホストを設定してください」言われたらapacheの設定だけでなく、local-host-namesも追加すると常に頭の中で連呼しておいた方が良いです。この場合、ミスが発覚するのがセッティングからかなり後になり、また届いているはずのメールが届いてないという事で、ミスの影響がかなり大きくなるので注意が必要です。

・中継許可の設定
windows端末などからSMTPサーバーを使って送信する場合、accessファイルで中継を許可するホストを記述する必要があります。

例)
localhost.localdomain RELAY
localhost RELAY
127.0.0.1 RELAY
192.168.0 RELAY
この例では、 ローカルホスト(つまり自分自身)と、ローカルエリア(192.168.0.xx)からのメールの中継を許可します。

この後、access.dbファイルを生成します。

makemap hash /etc/mail/access < /etc/mail/access

バージョン情報、端末の情報を隠す

sendmailはapache同様、世界的に使われているSMTPサーバーです。ですので、バージョンごとにセキュリティーホールの情報は明らかになっていて、どのバージョンには、どんな攻撃を仕掛ければハックできるかという情報が世界中に知れ渡っています。ですので、sendmailのバージョンをできる限り第三者に知られないようにしなければなりません。

また、普通にメールを送信すると、送信した端末のローカルアドレスが送信先に伝わってしまいます。メールを送信した相手に端末のローカルアドレスやパソコン名がわかってしまうと、不正アクセスのヒントになってしまいます。そこで、メールのヘッダーにsendmailのバージョンや、端末の情報を付加させないようにします。

メールヘッダーのフォーマットを定義している部分(Format of headers)を書き換えます。端末情報やバージョンを、共に「unknown」とすれば良いのですが、ここではゼビオスが不自然のないように隠しメッセージを書き換えたように(?)、なるべく不自然のないような変更をします。(といっても、Let's enjoy this GAME とは出しません。)

/etc/sendmail.cf
HReceived: $?sfrom $s $.$?_($?s$|from $.$_)
$.$?{auth_type}(authenticated$?{auth_ssf} (${auth_ssf} bits)$.)
$.by $j ($v/$Z) $?r with $r$. id $i$?{tls_version}
         
HReceived: $?sfrom SMTP
$.$?{auth_type}(authenticated$?{auth_ssf} (${auth_ssf} bits)$.)
$.by $j (SMTP server) $?r with $r$. id $i$?{tls_version}
このように定義しておくと、メールヘッダーに以下のように送信されます。

変更前
Received: from VAIO-XXXX ([192.168.0.XXX]) by mail.aufheben.net (8.11.1/8.11.2)
変更後
Received: from SMTP by mail.aufheben.net (SMTP server)
また、送信元サーバーが25番ポートに接続した時にもバージョン番号を通知してしまうので、25番ポートへの接続の際に出す挨拶文を変更します。
# SMTP initial login message (old $e macro)
O SmtpGreetingMessage=$j Sendmail $v/$Z; $b
         
O SmtpGreetingMessage=$j server; $b
例によって、不自然のないような変更をします。この修正をすることで、挨拶文は以下のように変更されます。

変更前
220 mail.aufheben.net ESMTP Sendmail (8.11.1/8.11.2);
変更後
220 mail.aufheben.net ESMTP server;

メールサーバーをリスタートさせる

sendmail.cf、local-host-names、accessなど設定ファイルを変更したらsendmailを再起動させて、これまでの変更を有効にします。

/etc/rc.d/init.d/sendmail restart

ここで、[ OK ] [ OK ]と表示されたら成功です。もし、[ Faild ]や、[ 失敗 ]と表示されてしまった時は、残念ながらどこかにエラーがあります。もう一度このページを読み返して確認してください。ただし、元々sendmailが起動してない場合は、[ 失敗 ] [ OK ]と表示されますが、1回目は単に前のプロセスの停止が成功したかどうかの表示なので、2回目が [ OK ]なら成功したという事です。

動作テスト

・送信テスト
それでは、実際に送信してみましょう。 smtpサーバーとして今作成したサーバーを指定して、メールを送信してみます。エラーも何も出ず、実際に送信先にメールが届いていたら成功です。

ここで、送信するのは自分のサーバー宛ではなく、外の(ローカルエリア外にある)サーバー宛にしてください。もし、RELAY DENANDと表示されたら、ローカルエリアからもメールが中継できてません。もう一度、 accessファイルの記述を確認してください。

587番ポートを開放した時は、SMTPポートを25から587にして送信してみてください。

受信テスト
外から来たメールが受け取れないのでは、メールサーバーの意味がありません。そこで、外から来たメールが届くかどうか検査します。よそのSMTPサーバーから、自サーバー宛に送信してください。よそにアカウントがないという方は、テスト用に Yahooメールや Hotmail 、Freemail等のアカウントを取得しておいてください。

無事メールが届けば成功です。届いているかどうかは、/var/spool/mail/アカウント名 というファイルをcatで表示させてみると良いでしょう。(※ここでアカウント名は、エイリアスやバーチャルテーブルを設定していなければアドレス@の前の名前になります。)

届かない場合は、以下の点をチェックします。

・/etc/mail/local-host-names
ここに自サーバーの名前が記述されているかどうかチェックします。

・/var/named/named.ドメイン名
自ドメインのネームサーバーに、MXレコードが存在するかどうかチェックします。

・telnet localhost 25
メールが届くためには、25番ポートが空いてなければなりません。もし、エラーが表示されるようであれば、 /etc/rc.d/init.d/sendmail start で起動します。ここで起動しない場合は、もう一度このページを見直してやり直してください。また、挨拶文でバージョン番号が表示されてしまってないか確認してください。

telnetから抜けるためには、QUITと入力してください。

不正中継されないかどうか検査する

もし実際にメールが送信できたとしても、不正中継を受け付けてしまったのでは元も子もありません。そこで、不正中継されない事を検査します。

方法1

http://www.rbl.jp/svcheck.php
にアクセスして、メールサーバーのIPアドレス(IPが引ける場合はホスト名)を入れてCheckボタンを押します。

方法2

@new@abuse.net に空メールを送ります。会員登録の説明のメールが返信されてきます。
A 「このメールに、I acceptと書いて返信せよ」と書いてあるので、I acceptと書いて返信します。しばらくして会員登録完了メールが届きます。このメールに、アカウントとパスワードが書いてあると思います。この確認作業は、向こうの担当の方が手動でやっているようで、時間帯によっては時間がかかる場合があります。
Bhttp://www.abuse.net/relay.html にアクセスします。先に届いたメールにあるアカウントとパスワードを入れて、test for relayボタンを押します。

追記 2015.8.30
http://www.abuse.net/relay.html のリレーチェッカーは今はありません。「リレーチェッカーはもう存在しない。よっぽど間違った設定をしない限りオープンリレーにはならないから安心しろ。」などと書いてあります。 まあ実際、過去のsendmailのバージョンでは性善説に基づいて作られていたためデフォルトがオープンリレーでしたが、最新バージョンでデフォルトがオープンリレーになっているものなど存在しないでしょう。

方法3

確認したいサーバーにtelnetかsshでログインして、コマンドラインから
telnet relay-test.mail-abuse.org
と入力します。

SMTP-AUTHの設定

先の説明では、/etc/mail/accessファイルにてローカルIPからの送信を許可しました。しかし、外出先や別のプロバイダから送信する場合、この方法では送信ができません。外出先(職場とか)が固定IPならそのIPを許可すれば良いのですが、動的IPだった場合、IPアドレスが変わるたびに設定を変更しなければならなくなります。

そこで、ここではsendmailにSMTP-AUTH機能をつけてみます。

ところで、メール送信プロトコル(SMTP)は、当初性善説を用いて作られていたため、メールの送信や中継は見知らぬIPからも許可してしまいました。そのため、かつては多数のメールサーバーがSPAMメールの送信に利用されてしまいました。

このSMTP-AUTH機能を使えば、メール送信時にもパスワード認証を行い、パスワードが合致したユーザーにだけメールの送信やリレーを許可する事ができます。

@SASLの確認
rpm -qa | grep sasl
cyrus-sasl-2.1.19-14
cyrus-sasl-plain-2.1.19-14
cyrus-sasl-md5-2.1.19-14
cyrus-sasl-devel-2.1.19-14
インストールされてなければ、RedHatEnterpriseやCentOSのCD-ROM等から探してきてインストールします。

ASASLの設定変更&起動
パスワード認証方式を変更します。

vi /usr/lib/sasl2/Sendmail.conf
pwcheck_method:saslauthd

pwcheck_method:auxprop
変更したら、SASLを起動し、自動起動に設定します。
/etc/rc.d/init.d/saslauthd start
chkconfig saslauthd on


Bsendmail.mcの変更&再起動
SMTP-AUTHを有効にするため、以下のコメント(dnl)を外します。

cd /etc/mail
vi sendmail.mc
dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
設定の変更を有効にします。
cd /etc/mail
m4 sendmail.mc > sendmail.cf
/etc/rc.d/init.d/sendmail restart

CSASLにユーザの登録
/usr/sbin/saslpasswd2 -u ドメイン名 ユーザー名
とします。パスワードを2回聞いて来ますので、同じパスワードを入れてください。
ユーザー名@ドメイン名というアカウントができあがります。

送信の確認

まず、/etc/mail/accessを変更して、LANの内側から送信できなくします。じゃないと、元々送信ができる環境でテストしても送信できて当たり前ですので、何のテストにもなりません。

/etc/mail/access内にある、192.168.0 REALYはとりあえずコメント(#)にして、makemap hash access < accessとしてハッシュを作り直して、メールサーバーを再起動させます。メーラーからメールを送信して「550エラー」が出ることを確認してください。ここで、エラーもでずにすんなり送信してしまうと、不正中継されてしまうので、sendmailを止めて設定を見直してください。

550エラーが出たら、今度はメールソフトにSMTP-AUTH機能を有効にさせます。

・Beckyを使う場合
ツール>メールボックスの設定>詳細


SMTP認証にチェックを入れ、CRAM-MD5にチェックを入れます。ユーザーIDはSASLに登録したユーザー名@ドメイン名を入れます。(ドメイン名を忘れずに)パスワードも入れます。また、ESMTPを使用にチェックが入っていることを確認してください。

・Outlook Expressを使う場合
まず、アウトルックの「ツール」を押し、プルダウンメニューの「アカウント」を選びます。アカウントの窓が開きますので、
ここで「メール(規定)」に設定されたアカウントを選択して「プロパティ」を押します。

「サーバー」のタブを押した後「このサーバーは認証が必要」にチェックを入れ、「設定」ボタンを押します。


次のアカウントとパスワードでログオンするにチェックを入れ、アカウント名とパスワードを入れます。アカウント名の所には、@ドメインを入れるのを忘れないようにしてください。

□パスワードを保存する
□セキュリティーで保護されたパスワード認証でログオン
にチェックを入れて、OKを押してください。あとは、OK→OK→閉じるをそれぞれ押して、開いている窓を閉じます。これで送信ができるようになります。

ただ、最初1回目の送信の時に、アカウントとパスワードをまた聞いてくる場合があります。この時はもう1回アカウントとパスワードを入れれば、2回目からは聞いてこなくなります。

・25番ポートが使えない場合
プロバイダによっては、外部サーバーへの25番ポートの送信を拒否している場合があります。その場合、SMTPで使用するポートを587番に変更する必要があります。

Beckyの場合、ツール→メールボックスの設定→詳細タブ内の、SMTPポートを25から587にします。
OUTLOOK Expressの場合、ツール→アカウント→メール→(規定のアカウント)→プロパティ→詳細設定詳細タブ内の、SMTPポートを25から587にします。

QPOPPERのインストール

SMTPは、Windows端末(やMacやlinux…とにかく端末)からサーバーへメールを送ったり、サーバー同士でメールを送ったり受けたりするプロトコルです。

それとは別に、メールボックスにたまったメールを端末がひっぱり出すプロトコルがPOP3です。(※他にIMAPとかがあります。)ここでは、sendmailプロセスが蓄えたメールを取り出すために、QPOPPERをインストールしましょう。

まずソース一式を入手します。
http://www.eudora.com/products/unsupported/qpopper/index.html

ソースをFTP等で転送します。
/usr/local/src/qpopper/qpopper4.0.8.tar.gz

ソースを解凍します。
/usr/local/src/qpopper
tar xvzf qpopper4.0.8.tar.gz

コンフィギュアします。
cd qpopper4.0.8
configure [--enable-log-login [--enable-shy]]

ここで、以前はシャドゥパスワードに対応させるために、 --enable-specialauthというオプションが必要だったのですが、現バージョンではデフォルトでシャドゥパスワードに対応しているので、このオプションは不要です。ただし、watcher2というPOP before SMTPシステムを組み込む場合は、--enable-log-loginの指定が必要です。以前はqpopperにパッチを当てて対応していたのですが、現在はオプションスイッチでwatcher2対応になります。

また、--enable-shyというオプションをつける事で、110番ポートに接続してきた相手に、QPOPPERのバージョンを通知しなくなります。これにより、QPOPPERの脆弱性を発見されにくくします。

コンパイルします。
make

この後、make installとしたい所ですが、このソフトにはMakefileにinstallという項目がないので、実行ファイルを手動でコピーします。
cp popper/popper /usr/sbin

このサーバーは単独では動作しませんので、xinetdというサーバーの配下で動作させる事になります。

xinetdを使う場合

/etc/xinetd.d/popper ファイルを作成します。
service pop-3
{
         socket_type  = stream
         protocol     = tcp
         wait         = no
         user         = root
         server       = /usr/sbin/popper
         server_args  = -s
         disable      = no
}
※サービス名を、pop3としている文献と、pop-3としている文献と両方見かけますが、/etc/services内で、pop3 110/tcp pop-3 定義してあれば、どちらのサービス名も使う事ができます。

xinetdを再起動します。
/etc/rc.d/init.d/xinetd restart

ここで、[ OK ] [ OK ]と表示されたら成功です。

APOPに対応させる

普通に使うのであればこのままでも問題はないのですが、サーバーからメールを受信する時に、この設定のままだとパスワードがインターネット上に平文のまま流れてしまいます。そこで、パスワードを暗号化してサーバーに送るようにします。ソースを解凍する所までは先ほどと同じでいいのですが、./configureする時にAPOP対応オプションをつけます。

configure --enable-apop --with-popuid=mail

mailというアカウントは、RedHatLinuxに最初から入っているのですが、最初から入ってない場合はuseraddコマンドで追加しておいてください。また、コンパイルが終了した後に、popauthというコマンドを/usr/binにコピーする必要があります。ファイルの所有者をmailとし、mailという権限でファイルを実行できるようにします。

install -s -m 4755 -o mail -g mail popper/popauth /usr/bin

以下のコマンドで、/etc/pop.authファイルを初期化します。

/usr/bin/popauth -init

初期化後、APOPを使うユーザー名を設定します。

popauth -user ユーザー名

ユーザー名に対するパスワードを聞いて来ますので、2回入力してください。この設定をしたユーザーはこれまでのパスワードではなく、今設定したパスワードを使って認証する事になります。また、APOPでのみ認証できるようになります。設定するユーザーを間違って設定してしまった、本当はAPOPにするつもりはなかったのに設定してしまった、という場合は、以下のようにして削除してください。

popauth -delete ユーザー名

設定したら、メールが受信できるかどうかテストします。まず、これまでの設定通りで受信してみてください。これで、受信ができなければ、とりあえずはOKです。次に、APOP対応メーラーで受信を試してみてください。

Beckyを使う場合、ツール>メールボックスの設定を使い、認証方式を「APOP」に変更します。


これで受信してみて、受信できれば成功です。
スポンサーリンク