SNMP ( Simple Network Management Protocol ) はネットワークに接続された機器をネットワーク経由で監視するためのプロトコルです。SNMPにはver1~3までの3つのバージョンがあります。
SNMPバージョン2はRFCにおいて定義はされていますがまだ実験段階のプロトコルです。残念ながらバージョン2は実際の機器に全ての部分を実装できるよう標準化することができず、事実上標準化は断念されました。とはいえ、SNMP バージョン2のCommunity Based SNMPと呼ばれる部分は既に多くの機器に取り入れられています。この部分を別にSNMPバージョン2cあるいはSNMP v2cと呼びます。SNMPバージョン2にはこの他にParty Based SNMP ( v2p )、User Based SNMP ( v2u )と呼ばれる部分が定義されていますが、現在これらは使われていません。
SNMPバージョン3はバージョン2の標準化が断念されたことを受けて考案されました。SNMPバージョン3では現在のインターネットのセキュリティ事情をふまえ、SNMP v2uやv2pで断念されたセキュリティやユーザ認証の機能が組み込まれています。SNMPバージョン3はUser-based Security Modelと呼ばれるセキュリティモデルを採用しており、USMという名称で呼ばれる場合もあります。
現在最も普及しているバージョンはSNMPバージョン1ですので、以降もバージョン1を前提に記載します。
■SNMPの構成
SNMPはマネージャとエージェントと呼ばれる2つの要素から構成されます。SNMPに対応した機器には個々の管理情報が保持されています。例えばルータやスイッチには送受信したデータのビット数やCPU負荷、メモリ使用率など様々な管理情報を持っています。SNMPでは管理対象の機器やホスト側にはエージェントと呼ばれるサービスを稼働し、これらの管理情報を保持します。管理者はマネージャと呼ばれる管理用のアプリケーションを使いエージェントからこれらの情報を取得したり変更したりすることができます。
■MIBとOID
各機器やサーバが管理してる情報が個々にバラバラでは情報を統一的に見ることができません。そのためエージェントが提供する情報はカテゴリ分けされ標準化されています。これはMIB ( Management Information Base )と呼ばれています。MIBにはホストやルータが持っていなければならないデータ項目や各データに対して行うことができる処理が決められています。下記は主なMIBのカテゴリです。
カテゴリ | 概要 |
system | ホストやルータの名称などのシステム情報 |
interface | 個々のネットワークインターフェイスに関する情報 |
at | ARPなどのアドレス変換情報 |
ip | IPに関する情報 |
icmp | ICMPに関する情報 |
tcp | TCPに関する情報 |
udp | UDPに関する情報 |
egp | EGPに関する情報 |
snmp | SNMPに関する情報 |
private | 製品特有の情報 |
SNMPのプロトコルと同様にMIBも全て標準化されておりMIB2として定義されています。MIBはオブジェクトと呼ばれるたくさんの管理情報から構成されます。各オブジェクトにはOIDまたはObjectIDと呼ばれる番号が付けられ、オブジェクトツリーの上部から数字を列挙して.1.3.6.1.1.2.1.1.5のような数字列として表現します。
なお、実際にマネージャープログラムが使う場合にはこれらOIDの後にインデックスと呼ばれる数値を指定します。システム名のようなものは1つしかないため、system.sysName()のように呼ばれるインデックスは0になりますが、例えばネットワーク・インターフェイスの数だけ異なる情報が存在するようなオブジェクトの場合にはインターフェイス番号に合わせて1から始まるインデックスを変更します。
■SNMPにおける通信
SNMPではマネージャからエージェントの情報を取得したりエージェントからマネージに情報を送ったりする処理がSNMPコマンドとして規定されています。マネージャがエージェントから情報を得るときにはMIB変数を参照します。逆にマネージャからエージェントにオペレーションを行う場合にはMIB変数に値を設定するという方法をとります。以下、SNMPコマンド一覧です。
SNMPコマンド | 処理内容 |
GET-REQUEST | 指定したMIB変数の値を取得 |
GET-NEXT-REQUEST | 正確な名前を指定せずにMIB変数の値を取得( 要素がいくつあるかわからないテーブル型の情報を取得する場合に使う ) |
SET-REQUEST | 指定した変数に値を指定 |
GET-RESPONSE | GET-REQUESTに対する応答 |
TRAP | TRAP通知 ( エージェントから予め設定した状態が発生した場合にマネージャへ知らせるコマンド ) |
SNMPの通信ではコミュニティと呼ばれるパスワードを使います。多くのエージェントでは複数のコミュニティが使用できコミュニティ毎に情報の取得のみとか情報の設定を許可するという役割を設定できるようになっています。一般的に情報の取得のみのコミュニティをreadコミュニティと呼びます。readコミュニティは標準ではpublicという文字列を使います。情報の設定が可能なコミュニティをread/writeコミュニティと呼びます。read/writeコミュニティは標準ではprivateという文字列を使います。コミュニティの文字列は必ず修正できるようになっていますので、ネットワーク管理者以外がSNMPでホストやネットワーク機器にアクセスするのを防ぐため変更するようにしてください。
■ポーリング設定
SNMP設定には大きくわけてポーリングとトラップの2種類に別れます。Ciscoルータでポーリングの設定は下記のようになります。
(config)# access-list 1 permit 192.168.1.0 0.0.0.255 (config)# access-list 1 permit 192.168.2.0 0.0.0.255 (config)# access-list 1 permit 192.168.3.0 0.0.0.255 (config)# access-list 1 deny any (config)# snmp-server community public RO 1 |
上記ではCommunity Nameをpublicに指定しており、なおかつアクセス可能な送信元IPを192.168.1.0/24、192.168.2.0/24、192.168.3.0/24の3セグメントに絞っています。ポーリング設定に関しては基本これだけでOKです。あとはCactiなどのリソース監視ツールで設定すればトラフィックやCPU負荷等が取得できます。
■トラップ設定
続いてTrap設定です。これはシスコ機器側からNNMに対して通知をするものでSNMPをサポートしている機器ならどれでも対応しています。
(config)# snmp-server trap-source VlanXX (config)# snmp-server host 192.168.1.1 public (config)# snmp-server enable traps snmp coldstart warmstart (config)# snmp-server enable traps cpu threshold (config)# snmp-server enable traps envmon fan shutdown supply temperature status (config)# snmp-server enable traps errdisable |
まず最初にトラップを送信する際のIPを指定して送信する宛先を指定しCommunity Nameも合わせて指定します。そのあと、どのTrapを飛ばすか指定しております。実際に指定できるものは上記以外にも多数存在しますが、上記ではかなり絞って指定しています。
繰り返しますが上記では送信するTrapをかなり絞り込んでいます。というのも個人的にはSNMP Trapを有効にせずともNagiosおよびCactiを使用することでほぼ問題なく運用できてしまうからです。逆に何でもかんでもTrapの対象としてしまうと少しの変化でTrapが飛び客先より説明を求められるということが過去にあったため上記のように必要最低限のものだけ有効としています。
ちなみにsnmp-server enable traps configを有効にするとsh runを打つたびにトラップが飛んでしまいます。そんなトラップ当然必要ありませんよね。