Title: CpMonitor リモートアップデートツールの開発 Author(s): 土井一夫(kazuo@cysols.com) 齋藤武夫(saito@cysols.com) Date: 01/07/2005 1. 動機  netman WG では、JGN II IPv6 ネットワーク上において、 複数のパッシブ型トラフィックモニタ(CpMonitor)を各地に 配備し運用を行ってきた。CpMonitor は実運用から得られた ノウハウをフィードバックしながら機能の拡張を頻繁に行って きている。  CpMonitor の機能拡張に伴う各地に配備されたモニタ装置の バージョンアップ作業は、従来運用チームが手分けをして人手で 行っていた。しかし、その更新頻度の高さとモニタ装置の台数の 多さにより、以下のような問題が無視できなくなってきた。  (1) バージョンアップ作業による観測不能時間の拡大  (2) 人為的作業ミスによる観測不能項目の発生  (3) 管理者作業負荷の増大  そこで、これらの状況を改善するために、従来人手で行ってきた 作業をすべて自動化すべく、CpMonitor Remote Update System (RUS)の開発を行った。 2. 方針 RASの開発にあたって、先に挙げた問題を改善するために、 以下の要求項目を満たす機能を実装することとした。 (1) 更新作業時間の短縮 (2) 更新作業後の更新確認作業の自動化  (3) 安全な更新環境の実現  (1) については、以下に挙げる機能を実装することとした。  (a) 複数台のモニタ装置に対する、CpMonitorアプリケーション   の一括更新機能  (b) 更新後の自動再起動機能 また、(2) については  (a) SNMP アクセスによる自動バージョン取得機能 を実装することにした。さらに(3) については  (a) マネジャ装置およびモニタ装置間の認証機能  (b) マネジャ装置およびモニタ装置間の通信の暗号化 を実現することとした。 3. 実装  RUS は、各モニタ装置に CpMonitor のソースコードが 展開され、コンパイルおよびインストールが完了し、 CpMonitor 自体の設定と実行が行われている環境を 前提として実装している。  RUSの実装にあたっては、一般的なUNIXマシンで 利用可能な以下のツール類を用いた。 (1) 使用言語:Bourne Shell (2) 利用フリーソフト:OpenSSH・sudo・NET-SNMP  実装したRUSは2つの Shell script により構成される。 (a) updateForceCpMonitor.sh (b) updateForceCpMonitorBackend.sh  これらスクリプトはマネジャ装置上に置いてあり、 バージョンアップの対象となるモニタ装置のリストは 予め (a) のスクリプト上に記述しておく。 更新作業を行うためには、CpMonitor アプリケーションに おいて変更があったファイルを、ソースツリーに則って 予め tar で固めておく。その後、その tar ファイルの ファイル名を引数とし、(a) のスクリプトを起動する。 (例)./updateForceCpMonitor.sh patch-0902.tgz  (a) のスクリプトが起動されると、以下の操作が行われる。  (i) (b) のスクリプトの転送 (ii) 予め用意された tar ファイルの転送と展開 (iii) モニタ装置上での (b) のスクリプトの実行 (い) ソースコードのコンパイルとインストール    (ろ) 起動されている CpMonitor の停止    (は) 更新された CpMonitor の起動 (iv) モニタ装置上の (b) のスクリプトの消去 (v) SNMP アクセスによる CpMonitor のバージョン確認 [updateForceCpMonitor.sh] -------------------------------------------------------------------------------- #!/bin/sh AGENTS="\ v6mon.nemoto.ecei.tohoku.ac.jp \ v6mon-trix \ corsa.shiratori.riec.tohoku.ac.jp \ pc4.sendai.wide.ad.jp \ tokyo-u-mon1 \ softp-mon \ kyoto-mon \ hiro-mon \ hiro-cu-mon \ saga-u-mon \ " LOG=updateForceCpMonitor.log if [ ! -f "$1" ] then echo "$0: $1 is not found" echo "usage: $0 " exit 1 fi touch $LOG echo >> $LOG 2>&1 date >> $LOG 2>&1 echo "agents to be updated: $AGENTS" >> $LOG 2>&1 for agent in $AGENTS do echo >> $LOG 2>&1 echo "[[ $agent ]]" >> $LOG 2>&1 snmpget -Ov -v3 -lauthPriv $agent sysDescr.0 cpmMonitorVersion.1 >> $LOG 2>&1 scp updateForceCpMonitorBackend.sh cpmupdate@$agent: >> $LOG 2>&1 ssh -l cpmupdate $agent sudo tar -xvzf - -C /usr/local/src/CpMonitor5-SNAP < $1 >> $LOG 2>&1 ssh -l cpmupdate $agent sh -x updateForceCpMonitorBackend.sh >> $LOG 2>&1 ssh -l cpmupdate $agent rm updateForceCpMonitorBackend.sh >> $LOG 2>&1 snmpget -Ov -v3 -lauthPriv $agent sysDescr.0 cpmMonitorVersion.1 >> $LOG 2>&1 done echo >> $LOG 2>&1 date >> $LOG 2>&1 exit 0 -------------------------------------------------------------------------------- [updateForceCpMonitorBackend.sh] -------------------------------------------------------------------------------- #!/bin/sh DATE=`date +%y%m%d%H%M%S` # yymmddHHMMSS SRCDIR=/usr/local/src/CpMonitor5-SNAP/src BINDIR=/usr/local/CpMonitor/bin SBINDIR=/usr/local/CpMonitor/sbin if [ -d "$SRCDIR" ] then if [ -d "$SRCDIR/SnortForTaoIPv6" ] then cd "$SRCDIR/SnortForTaoIPv6" && sudo make all if [ $? -eq 0 ] then sudo mv "$BINDIR/snort" "$BINDIR/snort.$DATE" sudo make install fi fi if [ -d "$SRCDIR/net-snmp-5.0.9" ] then cd "$SRCDIR/net-snmp-5.0.9" && sudo make all if [ $? -eq 0 ] then sudo mv "$SBINDIR/snmpd" "$SBINDIR/snmpd.$DATE" sudo make install fi fi sudo sh -x /usr/local/etc/rc.d/CpMonitor5.sh stop sudo sh -x /usr/local/etc/rc.d/CpMonitor5.sh start fi exit 0 -------------------------------------------------------------------------------- 4. 環境設定  各モニタ装置上に、RUS で利用するための、以下の条件を満たした ユーザアカウント "cpmupdate" を作成する。 (1) ログイン認証には、スクリプト実行者の RSA ないし DSA 鍵を用いる (2) パスワードなしで sudo により特権を利用できる権限を持つ  具体的な操作は以下のとおりである。 (a) $ sudo vipw 以下の行を追加。 --- cpmupdate:*:3999:3000::0:0:CpMonitor remote updater:/home/cpmupdate:/bin/sh --- $ sudo mkdir /home/cpmupdate $ sudo mkdir /home/cpmupdate/.ssh $ sudo chmod 700 /home/cpmupdate/.ssh $ sudo vi /home/cpmupdate/.ssh/authorized_keys $ sudo chmod 600 /home/cpmupdate/.ssh/authorized_keys スクリプト実行者のSSH公開鍵を登録する。 --- ssh-dss AAAAB3NzaC1kc3MAAACBAI9PvMLdrbHNmnXN+tFtPip18dz+ntHbfq9QZkGpjwuKoVRjDrVBdObTcLGH1If76NGVPSb5IgxdzaMYCIjz7nw8Sww0TTH80iHBElmZUGsAOJRirJ/QKT/Fx8zj18TuNb1jSYOeIpXo/GrLuHv2z8+3CZHIHP7STNdpEtqAQZY5AAAAFQCh1si/p1SGci5riBKU9Gk3UIL0hQAAAIAo8o3TEjuKT2nmq7XFuTll/W7EZQVdSnwr4WzVYqbqkUBFOBhR77MnNQx5KLQr0zig58dN/7snoOXCekJFq+SR2vROIBMEfb1SqxnFzLfxGsCC8di1KFRQr2kqjQQlwDHLsaLQvn8RzJgJhigiVy5E0cLv6+eApD/DtpHYcflBvAAAAIEAi19Dm+POkf9+jlXT6LJvq1QhCZGJQlSicv5ahqYJK4gCdyZEK8Zg65Y2UbiXh8R6qni8Zb82xnc4iYEuxs5stfuTU+ZfV2Nja7s4BOJ/Bp7W8haSTR8OomIxVl0ZXGSpE2ep+0yYFij1FpxnrBF5jJ53vHHfGU4LORWyULx4CIc= dsa-key-20020416 ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQBWPYJJEq0qsi0Q/ug26sgstdsbWmv3nDqwvPt1YUDKdpJgWLD4vro93ni8doZbLDd1B3SbFcWxUhZVkKyDvTW+IjVbSuHeY4Wvwulcm+p4OFVxA5s3b/3rIefrrojbMNjKboqQnndqgHePqVsF/FBv4xI3/bh7XHKO0EHzKafSFDTgRoEPkc7Q0pTQWfJlc/8OuMZCMB3p2ga17h7e1xqTZU+Yw7mtm0ALxadiE2gaWeoWU1x8IBzDKAZEHldQOpd5rNVjQ83HPlKlkmvrQqdUKckoO6Uq5Paf3qhpPcDAYSJK9HE4HRQBNxZwVHGGknDsjgsgw52IIAZ9EoqZG6kR rsa-key-20021210 --- $ sudo chown -R cpmupdate /home/cpmupdate (b) $ sudo visudo 以下の行を追加。 --- # cpmupdate can use root priviledge without password (040930) cpmupdate ALL=(ALL) NOPASSWD: ALL --- 5. 現状と今後  先に述べたとおり、RUS を実行するためには、あらかじめ CpMonitor の更新ファイルを tar ファイルとして準備し、 以下の様にコマンドラインから実行する。 ./updateForceCpMonitor.sh patch-0902.tgz  これにより、各モニタ装置上の CpMonitor のソースツリーに パッチが適用され、新しいバイナリの生成とインストール、 古いバイナリのバックアップが行われる。その後に CpMonitor の再起動とバージョン情報の収集が行われる。これら一連の作業 ログは $LOG (標準では updateForceCpMonitor.log) に保存される。  JGN II モニタリング環境において、RUS を用いた 9 台の モニタ装置のアップデート作業を行った結果、25分ですべての 装置上のアプリケーションのバージョンアップ作業とバージョン 確認を行うことができた。  今後は以下に挙げる機能の実装と拡張を予定している。  (1) CpMonitor 新規インストールへの対応  (2) エラーチェックの厳密化 Copyright Notice Copyright (C) WIDE Project (2005). All Rights Reserved.