■Fortigateのsnmp/snmptrap/alert mailをdebian Wheezyで受信する。
■基本的な設定については以下を参照
2012/01/10 Debian Lenny + MRTGでCPU、メモリ、ディスク監視
http://d.hatena.ne.jp/labunix/20120110
2012/05/26 Squeezeでsnmpトラップの送受信テスト
http://d.hatena.ne.jp/labunix/20120526
2012/11/08 SNMPトラップでメールを送信(Squeeze)
http://d.hatena.ne.jp/labunix/20121108
■待ち受けIP/Portの設定の確認
$ sudo grep "^[as].*Addr" /etc/snmp/snmptrapd.conf /etc/snmp/snmpd.conf
/etc/snmp/snmptrapd.conf:snmpTrapdAddr udp:0.0.0.0:162
/etc/snmp/snmpd.conf:agentAddress udp:127.0.0.1:161,udp:172.31.31.254:161
■コミュニティ名はpublicとします。
$ sudo grep "^[ar].*[Cc]ommunity" /etc/snmp/snmptrapd.conf /etc/snmp/snmpd.conf
/etc/snmp/snmptrapd.conf:authCommunity log,execute,net public
/etc/snmp/snmpd.conf:rocommunity public localhost
■snmp、snmptrapの確認
$ netstat -an | grep "16[12]"
udp 0 0 172.31.31.254:161 0.0.0.0:*
udp 0 0 127.0.0.1:161 0.0.0.0:*
udp 0 0 0.0.0.0:162 0.0.0.0:*
■uptimeの取得
表示の方法がコマンドごとに異なるが、
いずれも「/proc/uptime」を参照している。
$ man proc 2>/dev/null | grep -A 1 /proc/uptime
/proc/uptime
このファイルは システム起動時から経過した時間 (秒) と アイドル (idle) しているプロセスが消費した時間 (秒) の 2 つの数を含む。
$ snmpwalk -c public -v 1 localhost .iso.3.6.1.2.1.25.1.1.0;cat /proc/uptime ;uptime
iso.3.6.1.2.1.25.1.1.0 = Timeticks: (111521321) 12 days, 21:46:53.21
1115213.22 1102413.57
23:41:09 up 12 days, 21:46, 3 users, load average: 0.00, 0.01, 0.05
■「Test Message」の送信
$ snmptrap -v 1 -c public localhost .1.3.6.1.4.1.8072.99999 localhost \
6 1 '' .1.3.6.1.4.1.8072.99999.1 s "Test Message" 2> /dev/null
$ sudo grep "Test" /var/log/syslog | sed s/": "/"\n"/g | tail -3
[127.0.0.1]:53214->[127.0.0.1]) TRAP, SNMP v1, community public#012#011iso.3.6.1.4.1.8072.99999 Enterprise Specific Trap (1) Uptime
12 days, 21:59:48.30#012#011iso.3.6.1.4.1.8072.99999.1 = STRING
"Test Message"
■snmptrapを受信したらroot宛にメールを送る設定を追加。
$ sudo grep ^traphandle /etc/snmp/snmptrapd.conf
traphandle default /usr/bin/mail -s "SNMP Trap Mail" root@`hostname -f`
$ sudo /etc/init.d/snmpd restart
■MIB検索機能の確認
デフォルトである「mibs :」はコメントアウト。
debianではmibsの検索先は事前に決まっているので、
カスタムMIBを追加後に追記するのは「MIBS all」のみ。
$ sudo grep mibs /etc/snmp/snmp.conf
$ snmptranslate -TB Cpu
UCD-SNMP-MIB::ssCpuRawSoftIRQ
■Fortigate側のsnmp設定
※「set」文に改行を追加しているので、設定に使う場合は注意。
$ echo -e "show system interface internal\nshow system snmp community\nshow system snmp sysinfo" | \
ssh admin@172.31.31.251 2>/dev/null | \
sed s/"av-virus\|av-bypass\|ha-member-up"/"\n\t&"/g | sed s/"^.*# "//g
config system interface
edit "internal"
set vdom "root"
set ip 172.31.31.251 255.255.255.0
set allowaccess ping https ssh snmp http telnet
set type physical
set snmp-index 1
next
end
config system snmp community
edit 1
set events cpu-high mem-low log-full intf-ip vpn-tun-up vpn-tun-down ha-switch ha-hb-failure ips-signature ips-anomaly
av-virus av-oversize av-pattern av-fragmented fm-if-change bgp-established bgp-backward-transition
ha-member-up ha-member-down ent-conf-change av-conserve
av-bypass av-oversize-passed av-oversize-blocked ips-pkg-update ips-fail-open faz-disconnect wc-ap-up wc-ap-down
config hosts
edit 1
set interface "internal"
set ip 172.31.31.254 255.255.255.255
next
end
set name "public"
next
end
config system snmp sysinfo
set status enable
end
■これで取得出来るようになる。
$ snmpwalk -v 1 -c public 172.31.31.251 | wc -l
897
$ snmpwalk -c public -v 1 172.31.31.251 .iso.3.6.1.2.1.47.1.1.1.1.10.1
iso.3.6.1.2.1.47.1.1.1.1.10.1 = STRING: "FortiGate-80C v5.00.5,build0252b252,131031"
■このOIDの値はLinuxには無い。
$ snmpget -v 1 -c public 172.31.31.251 .iso.3.6.1.2.1.47.1.1.1.1.10.1
iso.3.6.1.2.1.47.1.1.1.1.10.1 = STRING: "FortiGate-80C v5.00.5,build0252b252,131031"
$ snmpget -v 1 -c public 127.0.0.1 .iso.3.6.1.2.1.47.1.1.1.1.10.1
Error in packet
Reason: (noSuchName) There is no such variable name in this MIB.
Failed object: iso.3.6.1.2.1.47.1.1.1.1.10.1
■FortigateのWeb管理画面から以下にMIBのダウンロードリンクがある。
[システム]->[設定]->[SNMP]
FortiGate SNMP MIB
Download FortiGate MIB ファイル
Download Fortinet Core MIB ファイル
■「grep Version」で検索して「fgSysVersion」だろうと思う。
$ grep -A 7 "^fgSysVersion " FORTINET-FORTIGATE-MIB.mib
fgSysVersion OBJECT-TYPE
SYNTAX DisplayString (SIZE(0..128))
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Firmware version of the device"
:= { fgSystemInfo 1 }
■MIB情報を追加する。
$ sudo mkdir /usr/share/snmp/mibs/vender; \
sudo mv FORTINET-*.mib /usr/share/snmp/mibs/vender/;
$ snmptranslate -TB fgSysVersion
Unable to find a matching object identifier for "fgSysVersion"
$ snmptranslate -m +FORTINET-FORTIGATE-MIB -TB fgSysVersion
FORTINET-FORTIGATE-MIB::fgSysVersionIps
FORTINET-FORTIGATE-MIB::fgSysVersionAv
FORTINET-FORTIGATE-MIB::fgSysVersion
■これで、「MIBS all」すれば読み込めるところまで来た。
snmp/snmpd/snmptrapdのいずれにも影響しないので、再起動は要らない。
$ echo "MIBS all" | sudo tee -a /etc/snmp/snmp.conf
MIBS all
$ snmptranslate -TB fgSysVersion 2>&1 | grep ^FORTI
FORTINET-FORTIGATE-MIB::fgSysVersionIps
FORTINET-FORTIGATE-MIB::fgSysVersionAv
FORTINET-FORTIGATE-MIB::fgSysVersion
■「MIB all」をコメントアウトすれば元に戻る。
$ sudo sed -i s/"MIBS all"/"#&"/ /etc/snmp/snmp.conf; \
echo "# Not MIBS all"; \
snmptranslate -TB fgSysVersion 2>&1 | tail -3; \
sudo sed -i s/"#MIBS all"/"MIBS all"/ /etc/snmp/snmp.conf; \
echo "# MIB all"; \
snmptranslate -TB fgSysVersion 2>&1 | tail -3
Unable to find a matching object identifier for "fgSysVersion"
FORTINET-FORTIGATE-MIB::fgSysVersionIps
FORTINET-FORTIGATE-MIB::fgSysVersionAv
FORTINET-FORTIGATE-MIB::fgSysVersion
■トラップのチェックオンにした内容は以下すべて。
CPU高負荷
メモリ不足
ハードディスク空き容量不足
インターフェースIPアドレス変更
VPNトンネルアップ
VPNトンネルダウン
WiFiコントローラーAPアップ
WiFiコントローラーAPダウン
HAクラスタのステータス変化
HAハートビート障害
HAメンバーアップ
HAメンバーダウン
ウィルス検知
ファイルパターン一致による検知
分割されたEmailを検知
大きすぎるファイル/Emailを検知
大きすぎるファイル/Emailをブロック
大きすぎるファイル/Emailをパス
AVバイパスの発生
BGP Established
BGP Backward Transition
IPSアノマリ検知
IPS攻撃検知
IPSパッケージの更新
IPSネットワークキューオーバーフロー
System enters conserve mode
System configuration is changed
FortiAnalyzer切断
■alert-emailも設定しておく。
$ echo -e "show system email-server\nshow alertemail setting" | ssh admin@172.31.31.251 2> /dev/null | sed s/"^.*# "//g
admin@172.31.31.251s password:
config system email-server
set reply-to "FGT-UTM@myhome.local"
set server "172.31.31.254"
end
config alertemail setting
set username "FGT-UTM@myhome.local"
set mailto1 "labunix@myhome.local"
set filter-mode threshold
set severity notification
end