この特集のトップページへ
この回のトップページへ

exec

 exec行を設定すると,特定のプログラムを実行し,その実行結果をSNMPのデータとして格納することができる。デフォルトのsnmpd.confファイルには,次のようなexec行がある。

execechotest /bin/echo hello world

 この設定は,“/bin/echo hello world”の実行結果――つまり,文字列"hello world"――をSNMPデータとして格納するというサンプルであり,大きな意味はない。

 exec行は,次の書式で指定する。

exec 設定名実行ファイルのフルパス名引数

 設定名の部分には,任意の名前を指定する。そして実行ファイルのフルパス名には,実行したいプログラムのフルパス名を,引数には,そのプログラムに渡したい引数を指定する。デフォルトの設定は,echotestという設定名で/bin/echoを引数“hello world”を伴って実行するという設定になっている。

 exec行にて指定した実行ファイルの実行結果は,extTableサブツリー(1.3.6.1.4.1.2021.8)内に配列の形で含まれる(Table 11)。exec行もproc行の設定と同様,snmpd.confファイルでの登場順に,先頭から,1,2,3…というインデックス番号が振られる。この例では,echotestという1つの項目しかないので,echotestという設定名を付けたexec行のインデックス番号は1となる。

Table 11 extTableサブツリー(1.3.6.1.4.1.2021.8
OID 1.3.6.1.4.1.2021.8.1
サブツリー名 extEntry
用途 配下に実行結果のデータを含むテーブルを保持する階層ツリー。値はない
OID 1.3.6.1.4.1.2021.8.1.1.i
サブツリー名 extIndex
用途 exec行の登場順に,先頭から順に1,2,と割り当てられたインデックス番号。iの値と同じ
OID 1.3.6.1.4.1.2021.8.1.2.i
サブツリー名 extNames
用途 exec行の設定名に指定した名前
OID 1.3.6.1.4.1.2021.8.1.3.i
サブツリー名 extCommand
用途 exec行に指定した実行ファイルのフルパス名引数
OID 1.3.6.1.4.1.2021.8.1.100.i
サブツリー名 extResult
用途 extCommandで指定された実行ファイルが実行時に返したエラーコード(戻り値)
OID 1.3.6.1.4.1.2021.8.1.101.i
サブツリー名 extOutput
用途 extCommandで指定された実行ファイルの実行結果(標準出力に書き出された文字列)の1行目。1行目以降は切り捨てられる
OID 1.3.6.1.4.1.2021.8.1.102.i
サブツリー名 extErrFix
用途 管理者がこのオブジェクトに1を設定すると,あらかじめsnmpd.confファイルのexecfix行で指定したコマンドが実行される
OID 1.3.6.1.4.1.2021.8.1.103.i
サブツリー名 extErrFixCmd
用途 extErrFixに1が設定されたときに実行されるコマンド名
iはインデックス番号。snmpd.confファイル中に出てきたexec行の登場順に,先頭から1,2,3,…という値。

 Table 11に示したように,exec行で指定したプログラムの実行結果は,“1.3.6.1.4.1.2021.8.1.100.i”と“1.3.6.1.4.2021.8.1.101.i”にそれぞれ格納される。前者には,実行したプログラムのエラーコード,後者には,プログラムが標準出力に書き出した1行目がそれぞれ格納される。デフォルトのsnmpd.confファイルでは,/bin/echoコマンドを使って“hello world”と書き出している。そのため,“1.3.6.1.4.2021.8.1.101.1”の値が“hello world”に設定される。これはsnmpwalkコマンドを使ってextTableサブツリー(1.3.6.1.4.1.2021.8)を参照すれば確認できる。

$ snmpwalk localhost private .1.3.6.1.4.1.2021.8
enterprises.ucdavis.extTable.extEntry.extIndex.1 = 1
enterprises.ucdavis.extTable.extEntry.extNames.1 = echotest
enterprises.ucdavis.extTable.extEntry.extCommand.1 = /bin/echo hello world
enterprises.ucdavis.extTable.extEntry.extResult.1 = 0
enterprises.ucdavis.extTable.extEntry.extOutput.1 = hello world
enterprises.ucdavis.extTable.extEntry.extErrFix.1 = 0
enterprises.ucdavis.extTable.extEntry.extErrFixCmd.1 =

 exec行での設定は,さまざまな用途に使うことができる。たとえば,メールキューの情報を調べて,その数を返すようなスクリプトを用意すれば,SNMPを通じて,現在メールキューに溜まっているメールの数を調べるようなことができる。

 なおexec行を設定するとき,特定のOIDを指定すると,指定した実行ファイルの実行結果を1行ごとに配列として階層ツリーに格納することもできる(その場合,Table 11に示した階層ツリーが若干異なる)。詳細はucd-snmpのmanを参照してほしい。

 exec行の設定では,任意のプログラムを実行できるので自由度が高い反面,セキュリティには十分注意していただきたい。snmpdrootユーザーで動作するため,exec行で指定した各種実行ファイルは,rootユーザーのもとで実行される。よってセキュリティ上懸念がありそうなプログラムを指定するのは避けるべきだ。もちろん,snmpdから実行される実行ファイルは,rootユーザー以外には書き換えできないようにするべきだ。そうしないとsnmpdから実行されるプログラムが他のユーザーに書き換えられてしまい,想定しなかったプログラムがrootユーザーの権限で実行されることになるだろう。

 また,exec行での設定は,proc行の設定と同様,管理者がSNMPマネージャを使ってextErrFixオブジェクト(1.3.6.1.4.1.2021.8.1.102.i)に1を設定すると,snmpd.confファイル中のexecfix行で指定しておいたプログラムを実行することができるようになっている。そのときに実行するプログラム名を指定するのがexecfix行の設定だ。デフォルトのsnmpd.confファイルには,execfix行は1つもない。

 execfix行を設定すると,管理者がSNMPマネージャを使って,特定のプログラムを実行できるようになるが,セキュリティ対策をとらないと,悪用される危険性がある。本稿ではexecfix行の設定についての説明は割愛する。

PREV 21/36 NEXT