HAPI2.0 ArmプラグインでTLSを用いてセキュアに通信する
はじめに
HAPI2.0では、データを収集するArmプラグインとHatoholサーバが、下の図のようにAMQPブローカーを介して接続されています。AMQPでは、TLSがサポートされており、それを利用するとこでセキュアにデータをHatoholサーバに送信することができます。その際、Armプラグイン・AMQPブローカー間、AMQPブローカー・Hatoholサーバの両方の経路に適用することもできますし、いずれか片方だけに使用することも可能ます。実際のネットワークやマシンの配置によって柔軟に構成できます。例えば、HatoholサーバとAMQPサーバを同じマシンに配置する場合、暗号化が不要な場合もあるでしょう。
独自に証明書を作成する場合
ここでは、HatoholのGitHubのWikiに掲載されている証明書の発行方法をベースに日本語での説明を行います。TLS証明書を他の機関などから入手する場合、それらを下の表のアウトプット列を参照に配置し、この節をスキップしてください。
以下の説明では、次の4つのホストを使用します。本稿では、いずれもCentOS 7を使用して確認しました。また、Hatoholのパッケージは16.01を使用しています。
ホスト | 説明 | 必要なパッケージ |
---|---|---|
ca | 認証局 | openssl |
hatohol | Hatoholサーバー、WebUIを実行 |
openssl |
broker | AMQPブローカー(RabbitMQ)を実行 | openssl rabbitmq-server |
node | Armプラグイン(本稿ではhap2_fluentd.py)を実行 |
openssl |
証明書作成の流れは、次のとおりです。
工程 | アウトプット |
---|---|
認証局(CA)作成 | ${HOME}/ca以下のファイル郡 |
ホストhatohol用の証明書作成 |
/etc/hatohol/key.pem /etc/hatohol/ca-cert.pem /etc/hatohol/client-cert.pem |
ホストbroker用の証明書作成 |
/etc/rabbitmq/key.pem /etc/rabbitmq/ca-cert.pem /etc/rabbitmq/server-cert.pem |
ホストnode用の証明書作成 |
~/hap-cert/key.pem ~/hap-cert/ca-cert.pem ~/hap-cert/client-cert.pem |
認証局(CA)作成
[ca] $ curl https://raw.githubusercontent.com/project-hatohol/hatohol/master/server/tools/tls/hatohol-ca-initialize.in | sh -s - --base-directory=${HOME}/ca
次のようなメッセージが表示されればOKです。
writing new private key to '/home/user/ca/CA/private/ca-key.pem'
ホストhatohol用の証明書作成
[hatohol] $
cd /etc/hatohol
[hatohol] $ curl https://raw.githubusercontent.com/project-hatohol/hatohol/master/server/tools/tls/hatohol-client-certificate-create | sudo sh
上記の操作で、key.pemとreq.pemが作成されます。req.pemをホストcaにコピーします。ホストcaのコピーされたreq.pemのあるディレクトリで、次のコマンド入力します。
[ca] $ curl https://raw.githubusercontent.com/project-hatohol/hatohol/master/server/tools/tls/hatohol-ca-sign-client-certificate.in | sh -s - --base-directory=${HOME}/ca req.pem
成功するとclient-cert.pemが作成されます。次いで、このファイルと~/ca/CA/ca-cert.pemをホストhatoholの/etc/hatoholにコピーします。最後に/etc/hatohol以下の全てのファイルの所有者をhatoholにしておきます。
[hatohol] $ sudo chown -R hatohol:hatohol /etc/hatohol
ホストbroker用の証明書作成
[broker] $ cd /etc/rabbitmq
[broker] $ curl https://raw.githubusercontent.com/project-hatohol/hatohol/master/server/tools/tls/hatohol-server-certificate-create | sudo sh
成功すると、key.pemとreq.pemが作成されます。req.pemをホストcaにコピーし、先ほどと同じように次のコマンドを実行します。
[ca] $ curl https://raw.githubusercontent.com/project-hatohol/hatohol/master/server/tools/tls/hatohol-ca-sign-server-certificate.in | sh -s - --base-directory=${HOME}/ca req.pem
成功すると、server-cert.pemが作成されます。このファイルと~/ca/CA/ca-cert.pemをホストhatoholの/etc/rabbitmqにコピーします。最後にファイルの所有者をrabbitmqにします。
[broker] $ sudo chown -R rabbitmq:rabbitmq /etc/rabbitmq/
ホストnode用の証明書作成
こちらも、ホストhatoholの時と基本的に同じです。証明書は~/hap-cert以下に格納します。
[node] $
mkdir ~/hap-cert; cd ~/hap-cert
[node] $ curl https://raw.githubusercontent.com/project-hatohol/hatohol/master/server/tools/tls/hatohol-client-certificate-create
| sh
成功すると、key.pemとreq.pemが作成されるので、これまでと同じくホストcaで下記のようにclient-cert.pemを作成し、ca-cert.pemと一緒にこのディレクトリにコピーします。
[ca] $ curl https://raw.githubusercontent.com/project-hatohol/hatohol/master/server/tools/tls/hatohol-ca-sign-client-certificate.in | sh -s - --base-directory=${HOME}/ca req.pem
HatoholサーバーとAMQPブローカー間の暗号化
ブローカー(RabbitMQ)の設定
ホストbrokerの/etc/rabbitmq/rabbitmq.configに以下の行を追加してください。デフォルトのconfigファイルとの差分はこちらです。
[
{rabbit, [
{ssl_listeners, [5671]},
{ssl_options, [
{cacertfile, "/etc/rabbitmq/ca-cert.pem"},
{certfile, "/etc/rabbitmq/server-cert.pem"},
{keyfile, "/etc/rabbitmq/key.pem"},
{verify, verify_peer},
{fail_if_no_peer_cert, false}
]}
]}
].
その後、AMQPブローカー(RabbitMQサーバ)を再起動します。
[broker] $ sudo service rabbitmq-server restart
amqpsとamqpの両方のポートが開いていればOKです。
[broker] $ netstat --tcp -a | grep amqp
tcp6 0 0 [::]:amqps [::]:* LISTEN
tcp6 0 0 [::]:amqp [::]:* LISTEN
# rabbitmqctl add_user hatohol hatohol
# rabbitmqctl add_vhost hatohol
# rabbitmqctl set_permissions -p hatohol hatohol ".*" ".*" ".*"
Hatoholサーバの設定
WebUIの「サーバ」画面で「監視サーバ追加」ボタンを押すと、ダイアログが表示されます。入力パラメータは、監視対象サーバの種類によって異なりますが、以下のダイアログのキャプチャのようにパッシブモード以下に表示されているTLS通信のためのパラメータは、どの監視サーバタイプを選んでも同じです。
次のパラメータを入力し、追加ボタンを押します。静的キューアドレスは任意の名前に変えても構いません(その場合、Armプラグイン起動時に同じものを指定してください)。
項目名 | 内容 |
---|---|
パッシブモード | チェックする |
ブローカーURL | amqps://hatohol:hatohol@broker/hatohol |
静的キューアドレス | testq |
TLSクライアント証明書のパス | /etc/hatohol/client-cert.pem |
TLSクライアントキーのパス |
/etc/hatohol/key.pem |
TLS CA証明書のパス |
/etc/hatohol/ca-cert.pem |
ArmプラグインとAMQPブローカー間の暗号化
ブローカー(RabbitMQ)の設定
前節と同じ用に設定してください。すでに設定してあれば、スキップしてください。
Armプラグインの起動
次のようにTLS関係のオプションを指定して、起動してください。黄色の部分がTLS通信のための引数です。
[node] $ sudo HAPI_AMQP_PASSWORD=hatohol /usr/libexec/hatohol/hap2/hatohol/hap2_fluentd.py --amqp-broker broker --amqp-vhost hatohol --amqp-queue testq --amqp-user hatohol --amqp-port 5671 --amqp-ssl-key ~/hap-cert/key.pem --amqp-ssl-cert ~/hap-cert/client-cert.pem --amqp-ssl-ca ~/hap-cert/ca-cert.pem --fluentd-launch "td-agent -c syslog-read.conf -q"
ホストnode上の別の端末で次のように入力するとWeb UIのイベント画面にその文字列が現れるはずです。
[node] $ logger TEST Messag by TLS
通信が暗号化されていることを簡易的に確認して見ましょう。tcpdumpを実行し、上記のコマンドを実行すると、次のような一見デタラメなメッセージが流れていることが分かります。
[node] # tcpdump -i eth0 port 5671 -X -l
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
09:30:52.732055 IP node.57674 > broker.amqps: Flags [P.], seq 2387764071:2387764156, ack 2822129364, win 275, options [nop,nop,TS val 242441178 ecr 242420338], length 85
0x0000: 4500 0089 d1f7 4000 4006 4d47 0a00 0399 E.....@.@.MG....
0x0010: 0a00 0398 e14a 1627 8e52 6367 a836 46d4 .....J.'.Rcg.6F.
0x0020: 8018 0113 1bac 0000 0101 080a 0e73 5bda .............s[.
0x0030: 0e73 0a72 1703 0300 5092 2a13 92b5 340b .s.r....P.*...4.
0x0040: 7ec3 565f 8b04 62ee 53fd cf90 8ecf 2f87 ~.V_..b.S...../.
0x0050: 0094 2301 d793 2af1 4912 4221 95dc 39d1 ..#...*.I.B!..9.
0x0060: ceab 27f5 efa5 2d50 9002 0a98 79a8 463f ..'...-P....y.F?
0x0070: 258a 0801 9c50 57a9 fc7a d027 e608 e04f %....PW..z.'...O
0x0080: d7b5 0d84 752a ef09 f4 ....u*...
09:30:52.732096 IP broker.amqps > node.57674: Flags [.], ack 85, win 608, options [nop,nop,TS val 242441178 ecr 242441178], length 0
0x0000: 4500 0034 d608 4000 4006 498b 0a00 0398 E..4..@.@.I.....
0x0010: 0a00 0399 1627 e14a a836 46d4 8e52 63bc .....'.J.6F..Rc.
0x0020: 8010 0260 1b57 0000 0101 080a 0e73 5bda ...`.W.......s[.
0x0030: 0e73 5bda .s[.
(以下、省略)
まとめ
本稿では、 ArmプラグインからHatoholサーバへデータを暗号化して送信する方法を説明しました。監視データの機密性が高い場合、是非、ご活用ください。