2011/09/23 CentOS5.5





SNMPを設定する

SNMPはその性質上、専門家ならお世話になり、そしてその奥深さに知って物怖じします。

SNMPのインストールそのものは簡単ですが、設定が面倒くさいイメージがあります。
どこのページを見ても大体大差のないことが説明してあります。
なにしろconfに書いてある例を採用することが多いので。

SNMPの概要
インストール
snmp.confの記述
confの読み取り専用化
各セクションの意味


SNMPの概要
SNMPは少数のマネージャと多数のエージェントに分かれます。
マネージャは情報を収集(ポーリング)し、集計し、管理するシステムです。エージェントの設定を書き換えることも出来ます。
エージェントはマネージャに情報を収集され、時に自主的にマネージャへ連絡(トラップ)します。

マネージャの代表格と言えば、通信量やCPU使用率をグラフ化する「MRTG」です。

本項ではCentOSをSNMPエージェントとして設定をします。
エージェントは

・『誰から』なら、どこまで情報収集することを許すか
・緊急時は『誰へ』連絡をするか

を設定します。

SNMPは情報を読み取るというその性質上、いつもセキュリティの問題を抱えます。
考える範囲は以下の通りです。

パスワードに相当する「コミュニティ名」

通常は読み取り用コミュニティ名にpublic、書き込み許可コミュニティ名にprivateがデフォルトで用意されています。もちろん、デフォルト値では推測されてしまいます。
そうでなくてもSNMPコミュニティ名は各種システムに共通の平文を入力する必要が多く、完全な隠ぺいが困難です。

許可IPアドレス制限

コミュニティ名に加え、そのコミュニティ名の使用を許可するIPアドレスセグメントを指定します。
マネージャが1台しかないのであれば、そのアドレスを一つだけ指定します。しかし今後、役割の違うマネージャが増えることも想定されます。その場合はアドレスを複数指定するか、セグメントで指定します。

読み取り専用・書き込み権限の設定

SNMPでは遠隔から情報変更(スイッチのポート閉塞、システムのシャットダウン)も可能です。これらを書き込み許可コミュニティと呼び、通常読み取り専用コミュニティ(public)とは別のコミュニティ名(private)を使用します。
設定変更が必要ないのであれば、SNMPは読み取り専用のみで運用します。
これで最悪パスワード等が悟られても、CPU使用率や転送量などステータス情報を「見られる」だけで実害はありません。

閲覧範囲

SNMPではIPアドレスセグメント、コミュニティ名、読み取りモードなどを指定するとき、同時にそのグループがシステムのどこまでを見て良いかを制限します。
これにより、特定システムはたとえばOS情報のみ、特定システムはハードウェア情報のみ、という風に情報を収集します。
マネージャシステムをよほど多層に構築しない限り、通常は全部許可することが多いでしょう。

これらの情報を設定することで「読み取り専用」権限を持った「コミュニティ名」を使用しても良い「IPアドレスセグメント」「どこまで」見てもよいか、を定義します。
ややこしいですが、考えるのは最初の一回だけです。
一度決めてしまえば、後は同じ設定を使いまわすだけです。
なので、最初の一回に十分に頭をひねりましょう。


インストール
SNMPのインストールはyumで簡単です。snmpwalkを使用するので、snmp-utilsも一緒に入れておきましょう。

#yum install net-snmp
#yum install net-snmp-utils


snmpd.confの記述
赤字はコメントアウト。青字が追加です。
とりあえずセキュリティのための定義が入っているので、各デフォルト行はコメントアウトしておきましょう。
ぱっと見、snmpd.confは長いですがほとんどコメントなので落ち着いてみれば読み切れないほどではありません。

#       sec.name  source          community
#com2sec notConfigUser  default       public
com2sec mynetwork1 192.168.1.0/24 public
com2sec manager 192.168.2.100 private
com2sec local localhost private

#group   notConfigGroup v1           notConfigUser
#group   notConfigGroup v2c           notConfigUser
group mynetwork_grp v1 mynetwork1
group mynetwork_grp v2c mynetwork1
group manager v1 local
group manager v2c local
group local_group v1 local
group local_group v2c local

#view    systemview    included   .1.3.6.1.2.1.1
#view    systemview    included   .1.3.6.1.2.1.25.1.1
view    all    included   .1   80

#access  notConfigGroup ""      any       noauth    exact  systemview none none
access mynetwork_grp "" any noauth exact all none none
access manager "" any noauth exact all all none
access local_group "" any noauth exact all all none



記述したら、最後にsnmpdを再起動します。

#services snmpd restart

再起動後、動作を確認します。
snmpwalkというツールを使用します。

#snmpwalk -v 2c -c private 127.0.0.1

ずらっと情報が出力されれば、とりあえずローカルとしては動作してます。

confの読み取り専用化
SNMPの設定ファイルはコミュニティ名が直接記述されているため、パーミッションを600として制限します。

# chmod 600 /etc/snmp/snmpd.conf


各セクションの意味
デフォルトのsnmpd.confを編集する場合、最低限記述するセクションは四つです。

com2sec セキュリティ名。コミュニティ名とそこにアクセスできるアドレス範囲(とその名称)を定義します。
group   グループ名。
view    取得を許可する情報の範囲
access   グループに対するアクセス権


com2sec

SNMPで情報取得する際のパスワードに相当するコミュニティ名と、それを使用しても良いネットワークを定義します。
後のgroup定義で使用します。

com2sec mynetwork1 192.168.1.0/24 public
com2sec manager 192.168.2.100 private
com2sec local 127.0.0.1 private

192.168.1.0のネットワークとホスト192.168.2.100であれば、コミュニティ名「public」を使用してアクセスすることができます。
ある程度信用できるローカルアドレスは「private」を使用してアクセスできます。
つまりコミュニティ名の使用は、ネットワーク単位に許可されます。
publicは読み取り専用コミュニティ名、privateは読み取り書き込みコミュニティ名のデフォルトの値です。
コミュニティ名はパスワードに相当するのですから、デフォルトの使用は避けるべきです。複雑なものにしましょう。

情報変更するようなマネージャがネットワーク内になければ、コミュニティ名は一種類で良いでしょう。



group

先ほど定義したセキュリティ定義(セグメント、コミュニティ名)にSNMPバージョン(v1、v2、v3)をくくりつけます。
後のaccess定義で使用します。

group mynetwork_grp v1 mynetwork1
group mynetwork_grp v2c mynetwork1
group manager v1 local
group manager v2c local
group local_group v1 local
group local_group v2c local
group local_group usm local

前述のセキュリティ定義にSNMPプロトコルバージョンを負荷しています。
v1はもちろんVer1、v2cはVer2を表し、usmはVer3を意味します。
とは言え、SNMPでVer3を実際に運用するのはちょっと専門的あるいは統率されたネットワークでしょう。
サーバ等通常のシステムならVer2、簡単なNW機器程度ならVer1までしょう。

グループ名にはMyRWGroup、MyROGroupのような名前をよく見かけます。RWはReadWrite、ROはReadOnlyの略です。
グループ名でその役割が判別できるので間違いが少ないでしょう。



view

viewはセキュリティグループがどこまでSNMP情報(OID)を取得できるかを指定します。
後のaccess定義で使用します。

view   all   included   .1   80

一番気を付けるのは「.1(ドットイチ)」です。

例えばAグループにはOS情報のみ、Bグループにはネットワーク情報のみ、といった風に使います。
このallという定義では、一番上の「.1」以降は全部含む(許可)するという意味です。
普通に構築するシステムなら「全部見せる」がメジャーでしょう。

OIDは「.1.3.6.1.4.1.2021」などのようにドットで区切られた値です。

includedは含む、つまり含む範囲を許可する、という意味です。
excludedは含まない、つまりその範囲を許可しない、という意味です。

最後の謎の80ですが、別にポート番号ではなく16進数のマスクです。
そう、80だから「1000 0000」となります。
サブネットマスクと同じ計算方法で考えれば、一桁目の「.1」以下の値については全て同属と考えます。

もし「.1.3.6.1」以降のみを含む定義をするとします。
OIDが4ケタですからマスクは「1111 0000」となります。なのでマスク値は「F0」となります。

view   manage2 included   .1.3.6.1   f0

マスクは省略しても動作します。



access

accessは今まで定義したものを使用する、最後の定義です。

access   mynetwork_grp ""   any   noauth   exact   all   none   none
access   manager   ""   any   noauth   exact   all   all   none
access   local_group   ""   any   noauth   exact   all   all   none

なにやらややこしいですが、v1、v2を使用した場合「"" any noauth exact」は鉄板です。覚えておきましょう。

access  
mynetwork_grp   ""   any   noauth   exact   all    none   none

赤字以外の部分で、太字のグループ名とview定義だけです。

エントリの文法は以下のようになっています

access グループ コンテキスト モデル セキュリティレベル プレフィックス 読み取り 書き込み 通知

グループ(mynetwork)
定義したグループ名を指定します。つまりcom2secとgroupで設定した、IPアドレス範囲、コミュニティ名、SNMPプロトコルバージョンの定義です。

コンテキスト("")
SNMP v3を使用する場合のみ、事前定義したコンテキストを指定します。複数のMIB実装から一意に指定するものです。v1、v2を使用している場合は空文字です。

モデル(any)
使用するSNMPのバージョンです。v1、v2c、usm、もしくは全てを示すanyを記述します。

セキュリティレベル(noauth)
v3のときのみ指定できる認証設定です。v1、v2の場合はnoauthを指定します。

プレフィックス(exact)
v3のときのみ指定する、コンテキストの一致条件。exactは厳密一致。v1、v2の場合はexactを指定します。

読み取り権限(all)
読み取りに使用する、事前定義したviewです。

書き込み権限(none)
書き込みに使用する、事前定義したview。無ければnoneを指定します。

通知対象(none)
トラップ通知に使用する。事前定義したview定義。無ければnoneを指定します。






prev.gif