2008年9月11日木曜日

stunnel で何でもSSL経由にしたらいい

TCPでポートをリッスンしてるサーバプログラムは
  -例えばTCP/25でメール送信を受け付けている SMTP、TCP/110 のPOP3
stunnelを使って、クライアントからサーバまでの通信をSSLで暗号化、stunnel から ローカルのTCP/25やTCP/110 に通信を投げれば下記のように通信途中が暗号化される。
 
[PC] →→ SSMTP(SMTPS) →→【[Stunnel]→→SMTP(Sが取れる)→→[SMTPサーバ]】
【】がサーバ内部
 
 
Stunnel がTLS/SSLの暗号・複合のところをやって、あとはサーバ内でアプリケーションプロトコルを使った通信をする、また暗号化して戻してくれる。
 

今や大概サーバアプリ側でTLS/SSLを備えているけど、コンパイルしなおしとか面倒な作業が居る場合は Stunnel でやってしまう。

Stunnel配布サイト
http://www.stunnel.org


 
 

簡単に使い方のメモ
 

Stunnel用の証明書作成


まずはSSL通信に必要な 証明書セット→pemファイルが必要。
既存のものがあればそれを使うといいけど、証明書セットがない場合は自作する。
過去記事:OpenSSLでお手軽に自己証明書(1)_make一発で作ればいい。"/etc/stunnel/pem/stunnel.pem" とでもして保管する。
 

コマンドラインで実行


「pem」 「SSLで待ち受けたいポート」 「本来のポート」 がそろえばサーバのSSL化は完了する。
 

465番ポートで SMTP を受けたい
# stunnel -p /etc/stunnel/pem -d 465 -r 25 &

 

995番ポートで POP3 を受けたい
# stunnel -p /etc/stunnel/pem -d 995 -r 110 &

 

上記実行したら、メーラとかで SSMTP(SMTPS)、POP3S の設定を試してみる。証明書の文句があるかもしれないが証明書の有効性を無視するように設定すればメールの送受信が行える。SSL化・暗号化はこんなもんで実装可能。
 
しかしこの例だと&(アンパサンド)でバックグラウンド実行してるだけだから、制御端末落としたら(ログアウトとか)止まっちゃう。
メールサーバのログには 全部ローカルホストからの通信が記録されていて、何がなんだか見づらくて仕方ない。
stunnel のコンフィグを書いて、デーモン起動でもいいけど、xinetd を経由するのがいいかも。
 
 

xinetd 経由にする


Stunnel側の準備


xinetd用のコンフィグを用意する、"/etc/stunnel/" にでも。
あとこの例では "/var/log/stunnel/" を事前に作っておく必要がある。
 
pop3s.stunnel.conf
#pop3s to local 110
cert = /etc/stunnel/secure.stunnel.pem
# debug = 7
output = /var/log/stunnel/stunnel_pop3s.log
connect = 110


smtps.stunnel.conf
#smtps to local 25
cert = /etc/stunnel/secure.stunnel.pem
# debug = 7
output = /var/log/stunnel/stunnel_smtps.log
connect = 25

debug の項目は調査するときなどにコメントアウトをはずして様子を見るため。普段は普通のログでいい。
SMTP は 587 でやったりもする。
 

xinetdの設定


まず "/etc/service" にpop3s と smtps のポート割り当てが書いてなかったら追記しておく、最後尾でもどこでもOK。
 
で、 "/etc/xinetd.d/" 以下にファイル作成

pop3s
service pop3s
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/sbin/stunnel
server_args = /etc/stunnel/pop3s.stunnel.conf
log_on_success += USERID
log_on_failure += USERID
}

smtps
service smtps
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/sbin/stunnel
server_args = /etc/stunnel/smtps.stunnel.conf
log_on_success += USERID
log_on_failure += USERID
}

ファイル作成が終わったら xinetd をリロードする。
メーラなどで確認すればSSMTP(SMTPS)、POP3S で送受信できるのが分かり、出力を指定したログファイルにちゃんと外部との通信ログが記録されていることが確認できるはず。
通信できなかったら エラーログを確認したり、hosts.allow とかTCPラッパーの設定を疑う。
 

ついでに logrotate もしておく


"/etclogrotate.d/" 下の適当なファイルを stunnel の名前でコピー
ローテ対象ログ;"/var/log/stunnel/*log"
リロードプロセス:"xinetd"
 
compress や世代管理は好みで。