大好きなHAProxyにSSLラッパ積もうと思ったら、Debian Wheezyの標準パッケージ(といってもBackportsだけど)のバージョンが対応してなくて手間だったので、記録しておきます。
・・・1ヶ月更新が空いたのは久々にGUI含むプログラミングで外道ツール作ってるからで、やっぱインフラよりプログラミングの方が数倍楽しいのを再認識。CSSとかと戯れてると、SNSやブログなんて忘れちゃうよね!
導入の流れ
元気に開発環境として稼働しているOpenStack。VMはGlobalアドレスを持てない設計なので、携帯から見る場合はWANに接続したリバースプロキシを通すことにしていました。当初はPoundを入れていましたが、WebSocket に対応してなかったためHAProxyに切替。
そして先日、SSLで通信したいと要望を受けて対応することに。
聞き取り調査で、こんな ↓ 通信になることを説明して、直接HTTPSを受ける必要がなくHTTPで大丈夫なのを確認。
1 |
Mobile ==|HTTPS|==> HAProxy(復号化)==|HTTP|==> VM |
次に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 |
deb http://ftp.debian.org/debian/ wheezy-backports main contrib non-free |
インストールして、設定書いて反映。
1 2 3 4 5 6 7 8 |
apt-get update apt-get install haproxy sed -i -e 's/ENABLED=0/ENABLED=1/g' /etc/default/haproxy vim /etc/haproxy/haproxy.cfg haproxy -c -f /etc/haproxy/haproxy.cfg /etc/init.d/haproxy reload |
パッケージ作成
1.4.x のパッケージソースを取得
debianディレクトリが欲しいだけなので、取れるなら apt-get source でもOK。
1 2 3 4 5 6 |
cd /usr/local/src mkdir haproxy-1.4.8 cd haproxy-1.4.8 wget https://launchpad.net/ubuntu/maverick/+source/haproxy/1.4.8-1/+files/haproxy_1.4.8-1.debian.tar.gz tar xzf haproxy_1.4.8-1.debian.tar.gz |
1.5 のソースを取得
最新のソースを持ってきて、1.4.x のdebianディレクトリを拝借します。
1 2 3 4 5 6 7 8 9 10 |
cd ../ mkdir haproxy-1.5 cd haproxy-1.5 wget http://haproxy.1wt.eu/download/1.5/src/snapshot/haproxy-ss-LATEST.tar.gz tar xzf haproxy-ss-LATEST.tar.gz mv haproxy-ss-20131105 haproxy-dev19 cd haproxy-dev19 cp -a ../../haproxy-1.4.8/debian . |
debian設定
changelog に追記します。debian/changelog
1 2 3 4 5 |
haproxy (1.5-dev19) unstable; urgency=low * Custom built package for GedowFather -- GedowFather Tue, 05 Nov 2013 12:34:56 +0100 |
control を気持ち変えておきます。
debian/control
1 |
Maintainer: GedowFather |
rules の上部を編集します。
debian/rules
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!/usr/bin/make -f MAKEARGS=DESTDIR=debian/haproxy \ PREFIX=/usr \ IGNOREGIT=true \ MANDIR=/usr/share/man \ DOCDIR=/usr/share/doc/haproxy \ USE_PCRE=1 \ USE_STATIC_PCRE=1 \ USE_OPENSSL=1 \ USE_ZLIB=1 ifeq ($(shell dpkg-architecture -qDEB_HOST_ARCH_OS),linux) MAKEARGS+= TARGET=linux2628 \ CPU=native else MAKEARGS+= TARGET=generic endif ifeq ($(shell dpkg-architecture -qDEB_HOST_ARCH_CPU),i386) MAKEARGS+= USE_REGPARM=1 endif |
邪魔なのを消しておきます。
1 |
rm ./debian/source/format |
ビルド
このビルドに必要なパッケージを入れます。
1 |
apt-get install quilt |
debuild に必要なパッケージを入れます。
1 2 3 4 5 6 7 8 |
apt-get install \ build-essential \ devscripts \ dh-make \ fakeroot \ autotools-dev \ lintian \ gnupg |
ビルドします。
1 2 3 |
debian/rules clean debian/rules debuild |
この手順だと最後に gnupg でエラーが出ますが、.deb はできてるので突き進みます。
SSLが有効になってることを確認します。
1 |
ldd haproxy | grep ssl |
インストール
パッケージを入れて、動作確認します。/etc/default/haproxy は上書きされないので、haproxy.cfg の上書き拒否だけすればそのまま動くはずです。
1 2 3 4 5 |
cd ../ dpkg -i haproxy_1.5-dev19_amd64.deb lsof -i:80 # 他、適当にブラウザからアクセス |
SSL証明書の導入
ここでは適当なFQDNで書きますが、今回はわりとマジな?開発用というか、既にワイルドカード証明書が社内に落ちてたので、オレオレではなくモノホンを入れました。証明書ファイルを作成
適当にディレクトリ作って、合体します。今回のは中間証明書もアリです。
1 2 3 4 5 6 7 8 |
mkdir -m0700 /etc/haproxy/ssl cd /etc/haproxy/ssl vim gedow.net-key.pem vim gedow.net-cert.pem vim ca.pem cat gedow.net-key.pem gedow.net-cert.pem ca.pem > gedow.net.pem |
haproxy.cfg の設定
新しく *:443 の bind を frontend に追加したら、あとは backend 関連は同じです。/etc/haproxy/haproxy.cfg
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
global log 127.0.0.1 daemon notice user haproxy group haproxy daemon quiet maxconn 2000 defaults log global mode http balance roundrobin retries 3 contimeout 5000 clitimeout 600000 srvtimeout 600000 option tcpka option httpclose option httplog option dontlognull option forwardfor errorfile 400 /etc/haproxy/errors/400.http errorfile 403 /etc/haproxy/errors/403.http errorfile 408 /etc/haproxy/errors/408.http errorfile 500 /etc/haproxy/errors/500.http errorfile 502 /etc/haproxy/errors/502.http errorfile 503 /etc/haproxy/errors/503.http errorfile 504 /etc/haproxy/errors/504.http frontend openstack-proxy bind *:80 default_backend default acl gedowfather-test hdr(host) -i gedowfather.gedow.net use_backend gedowfather-test if gedowfather-test frontend openstack-proxy-ssl bind *:443 ssl crt /etc/haproxy/ssl/gedow.net.pem reqadd X-Forwarded-Proto:\ https default_backend default acl gedowfather-test hdr(host) -i gedowfather.gedow.net use_backend gedowfather-test if gedowfather-test backend default server gedowfather-debian7-01 172.30.16.11:80 backend gedowfather-test server gedowfather-debian7-01 172.30.16.11:80 |
設定反映と確認
設定を反映します。
1 2 |
haproxy -c -f /etc/haproxy/haproxy.cfg /etc/init.d/haproxy reload |
確認します。
1 2 3 4 5 6 7 8 9 10 |
# ポートの確認 lsof -i:80 lsof -i:443 # 接続確認 curl -k -L -I https://localhost HTTP/1.1 200 OK ... # ブラウザでも確認 |
これでSSL必須の開発環境ドンとこいになりました。
最初の聞き取り調査で、VMにHTTPSで直接来て欲しいと言われたらLVSかな、メンドイなーと思いましたが、その場合は haproxy.cfg の mode tcp を使えば Passthrough できそうでした。
でもそれだと、VMに証明書バラまいたり、haproxy.cfg でのワイルドカード bind ができなくなるしで、あまり良いことがないのでこの構成で運用していこうと思います。