HAProxy with SSL on Debian

大好きなHAProxyにSSLラッパ積もうと思ったら、Debian Wheezyの標準パッケージ(といってもBackportsだけど)のバージョンが対応してなくて手間だったので、記録しておきます。

・・・1ヶ月更新が空いたのは久々にGUI含むプログラミングで外道ツール作ってるからで、やっぱインフラよりプログラミングの方が数倍楽しいのを再認識。CSSとかと戯れてると、SNSやブログなんて忘れちゃうよね!



導入の流れ

元気に開発環境として稼働しているOpenStack。VMはGlobalアドレスを持てない設計なので、携帯から見る場合はWANに接続したリバースプロキシを通すことにしていました。

当初はPoundを入れていましたが、WebSocket に対応してなかったためHAProxyに切替。
そして先日、SSLで通信したいと要望を受けて対応することに。

聞き取り調査で、こんな ↓ 通信になることを説明して、直接HTTPSを受ける必要がなくHTTPで大丈夫なのを確認。

次にHAProxyのSSL対応確認。最悪、Pound:443 で両刀使いにすれば・・・という感じで調べ、
HAProxy v1.5 からSSL機能がついててガッツポーズ!
Wheezy Backports は v1.4 でガッデム。

その辺に落ちてる v1.5 の .deb は libc6 とか openssl のバージョン依存で入らず、rebuild することになりました。


既存パッケージ

既に稼働させていたHAProxyの構築はこんな感じ。設定は割愛。

sources.list 書いて、

/etc/apt/sources.list.d/backports.list

インストールして、設定書いて反映。


パッケージ作成

1.4.x のパッケージソースを取得

debianディレクトリが欲しいだけなので、取れるなら apt-get source でもOK。

1.5 のソースを取得

最新のソースを持ってきて、1.4.x のdebianディレクトリを拝借します。

debian設定

changelog に追記します。

debian/changelog

control を気持ち変えておきます。

debian/control

rules の上部を編集します。

debian/rules

邪魔なのを消しておきます。

ビルド

このビルドに必要なパッケージを入れます。

debuild に必要なパッケージを入れます。

ビルドします。

この手順だと最後に gnupg でエラーが出ますが、.deb はできてるので突き進みます。

SSLが有効になってることを確認します。

インストール

パッケージを入れて、動作確認します。
/etc/default/haproxy は上書きされないので、haproxy.cfg の上書き拒否だけすればそのまま動くはずです。


SSL証明書の導入

ここでは適当なFQDNで書きますが、今回はわりとマジな?開発用というか、既にワイルドカード証明書が社内に落ちてたので、オレオレではなくモノホンを入れました。

証明書ファイルを作成

適当にディレクトリ作って、合体します。今回のは中間証明書もアリです。

haproxy.cfg の設定

新しく *:443 の bind を frontend に追加したら、あとは backend 関連は同じです。

/etc/haproxy/haproxy.cfg

設定反映と確認

設定を反映します。

確認します。



これでSSL必須の開発環境ドンとこいになりました。
最初の聞き取り調査で、VMにHTTPSで直接来て欲しいと言われたらLVSかな、メンドイなーと思いましたが、その場合は haproxy.cfg の mode tcp を使えば Passthrough できそうでした。

でもそれだと、VMに証明書バラまいたり、haproxy.cfg でのワイルドカード bind ができなくなるしで、あまり良いことがないのでこの構成で運用していこうと思います。