2012年9月16日日曜日

[SNMP] トラップの受信設定

先日SNMPを設定したが、どうせなのでtrapdも設定してみる。 trapdはTRAP(ようは障害通報)を受信する機能。 「XXXな通報が来たら◯◯◯する」みたいな設定をするらしい。

trapの受信設定

設定の修正と再読み込み

snmptrapd.conf の修正

場所は「/etc/snmp/snmptrapd.conf」。
まずは全体的な設定

「doNotRetainNotificationLogs」はyesにすると「送信失敗時に再送信しない」?
「doNotLogTraps」はnoにすると「ログを出力しない」?
「doNotFork」はnoにすると「Forkしない」

次に受信元、「authCommunity TYPES COMMUNITY [SOURCE [OID | -v VIEW ]]」みたいに書けばいいらしい、今回はlogとexecuteとnetをpublicコミュニティから受信する。
「disableAuthorization」がnoなので「認証あり」


いよいよsyslogに出力する設定。
文法はこれ
traphandle トラップOID 受信時に実行するコマンド 引数
というわけで「すべてのTrap」を「syslogに出力」するには以下
traphandle default /usr/bin/logger


すべて合わせると以下のようになるっぽい
#### When Recieve Trap
#default : write to syslog
traphandle default /usr/bin/logger

#### Settings
doNotRetainNotificationLogs yes
doNotLogTraps no
doNotFork no
pidFile /var/run/snmptrapd.pid

# authCommunity   TYPES COMMUNITY   [SOURCE [OID | -v VIEW ]]
#authCommunity     log   "community" 192.168.1.0/24
authCommunity     log,execute,net   public
disableAuthorization no

設定の再読み込み

snmptrapdの設定を再読み込み
%sudo service snmptrapd reload

Trapの送信方法

トラップを送信するコマンドには「snmptrap」を使ってみる。 こいつがめんどくさくて、SNMPv1のときとSNMPv2cのとき、SNMPv3の時で使い方が違う・・・

SNMPv1の場合

以下はv1の時。
snmptrap -v 1 共通オプション エンタープライズOID 送信元ホスト名 一般トラップ番号 固有トラップ番号 時刻 [パラメータのOID 型 値]...
例えばこんな風になる。
 snmptrap -v 1 -c public 127.0.0.1 .1.3.6.1.4.1.8072.99999 127.0.0.1 6 1 '' .1.3.6.1.4.1.8072.99999.1 s "Test Message"
意味
共通オプション-c public 127.0.0.1コミュニティはpublic、送信先は127.0.0.1
エンタープライズOID.1.3.6.1.4.1.8072.99999net-SNMPのトラップ
送信元ホスト名127.0.0.1
一般トラップ番号6net-SNMP独自の電文なので、「ベンダ固有」
固有トラップ番号1トラップの番号
時刻''現在時刻
パラメータのOID.1.3.6.1.4.1.8072.99999.1トラップ
型s型、今回はString
値"TestMessage"内容

SNMPv2cやSNMPv3の場合

以下はv2cの時。
snmptrap -v 2c 共通オプション 時刻 トラップOID [OID 型 値]...
例えばこんな風になる。
snmptrap -v 2c -c public localhost '' .1.3.6.1.4.1.8072.99999 .1.3.6.1.4.1.8072.99999.1 s "Test Message"
意味
共通オプション-c public 127.0.0.1コミュニティはpublic、送信先は127.0.0.1
エンタープライズOID.1.3.6.1.4.1.8072.99999net-SNMPのトラップ
送信元ホスト名127.0.0.1
時刻''現在時刻
トラップのOID.1.3.6.1.4.1.8072.99999トラップ
パラメータのOID.1.3.6.1.4.1.8072.99999.1トラップ
型s型、今回はString
値"TestMessage"内容

送信してみる

というわけで、ためしに送信してみる。
% logger "==== This is SNMP Traptesting...===="
% sudo snmptrap -v 2c -c public localhost '' .1.3.6.1.4.1.8072.99999 .1.3.6.1.4.1.8072.99999.1 s "Test Message"
% sudo tail /var/log/messages
(前略)
Sep 16 15:14:33 myhost yosilove: ==== This is SNMP Traptesting...====
Sep 16 15:14:52 myhost snmptrapd[30522]: 2012-09-16 15:14:52 localhost [UDP: [127.0.0.1]:39309->[127.0.0.1]]:#012DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (597278044) 69 days, 3:06:20.44#011SNMPv2-MIB::snmpTrapOID.0 = OID: NET-SNMP-MIB::netSnmp.99999#011NET-SNMP-MIB::netSnmp.99999.1 = STRING: "Test Message"
Sep 16 15:14:52 myhost logger: localhost
Sep 16 15:14:52 myhost logger: UDP: [127.0.0.1]:39309->[127.0.0.1]
Sep 16 15:14:52 myhost logger: DISMAN-EVENT-MIB::sysUpTimeInstance 69:3:06:20.44
Sep 16 15:14:52 myhost logger: SNMPv2-MIB::snmpTrapOID.0 NET-SNMP-MIB::netSnmp.99999
Sep 16 15:14:52 myhost logger: NET-SNMP-MIB::netSnmp.99999.1 "Test Message"
どうやらできたらしい。

2012年7月29日日曜日

[SNMP]net-snmpインストールとsnmpdの設定

なんだかんだでSNMPに関わりそうになってきたので、 試しに自分の鯖にSNMP(net-snmp 5.5)入れてみたのでメモ。

インストール

yumでインストール
$sudo yum install net-snmp
これでなにやら「snmpconf」snmpd」「snmptrapd」 がインストールされるらしい。

あれ?参考サイトとかに書いてある「snmpwalk」がねぇぞ?
というわけでutilityも入れてみる。
$sudo yum install net-snmp-utils
これで以下のコマンドがインストールされる
$ snmp
snmpbulkget    snmpdelta      snmpinform     snmptable      snmptrapd
snmpbulkwalk   snmpdf         snmpnetstat    snmptest       snmpusm
snmpconf       snmpget        snmpset        snmptranslate  snmpvacm
snmpd          snmpgetnext    snmpstatus     snmptrap       snmpwalk


設定ファイルはここにできたらしい。
$ ls /etc/snmp/
snmpd.conf  snmptrapd.conf
ちゃんとサービスにも登録されてるらしい。
$ service snmpd status
snmpd is stopped
さっそくデーモン起動
$sudo service snmpd start
Starting snmpd:                                            [  OK  ]
初期状態で試してみる、オプションの意味は「-v 1(SNMPv1モード)」「-c public(publicコミュニティ)」 「localhost(エージェント名はlocalhost)」みたい。
$ snmpwalk -v 1 -c public localhost
SNMPv2-MIB::sysDescr.0 = STRING: (バージョン情報)
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (125598) 0:20:55.98
SNMPv2-MIB::sysContact.0 = STRING: Root  (configure /etc/snmp/snmp.local.conf)
SNMPv2-MIB::sysName.0 = STRING: (鯖のURI)
SNMPv2-MIB::sysLocation.0 = STRING: Unknown (edit /etc/snmp/snmpd.conf)
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (2) 0:00:00.02
SNMPv2-MIB::sysORID.1 = OID: SNMP-MPD-MIB::snmpMPDMIBObjects.3.1.1
SNMPv2-MIB::sysORID.2 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
SNMPv2-MIB::sysORID.3 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
SNMPv2-MIB::sysORID.4 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.5 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.6 = OID: IP-MIB::ip
SNMPv2-MIB::sysORID.7 = OID: UDP-MIB::udpMIB
SNMPv2-MIB::sysORID.8 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup
SNMPv2-MIB::sysORDescr.1 = STRING: The MIB for Message Processing and Dispatching.
SNMPv2-MIB::sysORDescr.2 = STRING: The MIB for Message Processing and Dispatching.
SNMPv2-MIB::sysORDescr.3 = STRING: The SNMP Management Architecture MIB.
SNMPv2-MIB::sysORDescr.4 = STRING: The MIB module for SNMPv2 entities
SNMPv2-MIB::sysORDescr.5 = STRING: The MIB module for managing TCP implementations
SNMPv2-MIB::sysORDescr.6 = STRING: The MIB module for managing IP and ICMP implementations
SNMPv2-MIB::sysORDescr.7 = STRING: The MIB module for managing UDP implementations
SNMPv2-MIB::sysORDescr.8 = STRING: View-based Access Control Model for SNMP.
SNMPv2-MIB::sysORUpTime.1 = Timeticks: (2) 0:00:00.02
SNMPv2-MIB::sysORUpTime.2 = Timeticks: (2) 0:00:00.02
SNMPv2-MIB::sysORUpTime.3 = Timeticks: (2) 0:00:00.02
SNMPv2-MIB::sysORUpTime.4 = Timeticks: (2) 0:00:00.02
SNMPv2-MIB::sysORUpTime.5 = Timeticks: (2) 0:00:00.02
SNMPv2-MIB::sysORUpTime.6 = Timeticks: (2) 0:00:00.02
SNMPv2-MIB::sysORUpTime.7 = Timeticks: (2) 0:00:00.02
SNMPv2-MIB::sysORUpTime.8 = Timeticks: (2) 0:00:00.02
HOST-RESOURCES-MIB::hrSystemUptime.0 = Timeticks: (173763490) 20 days, 2:40:34.90
End of MIB
うまくいったらしい、忘れないうちに自動起動の設定
$ chkconfig --list snmpd
snmpd           0:off 1:off 2:off 3:off 4:off 5:off 6:off
$ sudo chkconfig snmpd on
$ chkconfig --list snmpd
snmpd           0:off 1:off 2:on 3:on 4:on 5:on 6:off

snmpdの設定ファイル(snmpd.conf)を編集

設定ファイルを覗いてみると、だいたいどんなことができるのか書いてあった。 とりあえず幾つかは設定してみる。

Access Control(アクセスコントロール)

「1番目に、コミュニティ名とセキュリティ名を関連付ける」と書いてあるので、
とりあえず「セキュリティ名local(ソースはlocalhost)とコミュニティpublic」を関連付ける。
ネットワークの場合はsourceにネットワークアドレスを設定すりゃいいらしい。
####
# First, map the community name "public" into a "security name"

#       sec.name  source          community
#com2sec notConfigUser  default       public
com2sec local       localhost        public
com2sec mynetwork   192.168.0.0/24   public
「2番めに、セキュリティ名をグループ名に挿入する」と書いてある。
「sevurityModel」にはSNMPで用意されているセキュリティモデルを設定するらしい。

「local_group」に「セキュリティモデルv1、セキュリティ名local」「セキュリティモデルv2c、セキュリティ名local」「セキュリティモデルusm、セキュリティ名local」を追加した。
「mynet_group」にも同じように設定。
####
# Second, map the security name into a group name:

#       groupName      securityModel securityName
#group   notConfigGroup v1           notConfigUser
#group   notConfigGroup v2c           notConfigUser
group   local_group     v1           local
group   local_group     v2c          local
group   local_group     usm          local
group   mynet_group     v1           mynetwork 
group   mynet_group     v2c          mynetwork
group   mynet_group     usm          mynetwork
「3番目に、ビューを作る」とかいてあるので、
「all_view」というビューにサブツリー「.1(つまり全て)」を「included(追加)」する、マスクはかけない。
####
# Third, create a view for us to let the group have rights to:

# Make at least  snmpwalk -v 1 localhost -c public system fast again.
#       name           incl/excl     subtree         mask(optional)
#view    systemview    included   .1.3.6.1.2.1.1
#view    systemview    included   .1.3.6.1.2.1.25.1.1
view    all_view       included   .1
「最後に、アクセス権を設定する」とあるので、
グループに対してどのビューを読み込み・書き込み・通知
####
# Finally, grant the group read-only access to the systemview view.

#       group          context sec.model sec.level prefix read   write  notif
#access  notConfigGroup ""      any       noauth    exact  systemview none none
access  local_group     ""      any       noauth    exact  all_view none none
access  mynet_group     ""      any       noauth    exact  all_view none none
とりあえずここらで試してみるために再起動して実行してみると、なんかすごい量の情報が出てくる。
$ sudo service snmpd restart
Stopping snmpd:                                            [  OK  ]
Starting snmpd:                                            [  OK  ]
$ snmpwalk -v 1 -c public localhost
(省略)
修正前は「systemview」を使って「.1.3.6.1.2.1.1(systemグループ)」と「.1.3.6.1.2.1.25.1.1( hrSystemUptime)」の以下の情報しか見ていなかったが、修正後は「all_view」を使って「.1」以下の情報を表示するようにしたかららしい。

これで上記の設定がうまくいっていることが確認できた。


ちなみに、どんなサブツリーがあるかはMIBdepotの検索ページをわかるらしいが、そもそも検索キーワドすらわかんないという人はググるといい。 ちなみに規約的にはRFC1213だが、ベンダーが拡張することもできる(1.3.6.1.4系統)のでこれだけ読んだってよくわからないというね・・・

System contact information(コンタクト情報)

システムのコンタクト情報として、設置場所(syslocation)と管理者の連絡先(syscontact)を設定する。 複数設定しても最後に書いた一つしか採用されないらしいので、連絡先はMLとかがいいかも?
# It is also possible to set the sysContact and sysLocation system
# variables through the snmpd.conf file:

#syslocation Unknown (edit /etc/snmp/snmpd.conf)
#syscontact Root  (configure /etc/snmp/snmp.local.conf)
syslocation Sakura VPS 
syscontact Root  
再起動してsnmpwalkするとこんな感じ
ポイント:RFC1213で定義されているものについてはIDではなくオブジェクト名(systemとか)で指定できるらしい。
$ snmpwalk -v 1 -c public localhost system
SNMPv2-MIB::sysDescr.0 = STRING: Linux www8308uf.sakura.ne.jp 3.3.4 #1 SMP Thu May 3 17:49:57 JST 2012 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (447) 0:00:04.47
SNMPv2-MIB::sysContact.0 = STRING: Root 
(以下略)

Logging(ログの設定)

(そのうち確認する)

Process checks.(プロセス監視の設定)

とりあえず、今動いているプロセスを見てみる
$ snmpwalk -v2c -c public localhost HOST-RESOURCES-MIB::hrSWRunName
もしくは以下でもOK
$ snmpwalk -v2c -c public localhost 1.3.6.1.2.1.25.4.2.1.2
とりあえず、一旦止めても大丈夫そうなのを探してみる
HOST-RESOURCES-MIB::hrSWRunName.1168 = STRING: "ntpd"
設定ファイルに以下を追加。
ちなみに意味は「プロセスntpdが1個以上2個以下稼働していればOK」
英語でも書かれている通り、「proc ntpd」とすることもできる。
###############################################################################
# Process checks.
#
#  The following are examples of how to use the agent to check for
#  processes running on the host.  The syntax looks something like:
#
#  proc NAME [MAX=0] [MIN=0]
#
#  NAME:  the name of the process to check for.  It must match
#         exactly (ie, http will not find httpd processes).
#  MAX:   the maximum number allowed to be running.  Defaults to 0.
#  MIN:   the minimum number to be running.  Defaults to 0.
proc ntpd 2 1
確認には「1.3.6.1.4.1.2021.2」を使う
$ snmpwalk -v 1 localhost -c public .1.3.6.1.4.1.2021.2
UCD-SNMP-MIB::prIndex.1 = INTEGER: 1
UCD-SNMP-MIB::prNames.1 = STRING: ntpd
UCD-SNMP-MIB::prMin.1 = INTEGER: 1
UCD-SNMP-MIB::prMax.1 = INTEGER: 2
UCD-SNMP-MIB::prCount.1 = INTEGER: 1
UCD-SNMP-MIB::prErrorFlag.1 = INTEGER: noError(0)
UCD-SNMP-MIB::prErrMessage.1 = STRING: 
UCD-SNMP-MIB::prErrFix.1 = INTEGER: noError(0)
UCD-SNMP-MIB::prErrFixCmd.1 = STRING:
さて、止めてみるとどうなるか? エラーフラグが1になってるね
$ sudo service ntpd stop
Shutting down ntpd:                                        [  OK  ]
$ snmpwalk -v2c -c public localhost 1.3.6.1.2.1.25.4.2.1.2 |grep ntpd
$ snmpwalk -v 1 localhost -c public .1.3.6.1.4.1.2021.2
UCD-SNMP-MIB::prIndex.1 = INTEGER: 1
UCD-SNMP-MIB::prNames.1 = STRING: ntpd
UCD-SNMP-MIB::prMin.1 = INTEGER: 1
UCD-SNMP-MIB::prMax.1 = INTEGER: 2
UCD-SNMP-MIB::prCount.1 = INTEGER: 0
UCD-SNMP-MIB::prErrorFlag.1 = INTEGER: error(1)
UCD-SNMP-MIB::prErrMessage.1 = STRING: Too few ntpd running (# = 0)
UCD-SNMP-MIB::prErrFix.1 = INTEGER: noError(0)
UCD-SNMP-MIB::prErrFixCmd.1 = STRING: 
ntpdを再起動するとエラーも消えます。
$ sudo service ntpd start
Starting ntpd:                                             [  OK  ]
$ snmpwalk -v 1 localhost -c public .1.3.6.1.4.1.2021.2
UCD-SNMP-MIB::prIndex.1 = INTEGER: 1
UCD-SNMP-MIB::prNames.1 = STRING: ntpd
UCD-SNMP-MIB::prMin.1 = INTEGER: 1
UCD-SNMP-MIB::prMax.1 = INTEGER: 2
UCD-SNMP-MIB::prCount.1 = INTEGER: 1
UCD-SNMP-MIB::prErrorFlag.1 = INTEGER: noError(0)
UCD-SNMP-MIB::prErrMessage.1 = STRING: 
UCD-SNMP-MIB::prErrFix.1 = INTEGER: noError(0)
UCD-SNMP-MIB::prErrFixCmd.1 = STRING: 

Executables/scripts (スクリプト実行)

(そのうちためす)

disk checks (ディスク監視)

ディスクの空き容量などを監視できるらしい。 まずは現在の空き容量を確認してみる。
$ df
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/vda3            207098852  12853084 183878224   7% /
tmpfs                  1028012         0   1028012   0% /dev/shm
/dev/vda1               262276     97727    151297  40% /boot
とりあえずテストとして、ちょっとでも増えたらエラーになるように設定してみる。 「1.3.6.1.4.1.2021.9」で確認
###############################################################################
# disk checks
#

# The agent can check the amount of available disk space, and make
# sure it is above a set limit.

# disk PATH [MIN=100000]
#
# PATH:  mount path to the disk in question.
# MIN:   Disks with space below this value will have the Mib's errorFlag set.
#        Default value = 100000.

# Check the / partition and make sure it contains at least 10 megs.

#disk / 10000
disk / 183878000
再起動した後、設定が適用されたことを確認
$ sudo service snmpd restart
Stopping snmpd:                                            [  OK  ]
Starting snmpd:                                            [  OK  ]
$ snmpwalk -v 1 localhost -c public .1.3.6.1.4.1.2021.9
UCD-SNMP-MIB::dskIndex.1 = INTEGER: 1
UCD-SNMP-MIB::dskPath.1 = STRING: /
UCD-SNMP-MIB::dskDevice.1 = STRING: /dev/vda3
UCD-SNMP-MIB::dskMinimum.1 = INTEGER: 183878000
UCD-SNMP-MIB::dskMinPercent.1 = INTEGER: -1
UCD-SNMP-MIB::dskTotal.1 = INTEGER: 207098848
UCD-SNMP-MIB::dskAvail.1 = INTEGER: 183878208
UCD-SNMP-MIB::dskUsed.1 = INTEGER: 12853096
UCD-SNMP-MIB::dskPercent.1 = INTEGER: 7
UCD-SNMP-MIB::dskPercentNode.1 = INTEGER: 1
UCD-SNMP-MIB::dskTotalLow.1 = Gauge32: 207098848
UCD-SNMP-MIB::dskTotalHigh.1 = Gauge32: 0
UCD-SNMP-MIB::dskAvailLow.1 = Gauge32: 183878208
UCD-SNMP-MIB::dskAvailHigh.1 = Gauge32: 0
UCD-SNMP-MIB::dskUsedLow.1 = Gauge32: 12853096
UCD-SNMP-MIB::dskUsedHigh.1 = Gauge32: 0
UCD-SNMP-MIB::dskErrorFlag.1 = INTEGER: noError(0)
UCD-SNMP-MIB::dskErrorMsg.1 = STRING: 
とりあえずダミーファイルを作成
$  dd if=/dev/zero of=temp_file bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.00167384 s, 626 MB/s
$ ls -l temp_file 
-rw-r--r-- 1 myuser users 1048576  7月 29 17:42 2012 temp_file
確認してみると、たしかにエラーになっている。
$ snmpwalk -v 1 localhost -c public .1.3.6.1.4.1.2021.9
UCD-SNMP-MIB::dskIndex.1 = INTEGER: 1
UCD-SNMP-MIB::dskPath.1 = STRING: /
UCD-SNMP-MIB::dskDevice.1 = STRING: /dev/vda3
UCD-SNMP-MIB::dskMinimum.1 = INTEGER: 183878000
UCD-SNMP-MIB::dskMinPercent.1 = INTEGER: -1
UCD-SNMP-MIB::dskTotal.1 = INTEGER: 207098848
UCD-SNMP-MIB::dskAvail.1 = INTEGER: 183877184
UCD-SNMP-MIB::dskUsed.1 = INTEGER: 12854120
UCD-SNMP-MIB::dskPercent.1 = INTEGER: 7
UCD-SNMP-MIB::dskPercentNode.1 = INTEGER: 1
UCD-SNMP-MIB::dskTotalLow.1 = Gauge32: 207098848
UCD-SNMP-MIB::dskTotalHigh.1 = Gauge32: 0
UCD-SNMP-MIB::dskAvailLow.1 = Gauge32: 183877184
UCD-SNMP-MIB::dskAvailHigh.1 = Gauge32: 0
UCD-SNMP-MIB::dskUsedLow.1 = Gauge32: 12854120
UCD-SNMP-MIB::dskUsedHigh.1 = Gauge32: 0
UCD-SNMP-MIB::dskErrorFlag.1 = INTEGER: error(1)
UCD-SNMP-MIB::dskErrorMsg.1 = STRING: /: less than 183878000 free (= 183877184)

load average checks(ロードアベレージの監視)

ロードアベレージを監視して、一定以上になるとエラーにするように出来る。
でもわが鯖はこき使う前提なので特に設定しない。

Extensible sections(拡張セクション)

(そのうちためす)

Pass through control.

(そのうちためす)