SSHでZabbixの途中経路を暗号化(zabbix2.2系)
SSHでZabbixの途中経路を暗号化(zabbix2.2系)の調整
この続き。
今まで1.8系のZabbixで監視してきたホストを追加しようと思ったら、やけに面倒な作業が多かったので修正を加えました。
追加作業の流れ(改善前)
・Zabbix Agent のアップグレード (2.2リポジトリをRPMで追加したのち、yum update zabbix-agent)
・zabbix_agentd.confの修正(2.2のインストール時に置かれるzabbix_agentd.conf.rpmnewファイルで書き直したほうが早い)
/etc/zabbix/zabbix_agentd.conf の変更点
ServerPort=20051 → 項目として無くなりました。
ServerActive=127.0.0.1:20051 として設定することになりました。
Server=127.0.0.1 → こちらにはポートの記述を書いてしまうとZabbix Serverが接続できなくなるので注意です。
・ZabbixサーバからSSH接続をしてみて、known_hostsに書き込むサーバの公開鍵を取得。
# ssh zabbix_agent@seedslight.com -p 222222
# cat /root/.ssh/known_hosts
# vim /opt/zabbix/ssh/known_hosts
・スクリプトで接続テスト(root等)
# /opt/zabbix/bin/zabbix_ssh_tunnel.sh start seedslight.com zabbix_agent 11051 222222 >> /tmp/zabbix_ssh_tunnel.log 2>&1
・接続を確認したら切断
# ps auxww | fgrep zabbix_ssh_tunnel
# netstat -ln | fgrep 11051
# /opt/zabbix/bin/zabbix_ssh_tunnel.sh stop seedslight.com zabbix_agent 11051 222222 >> /tmp/zabbix_ssh_tunnel.log 2>&1
・ZabbixのGUI管理画面で接続用スクリプトを登録
「管理」→「スクリプト」→「スクリプトの作成」(今までに作っているなら、スクリプトの名前をクリックして、「複製」をしたほうが早いけれど)
このように、ホストの持っているポートを{HOST.PORT}で渡せないため、1サーバにつき1つの接続スクリプトを用意しています。
ユーザーが実行できる権限をしっかりと分けたい場合はホストグループを載せるのは有効ですね。
マップも単一のホストグループだけで作るとこの辺りの統一感が気持ちよくなります。
/opt/zabbix/bin/zabbix_ssh_tunnel.sh restart {HOST.HOST} zabbix_agent 11051 222222 >> /tmp/zabbix_ssh_tunnel.log 2>&1
このように引き渡すパラメータはちょっと面倒です。
・ZabbixのGUI管理画面でマップを作成
スクリプトを起動できるのは、最新データのホスト名かマップに登録したホストのアイコン(イメージなどではだめ)だけですので
マップを作ります。
・ZabbixのGUI管理画面でマップ上から接続スクリプトを起動
クリックすると出てくるので起動します。
という・・・・長い工程を経てようやく接続が可能になっていました。
追加作業の流れ(改善後)
# ssh zabbix_agent@seedslight.com -p 222222
# cat /root/.ssh/known_hosts
# vim /opt/zabbix/ssh/known_hosts
この部分をGUI管理画面のマップ上でスクリプト叩くだけっていう形にしました。
sshのオプションでknown_hostsのチェックを無視するものがあるのですが、その挙動として、known_hostsに強制追加(上書きも)
してくれるらしいのです。
#!/bin/bash KEY=/opt/zabbix/ssh/id_rsa KNOWN_HOSTS=/opt/zabbix/ssh/known_hosts SSH_OPTIONS="-t -t -f -N -n -i ${KEY} -o UserKnownHostsFile=${KNOWN_HOSTS}" # debug echo $@ # サーバの公開鍵を取得するだけ function add_known_host() { /usr/bin/ssh ${SSH_OPTIONS} ${AGENT_USER}@${AGENT_HOST} -p ${SSH_PORT} -o 'StrictHostKeyChecking no' sleep 1 pkill -f "${AGENT_USER}@${AGENT_HOST} -p ${SSH_PORT} " } # 接続 function start() { /usr/bin/ssh ${SSH_OPTIONS} ${AGENT_USER}@${AGENT_HOST} -p ${SSH_PORT} -L ${TUNNEL_PORT}:127.0.0.1:10050 & /usr/bin/ssh ${SSH_OPTIONS} ${AGENT_USER}@${AGENT_HOST} -p ${SSH_PORT} -R 10051:127.0.0.1:10051 & } # 切断 function stop() { pgrep -l -f "${AGENT_USER}@${AGENT_HOST} -p ${SSH_PORT} " pkill -f "${AGENT_USER}@${AGENT_HOST} -p ${SSH_PORT} " echo "${AGENT_USER}@${AGENT_HOST} -p ${SSH_PORT} " echo 'stop ssh for tunnel' } if [ $# -ne 5 ];then echo $"Usage: $0 {start|stop|restart|add_known_hosts} Destination_server Login_user Localport Destination_ssh_port" exit 1 fi AGENT_HOST=${2} AGENT_USER=${3} TUNNEL_PORT=${4} SSH_PORT=${5} case "$1" in start) start ;; stop) stop ;; restart) stop sleep 1 start ;; add_known_hosts) add_known_host ;; *) echo $"Usage: $0 {start|stop|restart|add_known_hosts} Destination_server Login_user Localport Destination_ssh_port" exit 1 esac |
以前作ったスクリプトはこのように変更しています。
※Zabbix としては、こういうスクリプトを「/usr/lib/zabbix/externalscripts/」こちらに設置してほしいとは思うのですが…すみません、そこまでは手が回っていませんでした。
これによって、他のアカウントなどでsshコマンドを叩いてknown_hostsを手作業で更新しなくて済みます。
接続の時にはチェック有効なので、突然変わったりした場合は接続できません。