SSHを使って自宅サーバでSMTPによるメール送信を安全に使う

SMTP over SSHでセキュアにメール送信

 自宅サーバでメールサーバを立てたので,外からメール送信するときに,そいつを使いたい.

しかしなにも考えずにメールサーバのSMTPをインターネットに対して自由に公開すると, 文句なしにSPAMの踏み台と化してしまうため,非常によろしくない.

外部からの接続でも,俺が接続した場合だけ,自由にSMTPを使えるようにする必要がある. (Postfixでいうところの,「"trusted" SMTP clients」とみなす)

このために,SMTP接続元を認証する必要があるのですが,その方法にはこんなのがあります.

  • SMTP認証
  • PbS(POP before SMTP)
  • SMTP over SSH

検討すると,

方式コメント
SMTP認証かなり面倒(だと思う)
PbS既にPOP over SSHを使っているので,事前にPOPで接続した元IPアドレス(=sshdが接続するのでメールサーバのアドレスになる)とSMTPで接続しようとする元IPアドレス(=外のアドレス)が一致しない.そのため,PbSの原理からして実現不可能な気がする.
SMTP over SSH一番楽そう.クライアントにSSH PortForwarderが必要だけど,既にPOP用に使っているし.

ということで,SMTP over SSHでやることにしました.将来的にはSMTP認証もやってみたい気はするが, 大変そうだわい.

前提バージョン
OSRedHat Linux 7.1J (Kernel 2.4.18-27.7.x)
接続環境rp-pppoe-2.6-5 と ppp-2.4.0-2 によるADSL常時接続
メールサーバPostfix 2.0.6
SSHサーバopenssh-3.1p1-5
SSHポートフォワーダPortForwarder 1.1.1 (Windowsバイナリ版)

方針

SSHポートフォワードを使って,インターネット上のクライアントPCからメールサーバに接続した場合, Postfixのsmtpdから見た接続元IPアドレスは,メールサーバ(正確にはSSHサーバが動作しているマシン) のIPアドレスとなる.

このIPアドレスを,「信頼できるクライアント」としてPostfixが認識するようにする.

しかしプロバイダの契約が非固定IPアドレスの場合,このIPアドレスはまた例によってADSL接続するたびに変動するのであった. 少し工夫が必要.


メールサーバ側の設定

 ADSL接続時にプロバイダから取得したIPアドレスを,どっかファイルに記録しておいて, それをPostfixに参照させるようにしてみた.

1.とりあえず空ファイルで作っておく

# touch /etc/ppp/ppp-adrs
このファイル名,ディレクトリに,深い意味は全くありません.適当です.

2.ADSL接続時:ファイルにIPアドレスを記録

/etc/ppp/ip-up.local に追加

echo $IPLOCAL > /etc/ppp/ppp-adrs
/usr/sbin/postfix reload
プロバイダから取得したIPアドレスをファイルに記録して,Postfixにリロードをかける.

3.切断時:ファイルをクリア

/etc/ppp/ip-down.local に追加

echo '' > /etc/ppp/ppp-adrs
まぁ別にクリアしなくても,ADSL接続されていないということは外部からSMTPのアクセスが来るはずがないので, 構わないような気はする.

でも可能性として,切断後,ADSLに再接続(新アドレス取得)してから上記ip-up.localの「postfix reload」が実行されるまでの隙に, 旧のアドレスを割り当てられた別のマシンがSMTPアクセスしてきた場合,そいつを信頼できるクライアントとみなしてしまう, ということがないとは言えないか.

一応あった方がいいな.

4.Postfixの設定

Postfixの設定を以下のように変更して,さっきのファイルに記録されたIPアドレスを 信頼できるクライアントとして認識させる.

/etc/postfix/main.cf を一部変更 - 太字が変更箇所

myhostname = mail.kamoland.com
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain $mydomain
mynetworks = 192.168.0.0/24, 127.0.0.0/8, /etc/ppp/ppp-adrs
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mail_spool_directory = /var/mail


クライアント側の設定

 PortForwarderの入手については,「POP over SSHでセキュアにメール受信」を参照.

configurationファイル

pf.conf - 太字の行を今回追加
Host KamoLand
     HostName kamoland.com
     LocalForward 10110 kamoland.com:110
     LocalForward 10025 kamoland.com:25

クライアント機自身(localhost)の10025ポートを,メールサーバのSMTP(25)ポートへ転送させます.

10025に深い意味はありません.

メーラー設定

 要は,SMTPサーバの設定を,localhostのポート10025に変更するだけだ.

これでひとまずOK.


雑感

 メール周りがずいぶんSSH Port Forwardingに依存してしまったので,SSHのセキュリティホールには注意が必要だな.

これ(SMTP over SSH)とPbSを組み合わせれば,さらに安全性を高めることはできるわな.

つまり,この方法における/etc/ppp/ppp-adrsファイルが常時存在するのではなく, POP認証が通ってから一定時間の間しか存在させないようにすると.

しかしそれだけだったら,PbSを本格的に導入しなくても,自分でPerlとかでスクリプトを書いても実現できそうだな. /var/log/maillogを常駐監視して,ファイルを作ったり消したりすればいいだけだから.

今後の課題だ.

kamolandをフォローしましょう


© 2017 KMIソフトウェア