Zabbix 3.0の新機能：通信暗号化(PSK)

**注意事項**
この記事は、Zabbix 3.0が正式リリースされる前の情報ですので、正式にリリースされた際には、詳細が変更されている場合があります。ご注意ください。

# はじめに
Zabbix Advent Calendar 2015の8日目です。
Zabbix 3.0では、Zabbixの各コンポーネント(ZabbixサーバーやZabbixエージェントなど)間の通信を暗号化できる機能が追加されるようになります。

具体的には、TLS 1.2に対応した通信の暗号化と認証の機能が実現される予定なのですが、今回は、その中でもPSK(Pre-Shared Key)と呼ばれる通信を暗号化する部分のみをご紹介します。

# これまでの課題
Zabbixでは、Zabbixサーバー、Zabbixエージェント、Zabbixプロキシの間の通信は、独自のプロトコルではあるのですが、平文でアイテムの値がやり取りされるため、悪意のある人間が、ネットワークのパケットを盗み見ることで、アイテムの値の内容を見ることができてしまっていました。

社内とか部署内のLANのみで利用している場合はさほど問題にならないかもしれませんが、インターネット経由で監視を行うとなると誰に見られてしまうかわかりませんので、何らかの対策を検討すべきでしょう。
これまでであれば、SSHを利用したりstunnelを利用したりすることで、通信経路上でのセキュリティ確保を行ってきたかと思います。しかし、これらの設定を行うためには、それなりの知識が必要でした。

そこで、より容易に設定することができるよう、標準の機能として実装されることとなりました。

# 新機能概要
今回ご紹介するのは、PSK(Pre-Shared Key)という方式を利用した場合の話です。

名前の通り、事前に通信を暗号化するための鍵を共有しておき、その鍵情報を通信の設定情報内に設定しておくことで、通信の暗号化を実現する仕組みになっています。

# 設定例
それでは、ZabbixサーバーとZabbixエージェントとの間の通信を暗号化してみましょう。
今回は、CentOS 7.1.1503上でZabbix 3.0.0alpha5(Build 56900)を利用して確認してみます。

Zabbixをビルドするためにconfigureを実行する際には、「--with-gnutls」を追加するようにしてください。
暗号化通信機能が有効になったかどうかは、各プロセスの起動時のログを見て、以下のようにTLS supportがYESと出力されることを確認しておいてください。

```shell-session
 97919:20151130:124049.688 TLS support:               YES
```


## 共有鍵の生成
共有鍵を生成するには、psktoolというコマンド利用します。
そのため、gnutls-utilsパッケージをインストールしておきます。

```shell-session
# yum install gnutls-utils
```

デフォルトの鍵の長さでよければ、以下のようなコマンドを実行します。

```shell-session
$ psktool -u user1 -p passwd.psk
```

-u オプションは、生成する鍵のユーザー名を指定します。半角英数字であれば何でも構いません。
-p オプションは、生成した鍵をファイルに出力する時に利用して、-p オプションの後ろに指定したファイル名のファイルに出力されます。
-s オプションは、その後ろに指定した数字で鍵の長さを指定します。CentOS 7.1.1503の場合、0から64までが指定できました。

つまり、より長い共有鍵を生成したいのであれば、以下のようにコマンドを実行します。

```shell-session
$ psktool -u user1 -s 64 -p passwd.psk
```

これで出力されたファイルの内容は、以下のような内容になります。

```shell-session:passwd.psk
user1:2e404b787f085c1ffd3f50efada9e2ccdc4aaa38b5f3f3eb09c7e876781d47a08b674f7d4b9178c319c773c76a40335fa011c127b214d3c7fafffbfe29cc45e8
```

このユーザ名(user1)とコロン(:)から後ろの部分を今後の設定で利用します。

## Zabbixエージェント側の設定
Zabbixエージェント側は、鍵ファイルの作成とzabbix_agentd.confの変更が必要です。

鍵ファイルは、Zabbixエージェントがアクセスできる場所であればどこでも構わないのですが、/etc/zabbix/cert/zabbix_agentd.psk というファイルを作成することとします。
このファイルには、先ほど生成した鍵のコロンより後ろの部分のみを記述します。

```shell-session:/etc/zabbix/cert/zabbix_agentd.psk
2e404b787f085c1ffd3f50efada9e2ccdc4aaa38b5f3f3eb09c7e876781d47a08b674f7d4b9178c319c773c76a40335fa011c127b214d3c7fafffbfe29cc45e8
```

そして、zabbix_agentd.confの変更内容は以下の通りです。

```shell-session:zabbix_agentd.conf
TLSConnect=psk
TLSAccept=psk
TLSPSKIdentity=user1
TLSPSKFile=/etc/zabbix/cert/zabbix_agentd.psk
```

TLSConnectは、Zabbixサーバーに接続する際に平文でアクセスするのか、暗号化の機能を利用して接続するのかを指定することができます。
逆にTLSAcceptは、Zabbixサーバー側からZabbixエージェントに接続する時に暗号化するかどうかを指定することができます。
両方とも移行時には一時的に平文も許可できるようunencryptedという値をカンマ区切りで追加しておくこともできます。
今回は紹介しませんが、certと指定すると証明書での認証が行われるようになります。

TLSPSKIdentityには、鍵生成時に指定したユーザー名を指定します。
TLSPSKFileには、鍵の部分のみを保存したファイルを指定します。

## Zabbixサーバー側の設定
Zabbixサーバー側では、Webインターフェースを利用して、そのホストの設定変更で暗号化の情報を設定します。

対象となるホストの設定を開いて、「暗号化」タブを選択してください。

デフォルトでは以下のように暗号化なしの設定になっています。

![enc-tab1.png](https://qiita-image-store.s3.amazonaws.com/0/101989/f7b1a535-e1bc-af3a-2353-006426092577.png)


今回は、ZabbixサーバーとZabbixエージェントとの間を双方向でPSKを利用した暗号化を行いたいので、PSKを利用するよう以下のように設定を行います。

![enc-tab2.png](https://qiita-image-store.s3.amazonaws.com/0/101989/90fad6bb-b686-f3c9-8cfb-e47ec6cc40f9.png)


Zabbixエージェント側とZabbixサーバー側の設定が終了したら、Zabbixエージェントを再起動してください。
通信が暗号化された状態で監視を継続した状態になるはずです。

ホスト一覧の右側の表示も以下のようになります。

![enc-psk-on.png](https://qiita-image-store.s3.amazonaws.com/0/101989/ae806357-729d-54fa-dad0-e8ee2451521f.png)


うまく接続できない場合は、ログファイルにメッセージが出力されますので、必ずログを確認するようにしてください。

余裕のある方は、暗号化する前と後とでやり取りされるパケットの内容を確認してみてください。以前は平文でやり取りされていたものが、そのままでは読めない記号でのやり取りになっていることが確認できるはずです。

# 注意事項
ホストの通信を暗号化したものだけに限定した場合、zabbix_getを利用した値取得の確認や、zabbix_senderなどで送り込んでいたデータも暗号化してやり取りすることが必要になりますのでご注意ください。
コマンドに、それ用のオプションが追加されています。

これで通信を暗号化できるのですが、より厳密に特定のサーバーと接続して監視環境を構築したい場合には、今回紹介できなかった証明書を発行したサーバーからのみ接続させる機能も用意されています。
この認証の機能詳細は、また改めてご紹介しようと思います。


# 参考
[Zabbix 3.0マニュアル：16. Encryption](https://www.zabbix.com/documentation/3.0/manual/encryption)
[Zabbix の通信を stunnel を使って暗号化する](http://www.rack.sh/zabbix-ssl-stunnel/)


次は、前佛さんですね。
よろしくお願いします。