stunnel を使って irssi を SSL 化する方法

 最近、自由が丘のキャットファイト(リアル猫的な意味で)が元気だなぁ、と感じている、技術部のtaiyohです。
 弊社長田が先ほど「stone を使って tiarra を SSL 化する方法」というエントリをアップしていましたが、僕は違うやり方だなぁ、ということで、書き残しておきます。
 まず、irc proxyにはirssiを使用しています。 このあたりの環境構築方法については、@hokacchaのブログの神エントリ「irssiをインストールしてからやったことのまとめ」をご参照いただきたいと思います。
 さて、肝心の通信のSSL化についてですが、表題にもありますが、僕はstunnelというツールを使っています。
 正直なところ、stoneとの違いがよく分かっていません。stoneがプロセス単位でポートを立てるのに対して、stunnelは設定ファイルを使って、1プロセスでポートの管理をすべて行います。このあたりの比較等については、是非ともどこかで宗教戦争を展開していただきたいと思います。何より、googleの検索結果でもあまり情報がないので、今後同じようなことをしてみようという人にとって、とても有益ではないでしょうか。個人的には、今年に入っても継続的にメンテナンスがされているstunnelの方が若干安心かな、と思っています。
 stunnelの導入についてですが、大方のLinuxディストリビューションのパッケージ管理システム及び(mac)?ports等に含まれていると思います。以下、僕が使っているマシンがCentOSのため、yumでのインストールコマンドを書いておきます。

% sudo yum -y install stunnel

 ここまでは簡単なのですが、問題は設定ファイルです。ググっても資料が古かったりして、今のバージョンでは動かないもの多数です。僕も設定項目をきちんと説明できるほどstunnelを理解していないので、以下に、今動いているものを微妙に修正したものを貼っておきます。もっと詳しい設定項目は、manページをご参照ください。

; Sample stunnel configuration file by Michal Trojnara 2002-2006
; Some options used here may not be adequate for your particular configuration
; Please make sure you understand them (especially the effect of chroot jail)

; Certificate/key is needed in server mode and optional in client mode
;cert = /etc/pki/tls/certs/ca-bundle.crt
; 長田のエントリと同様に作成した証明書のパス
cert = /etc/pki/tls/certs/__YOUR_HOSTNAME_etc__.pem

; Some security enhancements for UNIX systems - comment them out on Win32
chroot = /var/run/stunnel/
setuid = nobody
setgid = nobody
; PID is created inside chroot jail
pid = /stunnel.pid

foreground = yes

; Some performance tunings
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1

[ircd]
accept  = 6667
connect = 16607

 最後の

[ircd]
accept = 6667
connect = 16607

 がポートのマッピングとなっていて、これを必要な数だけ用意します。
 ここでのポート番号6667は、irssiでirc proxyを設定したときのポート番号としておきます。
 「accept」がアプリケーション側で提供しているポート番号で、
 「connect」がstunnel経由でssl化したポート番号となっています。
 accept側のポートは、/etc/hosts.denyやiptablesで、外からアクセスできないようにブロックしておくとbetterだと思います。

 上記の設定ファイルを/etc/stunnel/stunnel.confに保存したとして、stunnelの起動は、

# /usr/sbin/stunnel /etc/stunnel/stunnel.conf

 でOKです。
 ただ、このままでは、設定ファイルに「foreground=yes」 とある通り、シェルから起動しっぱなしにしないと、ポートのSSL化は有効になりません。
 個人的に、パッケージ側でdaemon化していないプロセスについては、なるべくdaemontoolsで管理したいという欲求があるので、以下のrunスクリプトを書いて、daemontoolsに登録しています。

#!/bin/sh

exec 2>&1
exec /command/softlimit -d 10485760 \
     /usr/sbin/stunnel /etc/stunnel/stunnel.conf

 こうすることで、シェルを1つもつぶすことなく、また、死活監視も行っているのでいつでも安心してirc proxyにアクセスできる、という一石二鳥の体制を作っています。

 カヤックではおいしい情報を見逃さない技術者も募集しています!