【接続したら】SoftEther Server 接続検知設定【メールでお知らせ】

SoftEther Server にVPN接続してきたときにメールで通知を投げるように設定します

SoftEtherのログ監視には swatch を利用
　※ swatch についてはこちらを参照：[Qiita swatchでログ監視、メール送信](http://qiita.com/tukiyo3/items/258fa8fa8c48f05db1c9)

SoftEtherのログはファイル名に日付がついている形式なので、ファイルの切り替わりを検知するために incron を利用
　※ incron についてはこちらを参照：[Qiita incronを使ってみた](http://qiita.com/k-suzuki/items/4a94ebeda9ec75fdad40)

SoftEther は言語が選べるので、とりあえず日本語と英語のログに対応しときます
　※ 言語の切り替えはこちらを参照：[Qiita SoftetherVPNの言語設定をEngilishへ変更](http://qiita.com/0xmks/items/81357940986d3a4f155c)
　※ swatch の 設定に日本語と英語の両方のパターンを定義して対応です

この手順ではメールの送信に ssmtp を利用します
　※ ssmtp のインストールや設定はこちらを参照：[Qiita 【ssmtp】CentOSでログイン通知【rsyslog】](http://qiita.com/nobu-maple/items/34d052ddfe2fbab4e79c)
　※ メールの文字コードに UTF-8 を指定しているので環境によっては文字化けるかも（手抜き）
　※ メール送信用シェルを書き換えればなんにでも通知を投げれます（たとえばslackとか）


## incron,swatch インストール（ログ、ディレクトリ監視用）

```
# mkdir -p /usr/local/src/yum/23.softether_watch
# cd       /usr/local/src/yum/23.softether_watch
# yum --enablerepo=epel          \
      --downloadonly             \
      --downloaddir=./           \
      install                    \
      swatch                     \
      incron                     \

# yum localinstall *.rpm
```

## ログ監視（swatch）設定（接続・切断・認証失敗のログを監視）

それぞれのキーワードでログをひっかけて、exec で外部コマンドを呼び出してます
接続の失敗も検知するようにしてますが、大量にメールが来ても困るので ６０秒以内に３回間違えたら通知するように制限もかけときます

```
# mkdir /usr/local/vpnswatch
# cd    /usr/local/vpnswatch
# vi vpnswatchrc
      # swatch で vpnserver のログを監視する
      
      # 通信を開始したら通知
      watchfor /\[HUB.* セッション .*: VPN Client の詳細:/
          exec /usr/local/vpnswatch/sendmail.sh 'Connect' '$_'
      
      watchfor /\[HUB.* Session .*: VPN Client details:/
          exec /usr/local/vpnswatch/sendmail.sh 'Connect' '$_'
      
      # 通信を終了したら通知
      watchfor /\[HUB.* セッション .*: セッションが終了しました/
          exec /usr/local/vpnswatch/sendmail.sh 'Disconnect' '$_'
      
      watchfor /\[HUB.* Session .*: The session has been terminated/
          exec /usr/local/vpnswatch/sendmail.sh 'Disconnect' '$_'
      
      # ユーザ認証失敗したら（６０秒間に３回間違えたら）通知
      watchfor /\[HUB.* コネクション .*: ユーザー認証に失敗/
          exec /usr/local/vpnswatch/sendmail.sh 'Fail' '$_'
          threshold track_by=/\[HUB.* コネクション .*: ユーザー認証に失敗/,type=both,count=3,seconds=60

      watchfor /\[HUB.* Connection .*: User authentication failed/
          exec /usr/local/vpnswatch/sendmail.sh 'Fail' '$_'
          threshold track_by=/\[HUB.* Connection .*: User authentication failed/,type=both,count=3,seconds=60
```

## メール送信用シェル

ログでキーワードを検知したら呼ばれるシェル
とりあえず syslog にも情報を投げておいて、ssmtp でメールを送信します
メールアドレスはダミーなので自分のメールアドレスに変えないと届きませんよ

```
# vi sendmail.sh
      #!/bin/bash
      
      logger -p auth.crit -t vpnserver${1} "$2"
      
★    ADDR="test@mail.server.com"
      SUBJ="VPNSERVER ${1} : `hostname`"

      TYPE1='Content-Type: text/plain; charset="UTF-8"'
      TYPE2='Content-Transfer-Encoding: 7bit'

      HEADER="${TYPE1}\n${TYPE2}\nFrom: ${ADDR}\nTo: ${ADDR}\nSubject: ${SUBJ}"
      
      echo -e "${HEADER}\n\nVPNServer ${1}\n\n${2}\n" | \
      ssmtp -s ${ADDR}


# chmod 700  /usr/local/vpnswatch/sendmail.sh
```

## ログ監視のサービス化（デーモン化 - vpnserver の起動後に起動）

vpnserver が起動してないときは監視しない
（vpnserver側の起動後条件にログ監視を追加しとくと良いかも）

```
# vi /usr/lib/systemd/system/vpnswatch.service
      [Unit]
      Description=SoftEther VPN Server Log Simple Watch
      After=network.target
★    After=vpnserver.service
      
      [Service]
      Type=forking
      ExecStart=/usr/local/vpnswatch/vpnswatch start
      ExecStop=/usr/local/vpnswatch/vpnswatch stop
      
      [Install]
      WantedBy=multi-user.target
```

## ログ監視サービス制御シェル

ログファイル名を動的に設定して swatch を起動します

```
# vi vpnswatch
      #!/bin/bash
      
      VPNDIR=/usr/local/vpnserver
      SWATCHDIR=/usr/local/vpnswatch
      SWATCHRC=${SWATCHDIR}/vpnswatchrc
      PIDFILE=${SWATCHDIR}/.vpnswatch.pid
      
      LOGDIR=${VPNDIR}/server_log
      LOG=${LOGDIR}/vpn_`date '+%Y%m%d'`.log
      
      # ログファイルが存在しなければ監視しない
      if [ ! -e ${LOG} ]
      then
        echo "vpnswatch not found logfile : ${LOG}"
        exit 0
      fi
      
      start() {
        # Start daemons.
        ls ${PIDFILE} > /dev/null 2>&1
        if [ $? -ne 0 ]
        then
          echo "Starting vpnswatch"
          /bin/swatch  \
            --config-file ${SWATCHRC}  \
            --script-dir  ${SWATCHDIR} \
            --pid-file    ${PIDFILE}   \
            --tail-file   ${LOG}       \
            --daemon
          RETVAL=$?
          return $RETVAL
        else
          echo "vpnswatch is already started"
        fi
      }
      
      stop() {
        # Stop daemons.
        ls ${PIDFILE} > /dev/null 2>&1
        if [ $? -eq 0 ]
        then
          echo "Shutting down vpnswatch"
          kill $(cat ${PIDFILE})
          rm -f ${PIDFILE}
          return 0
        else
          echo "vpnswatch is not running"
        fi
      }
      
      case "$1" in
        start)
          start
          ;;
        stop)
          stop
          ;;
        restart)
          stop
          start
          ;;
        *)
          echo "Usage: vpnswatch {start|stop|restart}"
          exit 1
      esac
      
      exit 0

# chmod 700 vpnswatch
```

## ログ監視サービス起動

```
# systemctl daemon-reload
# systemctl enable vpnswatch
# systemctl start  vpnswatch
```

## ログ切り替え監視設定
 ログディレクトリにファイルがCREATE されたら、ログ監視サービスを再起動するように incron に設定

```
# incrontab -e
      /usr/local/vpnserver/server_log IN_CREATE /usr/local/vpnswatch/vpnswatch restart
```

## ログ切り替え監視設定有効化

　reload は必須のようです

```
# incrontab --reload
# incrontab -l
# systemctl enable incrond
# systemctl start incrond
```

以上で接続検知設定は終了

きちんとメール送信がされるかをテストしておきます

# VPNServerへの接続検知テスト


##１）クライアントを起動して接続してみる

```
client# systemctl start vpnclient
      --> メール受信（Connect）
```

##２）クライアントから切断してみる

```
client# /usr/local/vpnclient/vpncmd  localhost  /CLIENT
> AccountDisconnect  USER1
      --> メール受信（Disconnect）
```
      
##３）クライアントでパスワードを間違えて接続してみる

 ３回リトライして失敗するまでしばらく待つべし

```
client# /usr/local/vpnclient/vpncmd  localhost  /CLIENT
> AccountPasswordSet  USER1  /TYPE:standard
> AccountConnect  USER1
      --> メール受信（Fail）
```
      
##４）クライアントでパスワードを戻して接続してみる

```
client# /usr/local/vpnclient/vpncmd  localhost  /CLIENT
> AccountDisconnect  USER1
      --> メール受信（Disconnect）
      
> AccountPasswordSet  USER1  /TYPE:standard
> AccountConnect  USER1
      --> メール受信（Connect）
```

ちゃんとそれぞれのタイミングでメールが届くこと！！