tech.kayac.com

 最近、自由が丘のキャットファイト(リアル猫的な意味で)が元気だなぁ、と感じている、技術部の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にアクセスできる、という一石二鳥の体制を作っています。

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

マンガ名刺を心待ちにしている nagata (@handlename) です。

今回は IRC proxy の tiarra を SSL で使う方法を紹介したいと思います。

tiarra って?

サーバーに常駐するIRCクライアント兼サーバー、とでも言えばいいのでしょうか。 IRC使う人にとっては割と常識っぽいアプリケーションみたいです(ぼくは最近知りました)。

通常IRCは接続している間の発言しか見ることができません。

tiarra-ssl-no-tiarra.png

が、サーバーにクライアントを常駐させ、 そのクライアントに対してローカルのクライアントを接続することによって、 ローカルなクライアントから接続していない状態の発言も拾うことができるようになります。

tiarra-ssl-with-tiarra.png

SSL 接続したい!

便利な tiarra なのですが、いまのところ SSL 接続をサポートしていません。 SSL で接続できないと・・・

  • IRC の発言は平文でやりとりされるので、不安。
  • SSL 接続を要求する IRC サーバーに接続できない。

これはちょっと困る。

と、いうことで、今回は stone を使って tiarra の通信を SSL 化してみます。

必要なもの

せっかくなのでゼロの状態からセットアップする方法を説明します。 今回使うものはこちら。

  • tiarra を常駐させるためのサーバー
    • screen
    • stone
    • tiarra
  • ローカルなPC
    • LimeChat

本記事の説明では、サーバーは CentOS 5.5、ローカルPCは Mac OSX 10.6 を使用しています。

[server] screen のインストール

いろいろ多機能な screen ですが、 今回は tiarra その他を起動しっぱなしにするために使います。

$ yum install screen

~/.screenrc に設定を書けば、自分好みにカスタマイズできますが、 とりあえずデフォルトのままで使うことにします。

[server] stone のインストール

stone は任意のポートからポートへトンネルを作ることができるアプリケーションです。 これを使って tiarra がおこなう外部との通信を SSL を使ったものに変換します。

tiarra-ssl-tonnel.png

wget して make したのちに stone コマンドをパスの通ったディレクトリに放り込みます。

$ cd ~/src
$ wget http://www.gcd.org/sengoku/stone/stone-2.3e.tar.gz
$ tar zxvf stone-2.3e.tar.gz 
$ cd stone-2.3d-2.3.2.7
$ make linux-ssl
$ sudo cp stone /usr/local/bin/

[server] tiarra のインストール

SVN リポジトリからもらってきましょう。

$ cd ~/
$ svn co http://svn.coderepos.org/share/lang/perl/tiarra/trunk/ tiarra

場所はどこでもいいんですが、とりあえずホームディレクトリに置くことにします。

[local] LimeChat をインストール

Windows 版は http://limechat.net/ から、 Mac 版は http://limechat.net/mac/ja.html から、それぞれダウンロードできます。

諸々の設定

stone 経由で tiarra を使うための設定をしていきます。

screen を起動

まずは screen を起動しましょう。

$ screen -S tiarra

「tiarra という名前で screen を起動する」という意味です。 screen を起動している状態で、

$ screen -d

とすれば、現在行っている作業をそのままにして、screen を抜けることができます。 この状態であればサーバーからログアウトしても screen 上で行っていた処理は実行され続けます。

再び screen に戻る場合は次のようにします。

$ screen -r tiarra

もし -S でつけた名前がわからなくなってしまった場合は、

$ screen -ls

とすれば、名前をつけた screen の一覧が出てきます。

stone の設定

証明書の作成

SSL で通信を行うためには証明書が必要なので、これをつくります。

$ cd /etc/pki/tls/certs
$ sudo make stone.pem
Country Name (2 letter code) [GB]: JP
State or Province Name (full name) [Berkshire]: Kanagawa
Locality Name (eg, city) [Newbury]: Kamakura
Organization Name (eg, company) [My Company Ltd]: Private
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:

トンネル作成

  • IRC サーバー ⇔ tiarra
  • tiarra ⇔ LimeChat

の、2つのトンネルを作る必要があります。 つくる前に screen で新しいウィンドウを作っておきます。 新しいウィンドウをつくるコマンドは、 Ctrl + a c (Ctrl + a を押したあとに c を押す) です。

$ su
# stone irc.example.com:6667/ssl 6669 &
# stone localhost:6667 6668/ssl &

ひとつは IRC サーバーと tiarra の間のトンネル。 6667 は IRC サーバーのポート(IRC サーバーに合わせて変更してください)、 6669 が tiarra から参照するIRC サーバーのポート(実際はローカルのポート)です。 irc.example.com は IRCサーバー名です。 実際のサーバーに合わせて変更してください。

もうひとつは tiarra と ローカルPCの間とトンネル。 6667 が tiarra が使うポート(あとで設定します)、 6668 がローカルPCがサーバーにつなぐときに使うポートです。

これで入り口と出口ができました。

注意点が2つ。

  • root で実行してください。sudo ではうまくいきませんでした。
  • はじめからバックグラウンドで実行してください(コマンドのあとに 「&」 をつける)。コマンドを実行してから Ctrl + z でバックグラウンドにするとうまくいきません。

トンネルを作ったら Ctrl + space ではじめのウィンドウに戻ります (Ctrl + space は「次のウィンドウに移動する」コマンドです)。

tiarra の設定

必要最低限の設定です。 サンプルの設定ファイルに詳しいコメントが書いてあるので、 その他の設定はコメントを見ながらやればできると思います。

まずはサンプル設定ファイルをコピーします。

$ cd ~/tiarra
$ cp sample.conf tiarra.conf

エディタで開いて設定します。

ニックネームの設定

IRC 上で表示される自分の名前です。 62行目付近にあります。

nick: handlename
user: handlename
name: NAGATA Hiroaki

それぞれ自分に合わせた名前に設定してください。

パスワードの設定

ローカルPCから接続する際に必要なパスワードを設定します。 まずは tiarra コマンドでパスワードをエンコードします。

$ ./tiarra --make-password
Tiarra encrypts your raw password to use it for config file.

Please enter raw password: hogehoge

Q0.IC3vB1d5Oc is your encoded password.
Use this for the general/tiarra-password entry.

上の例で言うと、

Q0.IC3vB1d5Oc

がエンコードされたパスワードです。 これを設定ファイルの92行目付近にある tiarra-password に設定します。

tiarra-password: Q0.IC3vB1d5Oc

IRCサーバーの設定

まずは IRCサーバーの名前を設定します。 227行目付近の name がそれです。

name: ircnet
name: 2ch
#name: freenode                                                                                            
#name: ustream
name: ssltest # 追加

説明のために ssltest という名前を追加してみました。 実際にはSSL接続したいサーバーの名前を書いてください。 この部分は単なる名前なので、何でもいいです。 適当にわかりやすい名前をつけておきましょう。

次に、サーバーに接続するための設定をします。

316行目付近に 2ch という設定があると思います。 その下に先ほど名前をつけた ssltest の設定を追記します。

ssltest {
    server: localhost
    port: 6669
}

server は本来IRCサーバーの名前を書く部分ですが、 今回は stone で作ったトンネルを経由して接続するので localhost と記入しています。 同じく port にはトンネルのこちら側のポートを指定しておきます。

以上で設定は終了です。

起動する

tiarra を起動しましょう。

./tiarra &

screen を抜ける

サーバー上での設定が終わったので、

$ screen -d

として screen を抜けます。 必要がなければサーバーをログアウトしてしまいましょう。

LimeChat で接続

Mac 版の LimeChat を使って説明します。 起動したら、メニューの 「Server」 → 「Server Properties ...」 からサーバー設定を開きます。

こんな感じで設定しましょう。

tiarra-ssl-lime.png

最後に、「Server」 → 「Connect」 とすれば SSL を使いつつ tiarra を経由して IRC サーバーに接続できるはずです。

おわり

これでローカルのクライアントから接続していなくても IRCが追える環境ができました。 いままで見逃していた情報が拾えるようになるってすばらしいですね!

なお、本記事を作成するにあたり、以下のサイトを参考にさせていただきました。 ありがとうございます。

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

ようやく社員紹介ページができました。nagata (@handlename) です。

先日の @soh335の記事に感化されて emacs 版を書いてみました。章立てはだいたい同じになってます。

※ elisp = emacs lisp

elispの管理

auto-install.el

URLから elisp を直接インストールすることができます。

.emacs にはこんな設定を書いておきます。

(require 'auto-install)
(add-to-list 'load-path auto-install-directory)
(auto-install-update-emacswiki-package-name t)
(auto-install-compatibility-setup)
(setq ediff-window-setup-function 'ediff-setup-windows-plain)

設定後、次のようにすると elisp をインストールします。

M-x install-elisp http://example.com/hogehoge.el

Emacs Wiki や gist からインストールすることもできます。

M-x install-elisp-from-emacswiki hogehoge.el
M-x install-elisp-from-gist <gist ID>

実行後、ダウンロードされた elisp が表示されるので、 C-c C-c とすればバイトコンパイルされて保存されます。

init-loader.el

.emacs の分割を支援する elisp です。

指定ディレクトリ内にある複数の設定ファイルをいい感じに読み込んでくれます。 以前本ブログに投稿した記事を参照してみてください。

コードを書くその前に

info-mode

info-mode で様々なドキュメントを引ける、のですが、使ってないのでリンクだけ・・・。

anything.el

ファイルオープン、コマンド実行、バッファ検索など、 異なる操作を一つのインターフェイスにまとめてくれます。

日本語の解説は開発者である rubikitch さんのエントリが詳しいです。

たとえば anything-c-moccur-occur-by-moccur を anything のソースとして設定して、 この記事の原稿を "emacs" で検索した場合。

emacs-coding-anything.png

世界、変わります。

いざコーディング

flymake.el

現在のバッファのコードを随時チェックして、エラーがある部分をハイライトしてくれます。 実行せずとも問題のある箇所がわかるので超絶便利です。 Emacs22 以降なら最初から入っています。

こんな感じでエラー箇所が表示される。

emacs-coding-flymake.png

言語毎に設定して使います。

auto-complete.el

入力中にインクリメンタルに補完候補を表示してくれます。

emacs-coding-auto-complete.png

候補表示中に C-s とすれば候補内からさらに検索してくれて便利です。

yasnippet.el

スニペット機能を提供します。

前述の auto-complete の補完候補の中に含められるので、 予備動作なしに使うことができます。

たとえば、PHPのfunction。

# -*- mode: snippet -*-
# name: public function name(...) { ... }
# --
/**
 * ${1:description}
 *
 * @param
 * @return
 */
public function ${2:name}(${3:params})
{
    $4
}

こんな感じにコメントまでスニペット中に含めておけば、 コメントを書く習慣が付くんじゃないかと思います。

anything-etags.el、anything-gtags.el

etags と gtags をつかって、プロジェクト中の関数その他にジャンプできます。

anything-etags.el と anything-gtags.el は、 タグ検索を anything のインターフェイスを使って表示するためのものです。

いちいちドキュメントを引くよりもソースをみた方が速いことは多々ありますが、 タグジャンプを使うとこの作業が劇的に楽になります。 find と grep を駆使してソースの森をさまよう必要はなくなります。

↓ symfony のプロジェクトディレクトリで候補を表示したところ

emacs-coding-gtags.png

もうこの機能がないと巨大なフレームワーク(symfonyとか)を使う気になれません。

etags と gtags の説明はこちらを参照。

auto-complete-etags.el

auto-complete-etags.el はタグファイルに登録された関数その他を auto-complete の補完リスト中に表示してくれます。 予約語以外の、プロジェクトに固有な関数なども表示してくれます。

symfony.el

ほとんど使いこなせてない・・・。

おわり

えー。勢いで書いたらただのまとめ記事になってしまいました・・・。 vim でできることは emacs でもできるよ、っていう、そういうことです(逆も然り)。

カヤックでは、エディタが好きでしょうがない技術者も募集しています!