WindowsからSNMPTRAPを発報しよう

# やること

Windows2016評価版を使って、SNMPTRAPを発報してみる。

(余談)Zabbixでイベントログを収集・アラーム可能だが、イベントログは雑多の情報が入り混じるため、昔ながらのSNMPTRAPが一番落ち着くのだ。

# 登場人物
* windows2016サーバ (kvmのguestOSとして稼働)
* centos7(snmptrapd)サーバ(kvmのguestOSとして稼働)


# 設定情報
| 設定項目 | 値 | 新規or既存 |
| ------- | --- | --- |
| snmptrap宛先IP | 192.168.10.189 | 新規 | 
| (イベント)ログ名 | Application | 既存 | 
| (イベント)ソース | Testbatch | 新規 | 
| (イベント)ID | 1 | 既存(未設定) | 
※個人環境なので適宜読み替えてください。

# 手順
1. SNMPサービスの追加と設定
2. イベントログのソースを事前に追加
3. evntwin(イベント⇒snmptrap)の設定
4. イベントを書き込んで検証

## SNMPサービスの追加と設定

### SNMPサービスの追加

「サーバーマネージャー」⇒「役割と機能の追加ウィザード」⇒「機能」から、「SNMPサービス」を追加
SNMPサービスを追加インストールしておかないと、SNMPTRAP飛ばせないし、evntwinコマンドもインストールされないので必須です。

### SNMPサービス設定

「サーバーマネージャー」⇒「サービス」⇒「トラップ」画面で以下を設定。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/82244/5365b2e1-711a-cba6-838c-daec9d881254.png)

コミュニティ名を追加し、次にトラップ送信先を追加。


## イベントログのソースを事前に追加

```ruby:イベントログのソースを事前登録
new-eventlog -logname application -source Testbatch
```
* Windows2016では、上記設定が必要のようです。
* new-eventlogせずに、write-eventlogすると、以下のメッセージが出てしいました。

```ruby:エラーメッセージ
write-eventlog：ソース名"Testbatch"はコンピューター"localhost"に存在しません。
```
* 2012/2008の時は、いきなりwrite-eventlogでもOKだったような気がするけどなぁ。

* 試しに、write-eventlogが正常終了することを確認する。

```ruby:write-eventlog
write-eventlog -logname application -source Testbatch -entrytype error -eventid 1 -message "test#1 event" 
```
## evntwin(イベント⇒snmptrap)の設定

### evntwinの実行
powershellプロンプトより、evntwinを実行
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82244/eaa280d8-89f9-f366-a604-e9d6b1cd8059.png)

eventwinを立ち上げた直後に、画面右下の「編集(E)>>」をクリックすると、上記のような画面になります。
あとは、Application中のTestbatchを選択して、トラップにしたいイベントID=1を選択する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/82244/16656d66-fe35-5bb1-64bb-117ee9db8555.png)

何も触らずに、「OK」を押すのみです。

## これで設定終了。

## イベントを書き込んで検証

### windowsにて、write-eventlogを実行してみる。
```ruby:write-eventlog
write-eventlog -logname application -source Testbatch -entrytype error -eventid 1 -message "test#1 event" 
```
イベントログに書き込まれていることを確認したら、次を確認。

### snmptrap受信側で確認


```ruby:生のsnmptrapd.log
May 18 07:54:34 localhost snmptrapd[2298]: 2017-05-18 07:54:34 192.168.10.83(via UDP: [192.168.10.83]:57165->[192.168.10.189]:162) TRAP, SNMP v1, community public#012#011.1.3.6.1.4.1.311.1.13.1.9.84.101.115.116.98.97.116.99.104 Enterprise Specific Trap (1) Uptime: 0:13:42.78#012#011.1.3.6.1.4.1.311.1.13.1.9999.1.0 = STRING: "test#1 event#015#012"#011.1.3.6.1.4.1.311.1.13.1.9999.2.0 = STRING: "Unknown"#011.1.3.6.1.4.1.311.1.13.1.9999.3.0 = STRING: "win2016"#011.1.3.6.1.4.1.311.1.13.1.9999.4.0 = STRING: "1"#011.1.3.6.1.4.1.311.1.13.1.9999.5.0 = STRING: "1"#011.1.3.6.1.4.1.311.1.13.1.9999.6.0 = STRING: "test#1 event"
```
上記snmptrapd.logを見てわかるように、OIDの中身が

```ruby:OIDの中身を分解してみる
 .1.3.6.1.4.1.311.1.13.1.9.84.101.115.116.98.97.116.99.104
 .1.3.6.1.4.1.311.1.13.1 = 固定OID
 9 = strlen( Testbatch ) = 9文字
 84.101.115.116.98.97.116.99.104 = アスキーコードtoキャラクタすると"Testbatch"
```

```ruby:ASのCIIコード確認方法(例)
[root@sv ~]# echo  84.101.115.116.98.97.116.99.104 | sed 's/\./ /g'  | awk '{print "printf \"%x%x%x%x%x%x%x%x%x\n\" "$0;}' | sh
546573746261746368
[root@sv ~]#
```

# tips

* イベントのログ名を誤って作ってしまった場合(消したい場合)

```ruby:ログ名の削除
remove-eventlog -logname hogehoge
```
しかし、この作業後、イベントログの一部が記載されなくなってしまった。
※WindowsOSリブートすると何事もなかったように正常稼働した。

# 結果

* windows2012/2008と同じようにevntwin使えるが、new-eventlogしとかないとwrite-eventlogがエラーになる。
* トラップのOIDは、固定OIDに"ソースの文字列長"+"ソース名のasciicode"で構成される。
* (重要)同じイベントソースで、eventidのみを変えた場合は、specific-trapの情報のみが変更される。