- PR -

スクリプトにてSNMP

1
投稿者投稿内容
もじお
会議室デビュー日: 2004/04/22
投稿数: 8
投稿日時: 2006-08-05 00:08
現在スクリプトを利用して機器の監視を行おうと考えております。
まずはと思いスクリプトにてSNMPを利用しルータのarp情報を取得できないかと考えております。
そもそもスクリプトにて可能なのでしょうか。
http://www.microsoft.com/japan/technet/scriptcenter/scripts/network/snmp/default.mspx
にて出来そうな事は書いてあるのですが、エラーとなってしまい機器にすら接続できません。
お解りの方いらっしゃいましたらお手数ですが、教えて頂けないでしょうか。
よろしくお願いします。

使用OSはWindows2000proです。

[ メッセージ編集済み 編集者: もじお 編集日時 2006-08-05 00:08 ]
air
会議室デビュー日: 2006/08/07
投稿数: 12
投稿日時: 2006-08-07 00:22
まず、こういった質問をする場合はエラーの内容を記載した方が良いですよ。

- 既存のツールを使って情報を取得できてますか?
 ftp://ftp.microsoft.com/ResKit/win2000/snmputilg.zip

- 次のページには Windows XP/2003 対応となってますね。
 http://www.microsoft.com/technet/scriptcenter/scripts/network/snmp/default.mspx?mfr=true

 日本語のMicrosoftサイトは誤訳や情報が古かったりすることが多いので
英語のサイトもチェックすることをお勧めします。

 http://www.google.co.jp/search?sitesearch=microsoft.com&domains=microsoft.com%3Bsupport.microsoft.com%3Bdownload.microsoft.com%3Bwww.microsoft.com%3Bmsdn2.microsoft.com%3Bmsdn.microsoft.com%3Btechnet.com%3Btechnet2.microsoft.com%3Boffice.microsoft.com%3Bkotaete-net.net&hl=ja&num=20&q=wmi+snmp
もじお
会議室デビュー日: 2004/04/22
投稿数: 8
投稿日時: 2006-08-07 14:32
未記入さん
書き込みありがとうございます。

>まず、こういった質問をする場合はエラーの内容を記載した方が良いですよ。

申し訳ありませんエラーメッセージは
"無効な名前空間です"
というエラーメッセージが返されます。

>- 既存のツールを使って情報を取得できてますか?
> ftp://ftp.microsoft.com/ResKit/win2000/snmputilg.zip

取得可能でした。

>- 次のページには Windows XP/2003 対応となってますね。>http://www.microsoft.com/technet/scriptcenter/scripts/network/snmp/default.mspx?mfr=true

ためしに2003上で行ってみましたが同一のエラー
無効な名前空間ですを返してきます。

よろしくお願いします。
air
会議室デビュー日: 2006/08/07
投稿数: 12
投稿日時: 2006-08-08 06:38
 "無効な名前空間です" というエラーなので、スクリプトの次の行で引っかかって
いると想像できます。
コード:
Set objWmiServices = objWmiLocator.ConnectServer("", "root¥snmp¥localhost")


Windows Management Instrumentation テストというツールがあるのを発見したので
root¥snmp¥localhost に接続できるかテストしてみました。

1. ファイル名を指定して実行で wbemtest.exe
2. [接続]ボタン - 名前空間に root¥snmp¥localhost - [ログイン]ボタン

 やはり、"無効な名前空間です" エラーとなりました。

次にSNMPサービスをインストールしてみました。

- Windows 2000 SP4 Pro
1. ネットワークとダイヤルアップ接続 - 詳細設定 -
  オプション ネットワーク コンポーネント - 管理とモニタツール -
  簡易ネットワーク管理プロトコル

- Windows Server 2003 EE R2
1. ネットワーク接続 - 詳細設定 -
  オプション ネットワーク コンポーネント - 管理とモニタツール -
  WMI SNMP プロバイダ、簡易ネットワーク管理プロトコル

 再度 wbemtest.exe を使って root¥snmp¥localhost に接続してみました。
Windows 2000では同じエラーでしたが、Windows Server 2003 だと
接続できました。

SNMPエージェントの設定をしておきます。(Win2000/2003)
1. サービス(services.msc /s)を起動
2.「SNMP Service」のプロパティを表示
3. [エージェント]タブのサービス欄ですべてチェックを付ける
4. [セキュリティ]タブで 認証トラップを送信する にチェックを付け、
  コミュニティ名(public)、権利(READ ONLY)を追加し、
  すべてのホストから SNMP パケットを受け付ける を選択。

スクリプトを実行してみると情報を取得できることが確認できました。
(Win2003 -> Win2000、Win2003 -> Win2003)

 sample01.wsf (¥は全角にしてあります)
コード:
<job id="main">
<script language="VBScript">
strTargetSnmpDevice = "192.168.0.1"
Set objWmiLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWmiServices = objWmiLocator.ConnectServer("", "root¥snmp¥localhost")
Set objWmiNamedValueSet = CreateObject("WbemScripting.SWbemNamedValueSet")
objWmiNamedValueSet.Add "AgentAddress", strTargetSnmpDevice
objWmiNamedValueSet.Add "AgentReadCommunityName", "public"
Set colSystem = objWmiServices.InstancesOf("SNMP_RFC1213_MIB_system", , _
                                           objWmiNamedValueSet)
For Each objSystem In colSystem
    WScript.Echo "sysContact:  " & objSystem.sysContact  & vbCrLf & _
                 "sysDescr:    " & objSystem.sysDescr    & vbCrLf & _
                 "sysLocation: " & objSystem.sysLocation & vbCrLf & _
                 "sysName:     " & objSystem.sysName     & vbCrLf & _
                 "sysObjectID: " & objSystem.sysObjectID & vbCrLf & _
                 "sysServices: " & objSystem.sysServices & vbCrLf & _
                 "sysUpTime:   " & objSystem.sysUpTime
Next
</script>
</job>



 WMIスクリプトの記述は少しややこしいので Scriptomatic 2.0 をお勧めします。

 http://www.microsoft.com/downloads/details.aspx?familyid=09DFC342-648B-4119-B7EB-783B0F7D1178&displaylang=en


> SNMPを利用しルータのarp情報を取得
 ルータのarpを取得する場合、ipNetToMediaType(1.3.6.1.2.1.4.22.1.4)あたり
を使うんでしょうか。(よく分かりません)

 ネットワーク機器の情報を取得する場合はベンダ提供のMIBを smi2smir.exe
でコンパイルせよ とMicrosoftのサイトに書いてありましたので、ご自分で
調べてみてください。

 なお、数年前に話題になったと思いますが、本番環境で public, private
を使わない など、セキュリティに十分配慮した設計をしてください。
air
会議室デビュー日: 2006/08/07
投稿数: 12
投稿日時: 2006-08-09 09:01
 WMIを使わないで情報を取得する方法が分かりましたので、Windows 2000で試してみてください。

 sample02.wsf
コード:
<job id="main">
<script language="JScript">
var strTargetSnmpDevice = "192.168.0.1";
var strCommunity = "public";
var intRetry = 2;
var intTimeout = 200;
var strOID = ".1.3.6.1.2.1.1.5.0"; // sysName
var objSNMP;

try
{
	objSNMP = WScript.CreateObject("OlePrn.OleSNMP");
	objSNMP.Open(strTargetSnmpDevice, strCommunity, intRetry, intTimeout);
	var strOIDValue = objSNMP.Get(strOID);
	WScript.Echo(strOIDValue);
	objSNMP.Close();
}
catch(e)
{
	WScript.Echo(e.message + " (" + e.name + " " + (e.number & 0xFFFF) + ")");
}
finally
{
	objSNMP = null;
}
</script>
</job>

 このスクリプトを実行する側でSNMPサービスは必要はありません。

 oleprn.dll
コード:
Dispatch ISNMP; // ISNMP Interface
GUID={4F664F90-FF01-11D0-8AED-00C04FD7B597};
  function QueryInterface(riid:^GUID; out ppvObj:^^void);
  function AddRef: UI4;
  function Release: UI4;
  function GetTypeInfoCount(out pctinfo:^UINT);
  function GetTypeInfo(itinfo:UINT; lcid:UI4; out pptinfo:^^void);
  function GetIDsOfNames(riid:^GUID; rgszNames:^^I1; cNames:UINT; lcid:UI4; out rgdispid:^I4);
  function Invoke(dispidMember:I4; riid:^GUID; lcid:UI4; wFlags:UI2; pdispparams:^DISPPARAMS; out pvarResult:^variant; out pexcepinfo:^EXCEPINFO; out puArgErr:^UINT);
  function Open(bstrHost:BSTR; bstrCommunity:BSTR; [varRetry:variant; varTimeout:variant]);
  function Get(bstrOID:BSTR): variant;
  function GetList(varList:^variant): variant;
  function GetTree(varTree:BSTR): variant;
  function Close;
  function OIDFromString(bstrOID:BSTR): variant;
  function Set(bstrOID:BSTR; varValue:variant);
  function SetList(varName:^variant; varValue:^variant);


air
会議室デビュー日: 2006/08/07
投稿数: 12
投稿日時: 2006-08-09 20:27
補足します。

 悪意のあるサイトをブラウザで閲覧すると、SNMPエージェントを動かしている
ルータなどの情報が漏れてしまう可能性があります。
しつこいかもしれませんが、セキュリティに十分配慮した設計をしてください。


- SNMPエージェント
 コミュニティ名で public を絶対に使わない。
 request を受け付けるノードを限定する。

- ネットワーク
 インターネット(外部)向けのSNMPパケット(161/udp)を遮断する。

- ブラウザ(IE)
 スクリプトを実行しても安全だとマークされていない ActiveX コントロールの初期化と
 スクリプトの実行 [A] を無効にする。
 regsvr32.exe /u oleprn.dll を検討する。

 sample03.reg
引用:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Internet Explorer\\ActiveX Compatibility\\{4F664F91-FF01-11D0-8AED-00C04FD7B597}]
"Compatibility Flags"=dword:00000400


ブラウザの設定 [A] が有効になっていると、このレジストリを設定しても
OlePrn.OleSNMP が動作してしまいました。

広範囲に該当する SNMP の脆弱性について - IPA
http://www.ipa.go.jp/security/ciadr/20020213snmp.html
もじお
会議室デビュー日: 2004/04/22
投稿数: 8
投稿日時: 2006-08-09 22:55
未記入さん
こんばんは。
詳しいご回答ありがとうございます。
試した後に結果御報告させていただきます。
air
会議室デビュー日: 2006/08/07
投稿数: 12
投稿日時: 2006-08-10 22:39
 予算があり監視対象ノードが多い場合は監視ツール(Manager)製品を導入する
のがお手軽そうですね。
 自分はSNMPを扱うことが無かったのですが、色々調べてみると、
SNMPって結構便利だなぁ と思いました。


■スクリプトを使ってSNMPエージェントから情報を取得には?(PULL型 - 161/udp)

- Windows標準の環境

 OlePrn.OleSNMP を使って情報を取得する。WSHを使ったり、Webページを
用意し、ブラウザでSNMPエージェントの状態を一覧表示したりすることも可能。

- WMIを利用する場合

 WMI SNMP プロバイダをインストール(WinNT4/2000は下記リンクのインストーラ、
WinXP/2003は control ncpa.cpl)し、WMI経由で情報を取得する。

 サンプルコード
  http://www.microsoft.com/technet/scriptcenter/scripts/network/snmp/default.mspx?mfr=true
 WMIスクリプト生成ツール
  http://www.microsoft.com/downloads/details.aspx?familyid=09DFC342-648B-4119-B7EB-783B0F7D1178&displaylang=en
 WinNT4/2000用 WMI SNMP プロバイダ
  http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=C6B30755-6D20-4107-82C5-089E3DFE4FEE


■Windows - エージェントによるTRAP(PUSH型 - 162/udp)

 WindowsではSNMPサービスをインストールする。コミュニティ名などは
services.msc の SNMP Service で設定する。(SNMP Trap Service を
自動にしておきます。多分...)
 付属の evntwin.exe を使ってNTイベントをTRAPとして送信できる。
例えば、ソース: disk のイベントを指定しておくと、Diskエラーや
クォータのイベントをSNMPマネージャに送信できる。
 また、WindowsのSNMPサービスを強化するものとして SNMP Informant
といったものもある。


■関連情報

- 解説

 監視を自動化するSNMP - @IT
  http://www.atmarkit.co.jp/fnetwork/rensai/snmp01/01.html
 SNMPによるネットワークモニタリング - ITmedia
  http://www.itmedia.co.jp/help/howto/linux/0007master/06/
 ネットワークモニタリングツールを製作する - PC View
  http://www.pc-view.net/Network/040213/
 SNMP InformantによるWindowsサーバのSNMPエージェント - MYCOM
  http://journal.mycom.co.jp/column/yetanother/082/
 MRTGによるサーバ監視システムの構築 - @IT
  http://www.atmarkit.co.jp/flinux/rensai/root08/root08a.html

- セキュリティ

 広範囲に該当する SNMP の脆弱性について - IPA
  http://www.ipa.go.jp/security/ciadr/20020213snmp.html
 PROTOS リモート SNMP 攻撃ツール - ISS
  http://www.isskk.co.jp/support/techinfo/general/PROTOS_SNMP_xforce.html
1

スキルアップ/キャリアアップ(JOB@IT)