zabbixの通信の暗号化について

zabbixの通信暗号化を試行しております。
参考としてふりっぱぁ様作成の下記資料を使用させていただいております。
URL:http://www.rack.sh/zabbix-ssl-stunnel/

やりたいことの要点としては以下になります。
 (1)zabbix_serverとzabbix_agent間の通信をstunnelを使用して暗号化する(zabbix_proxy不使用)
 (2)設定後、暗号化されているかどうか確認をする

現在、(1)の設定を実施し、zabbix webからagentと疎通できていることを確認し、
(2)のためにzabbix_serverに設定されているstunnelの待ち受けに設定した port 11051をtcpdumpしましたが、
agentから送付されてきた情報が暗号化されていない状況です。
当方、zabbix自体も触ったばかりで、zabbixの設定ミスなのか、stunnelの設定ミスなのか切り分けが難しいです。

ご教授頂きたい点としては以下です。
 →zabbix_agentd.confファイルの"server"は127.0.0.1にする必要があるか
   (現状はserver='zabbix_serverのIP'、ServerActive=127.0.0.1にしてあります。)
 →暗号化の確認の仕方としてport11051のtcmdump取得であっているか
   (実際使用したコマンド:#tcpdump -i eth0 -s 0 -w 'filename' port 11051)

環境は以下です。
   OS :CentOS6.6 64bit(両ホスト共通)
導入 :zabbix、stunnelともにyumでのインストール
ver :zabbix 2.2.8(server,agent)
stunnel 4.29-3

お手数ですがアドバイス宜しくお願い致します。

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー fripper の写真

参考にしていただいてありがとうございます。
不明点あればどんどんとご意見戴ければと思います

エージェント=サーバ間の通信は、アイテムのタイプによって、おおきく以下に分かれます
・通常のエージェント型のアイテム
  →サーバ側からエージェントに「収集の要求」が行って、エージェントがそれに応答する
・エージェント(アクティブ)型・ログ監視等のアイテム
  →エージェント起動時、および一定間隔で、エージェントがサーバに
   「収集すべき項目リスト」を要求して取得
   その後、エージェントが自発的に収集動作を行って、結果をサーバに向けてプッシュ

全てを「アクティブ」型のアイテムに統一できるならば、通信の要求は
すべて「エージェント側で発生、行先はサーバ」となるので、簡単なのですが‥

まず、スライドの P7 の図のように、相互で暗号化・復号を組み込む必要があります

◆agentd.conf
Server=127.0.0.1   →  zabbix_agentdにとっては、自ホスト上のstunnelの待ち受けがzabbix_server
ListenIP=127.0.0.1  →  自ホスト上のstunnelが復号した通信が接続できれば良いので
ListenPort=10050   →  zabbix_serverからの直要求ではなく、自ホスト上のstunnelが復号したデータを受ける窓口
ServerActive=127.0.0.1:10150  →自ホスト上のstunnelがzabbix_serverへの接続を媒介してくれるので、それの待ち受けポート

◆エージェント側のstunnel.conf
[zabbix-ssl-atos]       → agentd から発生した通信を暗号化してサーバ上のstunnelへ向ける設定
client = yes
accept = 127.0.0.1:10150
connect = xxx.xxx.xx.xx:10151  → server ホストの外側IP

[zabbix-ssl-stoa]      → server から発生した通信を復号して自ホスト上のagentdへ向ける設定
client = no
accept = 10151
connect = 127.0.0.1:10051

◆server.conf
ListenIP=127.0.0.1
ListenPort=10051

◆server側のstunnel.conf
[zabbix-ssl-atos]      → agentdから発生した通信を復号して自ホスト上のserverへ向ける設定
client = no
accept = 10151
connect = 127.0.0.1:10051

[zabbix-ssl-stoa-01]       → server から発生した通信を暗号化してagentdホスト上のstunnelへ向ける設定
client = yes
accept = 127.0.0.1:10150
connect = xxx.xxx.xx.xx:10151  → agentdホストの外側IP

といった感じでしょうか‥。

proxy が挟まる場合には、proxy=server 間の通信は、基本的にproxy発server行の通信だけですので、
server側から発生する通信に関する設定は要らなくなります

agentd 直結の場合、相互方向に暗号化しなくてはいけなくなるので、監視対象ホストが増えれば増えるほど
server 側の stunnel に [zabbix-ssl-stoa-XXX] エントリを増やさないと対応できなくなってしまいます‥

ユーザー fripper の写真

肝心な部分を書き忘れていました‥

serverに対して、agentd の動作しているホスト(監視対象)を登録する際の「インターフェース」情報の部分は

server→agentd へ向けての通信を媒介するstunnel の待ち受け情報を入力しなくてはいけません
上の例ですと、[zabbix-ssl-stoa-01] のaccept 設定に書かれている「127.0.0.1:10150」となります

監視対象が増えると、stoa-02 / 03 / ・・・と増やすしか、完全な方法はありません

もしくは、全てのアイテム設定を「アクティブ」に設定してしまって、「サーバ→エージェント」方向の通信を
皆無にするか‥
いずれにしても微妙なのは事実です‥

近日にリリースが予告されている zabbix 3.0 では、標準で、通信路の暗号化サポートが為されるようです
期待したいところですね

ユーザー kaeru の写真

ご回答ありがとうございます。
頂いた内容を基に設定変更を行いましたが、zabbixWebのエージェントステータスが
赤(Get value from agent failed: ZBX_TCP_READ() failed: [104] Connection reset by peer)になってしまいます。
各設定ファイルですが、間違っている点、おかしな点がありますでしょうか?

※以下のコマンドで抜粋
#grep -v -e '#' -e '^$' 'filename'

◆zabbix-agentホスト◆
【zabbix_agentd.conf】
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=127.0.0.1
ListenPort=10050
ListenIP=127.0.0.1
ServerActive=127.0.0.1:10150
Hostname=zabbix2
AllowRoot=1
Include=/etc/zabbix/zabbix_agentd.d/

【stunnel.conf】
cert = /etc/stunnel/server.pem
key = /etc/stunnel/server.pem
fips = no
[zabbix-ssl-atos]
client = yes
accept = 127.0.0.1:10150
connect = 'zabbix_serverのIP':10151
[zabbix-ssl-stoa]
client = no
accept = 10151
connect = 127.0.0.1:10051

◆zabbix-serverホスト◆
【zabbix_server.conf】
ListenPort=10051
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=0
PidFile=/var/run/zabbix/zabbix_server.pid
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix
DBSocket=/var/lib/mysql/mysql.sock
SNMPTrapperFile=/var/log/snmptt/snmptt.log
ListenIP=127.0.0.1
AlertScriptsPath=/usr/lib/zabbix/alertscripts
ExternalScripts=/usr/lib/zabbix/externalscripts
AllowRoot=1

【stunnel.conf】
cert = /etc/stunnel/server.pem
key = /etc/stunnel/server.pem
fips = no
[zabbix-ssl-atos]
client = no
accept = 10151
connect = 127.0.0.1:10051
[zabbix-ssl-stoa-01]
client = yes
accept = 127.0.0.1:10150
connect = 'zabbix_agentのIP':10151

※備考
・iptables,SELinux、TCPWrapperは全てOFFにしてあります。
・zabbixWebのホスト設定より、zabbix-agentホストの"エージェントのインターフェース"を以下の値に変更しています。
  IP:127.0.0.1 ポート:10150

ユーザー yasu47b の写真

こんにちは、この記事を参考にしてstunnelを試してみました。

agent.confでリッスンポートを10050に指定しているので、
stunnelの設定もサーバからの接続を10050にします。

◆エージェント側のstunnel.conf
[zabbix-ssl-atos]       → agentd から発生した通信を暗号化してサーバ上のstunnelへ向ける設定
client = yes
accept = 127.0.0.1:10150
connect = xxx.xxx.xx.xx:10151  → server ホストの外側IP

[zabbix-ssl-stoa]      → server から発生した通信を復号して自ホスト上のagentdへ向ける設定
client = no
accept = 10151
connect = 127.0.0.1:10051 <----------------------- ここです!

ユーザー kaeru の写真

>>yasu47b様
>>fripper様
解説もつけて頂き非常に助かります。
「適当にポート変更していたら、なんだかしらないけど出来たぞ!」のまま回答を忘れておりました。
申し訳ありません。
ご指摘の通り、バックアップで取ってある設定ファイルを見直してみると
設定箇所に誤りがありました。
ご回答、誠にありがとうございました。
Zabbix3.0で追加される暗号化機能に、教えて頂いた内容を生かしていきたいと思います。

ユーザー fripper の写真

stunnelも相当更新掛かっているようですね。
スライド書いた当時は 5.02 あたりでしたが、5.24 がリリースされているようです
確認している限りでは、利用方法等に大きく変化はなく、新しいモノのほうが、より安定して動作する印象です

利用している折には、不意に通信接続、内部スレッドが暴走してうまく動作しなくなる等も
経験したりしているので、3.0での「標準サポート」にはホント期待しています

agentd-server直結で、パッシブ動作あり・ログ監視等のアクティブ要素あり、の場合には
双方向の設定をホスト・監視対象毎に用意しなければいけない点が厳しいですが、
パッシブ動作なし・全てアクティブ監視のみで構成すれば、トリガー設定の自由度は若干下がるものの
暗号通信設定はさほど複雑でもないので、活用できるかと思います