2013/05/05

RaspberryPiでLVS+keepalivedを使ってHA構成にしてみた

RaspberryPiは手軽なLinux実行環境ですが、定格で5V/700mAが必要です。 古いPCやUSBハブに接続した場合には、うまく動かない可能性があります。

iPadやタブレットで充電に1000mA(==1A)が必要な状況なので、それほどUSBの電源周りも余裕のある設計になっているものも多くあるはずです。

とはいえ、USB2の定格は5V/500mAなので古めのPCや電源付きUSBハブにいろいろな機器を接続した場合には動作が不安定になる可能性があります。

またカーネルに3.6-trunk-rpiを選択した時には、2013年5月5日時点では、ファイルシステムに負荷をかけるようなタイミングでBUG: scheduling while atomic: swapper/...のエラーが出てまともに動きませんでした。

対応linuxカーネルの有効化

基本的な環境はarmelhfアーキテクチャのRaspbian "wheezy" をインストールした状態です。

Raspbianのカーネルは3.6.11#371版ですが、ip_vsモジュールなどは導入されていません。

このためパッケージからip_vsモジュールの含まれているイメージを導入します。

$ sudo apt-get install linux-image-3.2.0-4-rpi
起動時のカーネルイメージの変更

linux-image-*パッケージを導入しただけでは、再起動をしても引き続きRaspbianの付属カーネルが使われます。 ポイントは次のとおりです。

  • zImageを/boot/kernel.imgのファイル名でコピーする
  • initrdイメージがある場合は/boot/config.txtに記入する
/boot/kernel.imgファイルの置き換え

既存のkernel.imgファイルは退避して、vmlinuz-3.6-trunk-rpiファイルをコピーします。

$ cd /boot
$ sudo mv kernel.img kernel.3.6.11#371.img
$ sudo cp vmlinuz-3.2.0-4-rpi kernel.img

ちなみに/bootはvfatなので、ハードリンクなどを使う事はできません。 基本的にはcopyで対応することになります。

/boot/config.txtファイルの書き換え

initrdを使用している場合には、対象のファイル名をconfig.txtに書き換えます。

...
ramfsfile=initrd.img-3.2.0-4-rpi
ramfsaddr=0x00a00000
initramfs initrd.img-3.2.0-4-rpi 0x00a00000
...

ちゃんと確認していませんが、/bootにあるものとしてファイル名だけを記述しています。

再起動でカーネルの確認

とりあえず再起動して動作を確認します。

うまく行かない場合には別のPCに接続して編集内容を確認します。 /boot以下はVFAT領域なので、問題なく扱えるはずです。

ramfsaddrなどを指定しないと、initrdのイメージが展開されない事になります。 うまくいけばdmesgに次のようなメッセージが表示されます。

$ dmesg | grep init
...
[    1.049760] Unpacking initramfs...
[    1.710015] Freeing initrd memory: 4476K
...

パッケージの導入

ipvsadmとkeepalivedを使いますが、ipvsadmはkeepalivedの導入時に自動的にインストールされます。

keepalivedの導入

パッケージを導入します。

$ sudo apt-get install keepalived

設定

パッケージを導入しても設定ファイルは一切導入されないので、過去のログをみながら設定ファイルを構成します。

/etc/keepalived/keepalived.confの編集

今回はWebサーバではなくて、ESXi上に構成しているLDAPサーバに対してHA構成を取っています。

振り先の設定

LDAPサーバ側にいくつか設定が必要です。

/etc/sysctl.confの編集

対象サーバが1台しかない場合には、問題になりませんが、複数のslave LDAPサーバに処理を分散させるような場合にはサービス(仮想)IPとMACアドレスが強力に結びついてしまうと、ルータからダウンしたLDAPサーバに常に処理が振られてしまうのでARPリクエストに反応しないように変更する必要があります。

/etc/sysctl.confへの追加内容

net.ipv4.conf.eth0.arp_ignore=1
net.ipv4.conf.eth0.arp_announce=2

設定を反映させます。

$ sudo sysctl -p

sysctlコマンド実行後の画面出力

net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
サービス(仮想)IPの設定

IPレベルではリクエストは2台のRaspberryPiで共有されるサービス用の(仮想)IP宛てのパケットがLDAPサーバに到着します。

自分宛てのパケットだと認識しないといけないので、loopback(lo)にIPを設定します。 まだ未使用のlo:0デバイスを使います。他に使用している場合には、lo:1,lo:2など適当な番号に変更してください。

/etc/network/interfacesファイルへの追加内容

auto lo:0
iface lo:0 inet static
  address 192.168.1.182
  netmask 255.255.255.255

さいごに

RaspberryPiを入手して、いろいろ試していますが、電源の品質とカーネルの安定性が一番の問題でした。

電源はUSBハブから取っていますが、マウス、キーボードなどは本体に直接つないで他の機器はつないでいません。

PCなどに接続する場合には、2つ口の片側に接続する事で500mA 2つ分の1000mAまで電流が取れるものが多いようです。 最近ではiPadやタブレットに対応した急速充電可能なタイプであれば、1000mAまで取れるので問題ないでしょう。

SDカードはTranscendのClass10 UHS-I対応16GBと、PanasonicのClass 10 SDHC 8GBのカードを使っています。 他のARM系ボードでも使っていますが、これまでのところ問題は起きていません。

この他にも$ sudo raspi-configで変更できるパラメータは少し変更していて、安定して動くようになってから900MHzへのオーバークロックやVRAMを16Mに変更したり、

tail -5 /boot/config.txtの実行結果

# for more options see http://elinux.org/RPi_config.txt
gpu_mem=16
core_freq=250
sdram_freq=450
over_voltage=2

この記事で取り上げた品々

2013/05/04

namecheapで購入したWildcardSSL証明書をOpenLDAPにインストールしてみた

これまで389ポートで運用してきたESXi 5.1上のOpenLDAPサーバにSSL証明書を適用してみました。

実際のところnamecheapは関係なくて、SSL証明書をどこで購入したのかは問題ではなくて、root CAや中間CA証明書の有無などが問題だったりします。

今回利用する証明書の構成や、対象サーバの環境は以下の通りです。

  • OS: Ubuntu 12.04 LTS 64bit版
  • SSL root CA Issuer: C=SE, O=AddTrust AB, OU=AddTrust External TTP Network, CN=AddTrust External CA Root
  • SSL Issuer: C=GB, ST=Greater Manchester, L=Salford, O=COMODO CA Limited, CN=PositiveSSL CA 2

最近は4階層のSSL証明書も普通にありますが、PositiveSSLの中間CA証明書は1つだけの3階層です。 4階層はテストしていませんが、c_rehashコマンドでハッシュファイルへのシンボリックリンクを作成するところを外さなければ、問題なく扱えるはずです。

ファイルの準備

SSL関連の操作ではファイル名は任意なのですが、扱うファイルの数は多い傾向があります。

まぎらわしいので参考のためにリストにしておきます。

  • WildcardSSL.crt: CN=*.example.com(Subject: OU=Domain Control Validated, OU=PositiveSSL Wildcard, CN=*.example.com)
  • PositiveSSLCA2.crt: 証明書 (Subject: C=GB, ST=Greater Manchester, L=Salford, O=COMODO CA Limited, CN=PositiveSSL CA 2)
  • AddTrustExternalCARoot.crt: CA証明書 (Subject: C=SE, O=AddTrust AB, OU=AddTrust External TTP Network, CN=AddTrust External CA Root)
  • newkey.nopass.pem: パスワードで保護されていないWildcardSSL.crtに対応する鍵ファイル
  • rootca.crt: PositiveSSLCA2.crt + AddTrustExternalCARoot.crtの2つのファイルが連結された単一CA証明書ファイル

*.crtファイルの内容は全て-----BEGIN CERTIFICATE-----で始まるので紛らわしいかと思います。 以下のコマンドで-inオプションの引数にファイルを指定すると中身を確認することができるので便利です。

$ openssl x509 -text -noout -in <cert filename>
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            6f:c7:b2:c6:af:e4:cc:a6:d3:61:4b:1f:6d:56:be:fd
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=GB, ST=Greater Manchester, L=Salford, O=COMODO CA Limited, CN=PositiveSSL CA 2
        Validity
            Not Before: Dec 13 00:00:00 2012 GMT
            Not After : Dec 13 23:59:59 2014 GMT
...

newkey.nopass.pemファイルは-----BEGIN RSA PRIVATE KEY-----で始まるファイルで、パスワードで保護されていない形式です。

パスワードを外す方法はnewkey.pemがパスワードで保護された鍵ファイルだとして、$ openssl rsa < newkey.pem > newkey.nopass.pemのような要領で作成する事ができます。

ファイルの配置

準備したファイルをOpenLDAPサーバ上に配置していきます。

今回はUbuntuなのでシステムで準備している/etc/ssl/certs, /etc/ssl/privateがありますが、クライアント認証をするわけでもなくシステムデフォルトと一線を引いて管理するためにファイルの配置場所は別に準備します。

$ sudo mkdir -p /opt/openldap/ssl
$ sudo cp WildcardSSL.crt /opt/openldap/ssl
$ cat PositiveSSLCA2.crt AddTrustExternalCARoot.crt | sudo tee /opt/openldap/ssl/rootca.crt
$ sudo c_rehash /opt/openldap/ssl/
$ sudo chgrp openldap /opt/openldap/
$ sudo chmod 750 /opt/openldap/

ESXiサーバのシェルの場合などはc_rehashコマンドが準備されていない事もありますが、手動でのリンク管理は面倒なので利用しています。

うまくいくと、次のような内容の/etc/openldap/sslディレクトリが作成できてるはずです。

sudo $ sudo ls -l /opt/openldap/ssl
lrwxrwxrwx 1 root root   22 May  4 18:35 459f9267.0 -> WildcardSSL.crt
lrwxrwxrwx 1 root root   10 May  4 18:35 5f852f3e.0 -> rootca.crt
lrwxrwxrwx 1 root root   10 May  4 18:35 ed207a3e.0 -> rootca.crt
lrwxrwxrwx 1 root root   22 May  4 18:35 f8a2c70e.0 -> WildcardSSL.crt
-rw-r--r-- 1 root root 1679 May  4 18:27 newkey.nopass.pem
-rw-r--r-- 1 root root 3278 May  4 18:34 rootca.crt
-rw-r--r-- 1 root root 1801 May  4 18:09 WildcardSSL.crt

設定ファイルの変更

必要なファイルを配置したら、Openldapの設定ファイルの変更です。

Ubuntu 12.04 LTSでのopenldapの設定ファイルは/etc/ldap/slapd.d以下でLDAP管理となっています。 そのためファイルを編集するという分けにはいきません。

設定方法は、help.ubuntu.comのOpenLDAP TLS設定方法のページに詳しく掲載されています。

このページに書かれているように、LDIFファイル(/tmp/modify.tls.ldif)を作成してldapmodifyコマンドで実行していきます。

/tmp/modify.tls.ldifファイルの内容

dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /opt/openldap/ssl/rootca.crt
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /opt/openldap/ssl/WildcardSSL.crt
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /opt/openldap/ssl/newkey.nopass.pem
$ sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/modify.tls.ldif
/etc/default/slapdの編集

slapdがサポートするプロトコルを指定する行に、ldaps:///を追加します。

/etc/default/slapdの変更個所抜粋

...
SLAPD_SERVICES="ldap:/// ldaps:/// ldapi:///"
...
APPARMOR対応

標準となっている/etc/ssl/ディレクトリ以下にアクセスする事がapparmorによって拒否されるため、今回はディレクトリを/etc/apparmor.d/local/usr.sbin.slapdに追加しました。

/etc/apparmor.d/local/usr.sbin.slapdファイルの内容

# Site-specific additions and overrides for usr.sbin.slapd.
# For more details, please see /etc/apparmor.d/local/README.

/opt/openldap/ r,
/opt/openldap/** r,

dh_apparmorパッケージをインストールしたのですが、うまく動かないのでシステム全体を再起動します。

$ sudo /sbin/shutdown -r now

稼働確認

ポートの確認

netstatで636ポートが開いている事を確認します。

$ netstat -nl | egrep '389|636' 
tcp        0      0 0.0.0.0:636             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:389             0.0.0.0:*               LISTEN     
tcp6       0      0 :::636                  :::*                    LISTEN     
tcp6       0      0 :::389                  :::*                    LISTEN
ldapsによるクエリの実行

実際のクエリはDNなどを含むので、slapdumpなどでディレクトリの構造を把握しておく事が必要です。

$ openldap -x -H ldaps://openldap.example.com:636/ -b uid=user01,ou=People,dc=example,dc=com

もしホスト名をopenldap.example.comではなくlocalhostのように指定した場合には、SSLのCommonName(CN)に指定されているホスト名(*.example.com)との対応が取れずにエラーとなります。

$ ldapsearch -x -H ldaps://localhost:636/ -b uid=user01,ou=People,dc=example,dc=com
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)

localhostの部分をlocalhost.example.comのようにCNと対応するFQDNにすれば、正常に稼働します。

$ ldapsearch -x -H ldaps://localhost.example.com:636/ -b uid=user01,ou=People,dc=example,dc=com
# extended LDIF
#
# LDAPv3
...

まとめ

WildcardSSL証明書はけっこう便利です。 PDFファイルの署名にも論理的には使えますが、CA情報が登録されていないので適切な署名とはみてもらえません。

SSL接続時に警告が出るのはマルウェアなどでサイト誘導されているという認識を持たないと、まったく意味がないのですが、残念ながら世間では、この悪い常識が闊歩しているところもあります。

仕事など、責任を伴なう場面では、積極的にSSL化を勧めて環境を整備しましょう。