現在位置: ホーム / みらくるブログ / HAPI2.0 ArmプラグインでTLSを用いてセキュアに通信する

HAPI2.0 ArmプラグインでTLSを用いてセキュアに通信する

ZABBIXなどの監視データのHatoholサーバへ転送において、HAPI2.0ではTLSによる暗号化通信がサポートされています。本稿ではその手順を紹介します。

はじめに

HAPI2.0では、データを収集するArmプラグインとHatoholサーバが、下の図のようにAMQPブローカーを介して接続されています。AMQPでは、TLSがサポートされており、それを利用するとこでセキュアにデータをHatoholサーバに送信することができます。その際、Armプラグイン・AMQPブローカー間、AMQPブローカー・Hatoholサーバの両方の経路に適用することもできますし、いずれか片方だけに使用することも可能ます。実際のネットワークやマシンの配置によって柔軟に構成できます。例えば、HatoholサーバとAMQPサーバを同じマシンに配置する場合、暗号化が不要な場合もあるでしょう。

AMQPブローカーを使ったTLSでの暗号化

独自に証明書を作成する場合

ここでは、HatoholのGitHubのWikiに掲載されている証明書の発行方法をベースに日本語での説明を行います。TLS証明書を他の機関などから入手する場合、それらを下の表のアウトプット列を参照に配置し、この節をスキップしてください。

以下の説明では、次の4つのホストを使用します。本稿では、いずれもCentOS 7を使用して確認しました。また、Hatoholのパッケージは16.01を使用しています。

ホスト説明必要なパッケージ
ca 認証局 openssl
hatohol Hatoholサーバー、WebUIを実行

openssl
hatohol-server
hatohol-web

broker AMQPブローカー(RabbitMQ)を実行 openssl
rabbitmq-server
node Armプラグイン(本稿ではhap2_fluentd.py)を実行

openssl
hatohol-hap2-fluentd

証明書作成の流れは、次のとおりです。

工程アウトプット
認証局(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
RabbitMQサーバにユーザーhatohol(パスワード:hatohol)が仮想ホストhatoholにアクセス可能なように設定されていることを前提に、以下では説明します。設定されていない場合次のコマンドを実行してください。
# rabbitmqctl add_user hatohol hatohol
# rabbitmqctl add_vhost hatohol        
# rabbitmqctl set_permissions -p hatohol hatohol ".*" ".*" ".*"

Hatoholサーバの設定

 WebUIの「サーバ」画面で「監視サーバ追加」ボタンを押すと、ダイアログが表示されます。入力パラメータは、監視対象サーバの種類によって異なりますが、以下のダイアログのキャプチャのようにパッシブモード以下に表示されているTLS通信のためのパラメータは、どの監視サーバタイプを選んでも同じです。

hatohol-tls-add-server.png

次のパラメータを入力し、追加ボタンを押します。静的キューアドレスは任意の名前に変えても構いません(その場合、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
上記のArmプラグインの起動時に黄色の文字列の部分を省略すれば、平文(amqp)で通信が行われます。

通信が暗号化されていることを簡易的に確認して見ましょう。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サーバへデータを暗号化して送信する方法を説明しました。監視データの機密性が高い場合、是非、ご活用ください。