SSHでZabbixの途中経路を暗号化(zabbix2.2系)のスクリプト修正

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管理画面でマップ上から接続スクリプトを起動

2014-11-27_161547

クリックすると出てくるので起動します。

という・・・・長い工程を経てようやく接続が可能になっていました。

追加作業の流れ(改善後)

# 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を手作業で更新しなくて済みます。
接続の時にはチェック有効なので、突然変わったりした場合は接続できません。