snmpd 設定方法


snmpd 概要

snmpdはsnmpget等の問い合わせに応答してサーバの状態を返すSNMPの常駐プログラムです。サーバにsnmpdの設定を予め投入しておく事によって、統合監視ツールからの問い合わせに対して応答を返せるようになります。

よく混同される概念としてsnmptrapdが挙げられますが、snmptrapdは各機器がアラートとして発報するsnmptrapdを受信する常駐プログラムです。snmpdとは別ものですので、注意下さい。

以下Linux環境を中心に、snmpdの使い方を説明します。

snmpd インストールと最小限設定

snmpd インストール [必須]

snmpdはnet-snmpというパッケージによって提供されます。yumコマンドでnet-snmpをインストールして下さい。

インストールが完了したら、以下のコマンドでsnmpdを起動させます。

snmp-utils インストール [任意]

必須ではありませんが、net-snmp-utilsも併せてインストールする事をお勧めします。net-snmp-utilsは、snmpget, snmpwalkなどsnmpのデバッグを行うのに有用なツールを多数備えています。使い方については、後述いたします。

snmpd.conf 設定ファイルの説明

snmpdの設定は、/etc/snmp/snmpd.confというファイルに記述します。

snmpd.conf –  com2secの定義

snmpd.confには、com2secという定義が必要です。com2secは、 communityとsource ip addressの紐づけで、紐付けにはsecurity nameという名前を定義します。

設定例は以下のようになります。この設定の場合は、192.168.0.0/24からのpublicというコミュニティ名でアクセスする事を許可します。また、この192.168.0.0/24とpublicという紐付けに対してmynetというsecurity nameを定義します。

snmpd.conf – gruopの定義

snmpd.confには、groupという定義が必要です。groupは、 communityとsource ip addressの紐づけで、紐付けにはsecurity nameという名前を定義します。

設定例は以下のようになります。この設定の場合は、192.168.0.0/24からのpublicというコミュニティ名でアクセスする事を許可します。また、この192.168.0.0/24とpublicという紐付けに対してmynetというsecurity nameを定義します。

snmpd.conf – viewの定義

snmpd.confには、viewという定義が必要です。viewは、取得可能なOIDの範囲です。

設定例は以下のようになります。なお、maskの概念は難しいので、興味のない方は”おまじない”と思って設定しても良いと思います。maskの意味に興味のある方は後述のTipsをご覧ください。

snmpd.conf – accessの定義

snmpd.confには、accessという定義が必要です。accessは、 各security nameに対しての権限設定です。設定可能な権限は、読取, 書込, 通知 (read, write, notify) の3種類です。

設定例は以下のようになります。なお、context, sec.model, sec.level, prefixはSNMPv3で使用するパラメータですので、SNMPv1, SNMPv2cを使用する場合は盲目的に以下と同じ値を設定しても差し支えありません。

snmpd.conf 設定例の紹介

/etc/snmp/snmpd.conf の設定例を紹介します。

殆どの環境では、NMS (Network Management Station) からのアクセスのみをMIB値を許容するようにすれば、運用上問題ありません。また、localhostからSNMPの調査をするデバッグ作業をする事も多いので、localhostからのアクセスも許可した方が何かと便利な事が多いです。

このような事情を加味すると、snmpd.confの設定例は以下のようになります。なお、SMNのIPアドレスは192.168.1.1とし、コミュニティ名はfooとしております。

snmpd の起動

以下のコマンドでsnmpdを起動させます。

snmpd 動作確認

snmpwalkコマンド等を用いて、MIB値を取得できる事を確認します。sysDescrに確かに「Windows」と書かれている事を確認します。

snmpd 監視設定

snmpd 監視設定 – プロセス監視

snmpd.confにプロセス監視の設定を加筆する事によって、プロセス監視が可能になります。snmpd.confのプロセス監視の書式は以下の通りです。max, minはプロセス数の上限, 下限の閾値を表します。

プロセス監視の設定例は以下の通りです。/etc/snmp/snmpd.conf のどこに記述しても動作に影響はありませんが、メンテナンス性を考え”#proc sendmail 10 1″以下に記述するのが良いと思います。

動作確認方法は以下の通りです。prTable配下のMIB値を取得する事によって、プロセス数を把握する事ができます。

この時、特に注意深く見なければならないのはprCountとprErrorFlagです。prCountはプロセス数を返し、prErrorFlagはプロセス数の閾値に抵触した場合は”1″を返します。

snmpd 監視設定 – ディスク 残容量 監視

snmpd.confにディスク残容量監視の設定を加筆する事によって、ディスク残容量監視が可能になります。snmpd.confのディスク残容量監視の書式は以下の通りです。thresholdはメガバイト指定またはパーセント指定が可能です。

ディスク残容量監視の設定例は以下の通りです。/etc/snmp/snmpd.conf のどこに記述しても動作に影響はありませんが、メンテナンス性を考え”#disk / 10000″以下に記述するのが良いと思います。

動作確認方法は以下の通りです。dskTable配下のMIB値を取得する事によって、ディスク残容量を把握する事ができます。 

snmpd 監視設定 – ロードアベレージ 監視

ロードアベレージ ( load average) はsnmpd.confに特に設定を加筆しなくても、snmpによってロードアベレージの取得は可能です。しかし、snmpd.confにロードアベレージの閾値を定義する事によって、snmpによってロードアベレージが閾値を超えているかどうかを把握する事ができるようになります。snmpd.confのロードアベレージ監視の書式は以下の通りです。

ロードアベレージ監視の設定例は以下の通りです。/etc/snmp/snmpd.conf のどこに記述しても動作に影響はありませんが、メンテナンス性を考え”#load 12 14 14″以下に記述するのが良いと思います。

動作確認方法は以下の通りです。laTable配下のMIB値を取得する事によって、ロードアベレージを把握する事ができます。ロードアベレージの閾値を超えているかどうかは、laErrorFlagを参照下さい。

snmpd 監視設定 – 外部コマンドの実行

snmpd.confにextend句を加筆する事によって、snmpdによって外部コマンドを実行する事もできます。書式は以下の通りです。<miboid>は省略可能なパラメータですが、省略してしまうと記述順によってOIDが変わってしまいメンテナンス性が著しく損なわれます。ですので、miboidは省略しない事をお勧めします。

外部コマンドの設定例は以下の通りです。/etc/snmp/snmpd.conf のどこに記述しても動作に影響はありませんが、メンテナンス性を考え”# exec .1.3.6.1.4.1.2021.53 mailq /usr/bin/mailq”以下に記述するのが良いと思います。

余談になりますが、”exec”というのは過去の名残で、以前のバージョンのsnmpdはextendの代わりにexecというキーワードを使用していました。古い記事を見るとexecを使用している例が多数存在しますが、execは非推奨ですので使用しないように注意して下さい。

動作確認方法は以下の通りです。コマンドを実行した結果の標準出力がsnmpによって取得できる事を確認します。

snmpd ログ出力の抑制

CentOS 6.Xのデフォルト設定は問題ありませんが、Linuxのディストリビューションによっては/var/log/messagesに大量のsnmpdのログが出力されてしまい、本来のアラートが埋もれてしまうリスクがあります。

以下、snmpdのログを出さない方法について説明します。

snmpd ログ出力 仕様確認

snmpdのログ出力のデフォルト設定はLinuxディストリビューションによって異なります。もし、デフォルト設定が使いづらいと感じるならば、まずは設定を確認しましょう。

psコマンドにより、snmpdにどのような引数が渡されて実行されているのかを確認します。以下出力の場合は、” -Lsd -Lf /dev/null -p /var/run/snmpd.pid -a”という引数が渡されている事が読み取れます。

snmpdのマニュアルを読むと、ログ出力に関してはsnmpcmdも参照するように書かれています。snmpdに関するログ出力の仕様を、snmpdとsnmpcmdから一部抜粋したものが以下になります。

snmpd ログ出力の抑制

snmpdのログ出力に関する設定は/etc/sysconfig/snmpdに記載されています。/etc/sysconfig/snmpdを以下のように編集し、”-a”オプションを取り除く事でログが出力されないようになります。

なお、snmpdのログ出力に関する設定は、Linuxディストリビューションによって異なります。もし、/etc/sysconfig/snmpdが存在しない場合は、起動スクリプト(/etc/init.d/snmpd)より設定ファイルを探してください。

snmpd ログ出力の別ファイル化

“snmpdに関するログは出力したい。でも、/var/log/messagesが汚れるのはイヤだ”、そんなワガママな方は、snmpdログ出力の別ファイル化を検討します。

snmpd ログ出力の別ファイル化 – FACILITY 変更

/etc/sysconfig/snmpdを編集し、snmpdログ出力のfacilityをLOG_DAEMONからLOG_LOCAL0に変更します。なお、FACILITYは他のログ出力と重複がないよう適当な値を選択下さい。LOG_LOCAL0は一例に過ぎません。

設定を反映させるようsnmpdを再起動します (reloadでは設定が反映されません) 。

snmpd ログ出力の別ファイル化 – rsyslogd設定

snmpdからrsyslogdにログを転送し、rsyslogdはログをファイル出力するよう設定します。LOG_LOCAL0を/var/log/snmpd.logに出力するように設定します。/etc/sysconfig/rsyslogを以下のように編集して下さい。(CentOS 5.Xの場合は、デフォルトでインストールされているsyslogdを使う事が多いと思います。syslogdの設定については省略します。)

rsyslogdを再起動し、設定を反映させます。

しばらく待ち、snmpdに関するログが/var/log/snmpd.logに出力されている事を確認します。

snmpd ログ出力の別ファイル化 – logrotate.d設定

これだけの設定では/var/log/snmpd.logが無限に肥大化してしまうので、ログローテーションの設定を行いましょう。/etc/logrotate.d/syslogを以下のように編集し、snmpdに関するログがローテートされるようにします。

logrotateコマンドを実行し、ログローテートが正常に行われるかどうかを確認します。-fを指定する事によって、強制的にログローテーションを実行する事ができます。

ログローテーションされたsnmpdのログファイルが作成された事を確認します。

Windows環境におけるsnmpd

Windows環境でもLinuxのsnmpdと似たような設定が可能です。但し、OSによって用語が若干異なるので注意が必要です。

Windows環境 snmpd インストール

Windows Serverの場合は、「サーバの役割と機能」からsnmpdを追加する事ができます。「サーバーマネージャー」の画面で、SNMP機能をインストールします。この機能をインストールすると、LInux環境のsnmpdとsnmptrapがインストールされます。

windows_role_future_001

Windows環境 snmpd 設定

snmpdの設定は「サービス」の画面より行います。「プログラムとファイルの検索」に「services.msc」と入力し、「サービス」の画面を表示させます。

「SNMP Services」を右クリックし、「Properties」を選択します。

windows_snmp_services_001

「Security」タブでsnmpd.confに相当する設定が可能です。以下はコミュニティ名publicで全ホストからのアクセスを許容する設定ですが、SNMP接続元ホストや権限(例:読取専用)の設定も可能です。

windows_snmp_services_002

設定後、snmpwalkコマンド等を用いて、snmp getが可能である事を確認します。

Tips

mask 表記の説明

snmpd.confのviewはsubtreeとそのmaskで指定します。maskは2桁の16進数で表し、0である部分は任意の値で差し支えない事を表します。

例えば、substreeが”.1″で、maskが”80″というのは、全てのOIDを許可するという意味になります。16進数の0x80は2進数表記にすると10000000になります。全てのOIDは.1から始まりますので、全てのOIDを許可するという意味になります。

subtreeとmaskを表形式でまとめなおすと以下のようになります。計算結果行の”*”は任意の値を示します。

subtree1
mask10000000
計算結果1*******

理解を深めるために、 もうひとつ例を挙げます。以下はnetwork interfaceに関するOIDのみ許可する例です。ifEntryは数値表記に変換すると.1.3.6.1.2.1.2.2.1で、0xff:8は2進数表記で11111111:1000です。maskが8bitを超える場合は、maskは8bit毎に”:”で区切って表記して下さい。

subtreeとmaskを表形式でまとめなおすと以下のようになります。計算結果行の”*”は任意の値を示します。

subtree1361 2122 1
mask1111 1111 1000
計算結果1361 2122 1***

snmp-utils の使い方

snmpdをメンテナンスできるようsnmp-utilの使い方を把握しておきましょう。 snmp-utilはたくさんのコマンドを備えていますが、私がよく使用するのはsnmpwalkとsnmptranslateの2つです。

snmpwalk

snmpwalkコマンドは指定したOID配下のMIB値を取得できます。MIB値を取得できるコマンドはsnmpget, snmpbulk等多数ありますが、私はsnmpwalkのみ覚えれば充分かと思います。よく使用する構文は以下の通りです。

snmptranslate

snmptranslateはOIDの名前/数値の変換を行うコマンドです。名前/数値の対応関係を調べる際の使用例は以下の通りです。

snmptranslateコマンドはTpオプションを付与する事ででツリー形式で表示する事ができます。

動作確認環境

Linuxの動作確認環境は以下の通りです。

  • 最終動作確認日 : 2015/01/03
  • CentOS 6.6 ( Sakura VPS )
  • net-snmp-libs-5.5-50
  • net-snmp-5.5-50

Windowsの動作確認環境は以下の通りです。

  • 最終動作確認日 : 2015/01/24
  • Microsoft Windows Server 2012 Base ( AWS : Amazon Web Services )

シェアする

  • このエントリーをはてなブックマークに追加

フォローする