ヤマハRTXを利用したVPN接続の利用状況を把握したい

とらくらのインフラエンジニア、takaiです。

リモートワーク対応のためのVPN環境を準備してユーザーに提供している場合、セキュリティ管理の観点等からVPN接続の利用状況を把握したいと思うことがあると思います。
正常に利用できているか、不正接続の恐れはないか等、理由は様々です。

業務用ルーターやUTM等でVPN処理を行っている場合は接続処理の際に複数のログが出力されるので、その中のいくつかのログについて確認できれば目的を満たすことができます。

ヤマハRTXルーターの場合

ヤマハRTXの場合もVPN接続時にログが出力されますので、このログを検知して通知できれば要件を満たせそうです。

VPN利用状況を把握するにはVPN認証完了時に出力される下記ログメッセージを検知する事で、どのアカウントで認証されたかが把握できるのでわかりやすいと思います。

PP[ANONYMOUS01] Call detected from user 'User'

ログを検知する方法

RTXルーターで一番手軽な方法は、lua搭載のRTXルーターの場合、ヤマハルーター専用API rt.syslog を利用したluaスクリプトを作成して前記ログメッセージを検知してメール通知することでほぼリアルタイムで確認が行えます。

luaのバージョン1.08以降搭載のRTXルーターの場合はluaからのhttps接続が可能になりましたので、メールに代わってTeamsやSlackのWebhookを直接実行することも可能です。

luaスクリプトを利用することでルーター内で処理を完結することが可能なので、機材を増やすことなく手成に実現できるのが魅力です。

RTXルーターのLua仕様などは下記公式をご参照ください。
http://www.rtpro.yamaha.co.jp/RT/docs/lua/

ただし、社内のメールサーバーの仕様から、RTXルーターのメール通知が使用できなかったり、使用しているRTXルーター搭載のluaがhttpsに対応していない、そもそもRTXルーターを使っていないという事もあると思います。

luaスクリプトで対応できない場合

RTXルーター単体で対応できない場合、SYSLOGサーバーを活用する方法があります。
RTXルーターに限らず、法人向けルーターやUTMはSYSLOGサーバーへログを送付する機能がありますので、ヤマハRTX以外の機器でも活用できると思います。

今回はCentOS7やubuntu Server 20.xx 等で既定のSYSLOGサーバーに採用されているrsyslogを使用することとします。
今回の用途専用として、複数危機からのログ集約を目的としない場合、ラズパイでも問題ないですが、SDカードの劣化を早める原因となりますので、受信したsyslogの保存先には起動用SDカード以外のHDD等別のストレージを指定するようにしてください。

rsyslogの準備

外部からのsyslogを受信できるように UDP/514の受信設定を行います。
具体的な手順は既に多数公開されていますので、ここでは割愛します。
ファイヤーウォールが有効の場合は、こちらもUDP/514の許可設定を行います。

/etc/rsyslog.conf

# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

設定後、rsyslogサービスを再起動します。

RTXルーターの設定

次に、RTXルーター側でログ転送の設定を行いコンフィグをsaveします。
facilityは環境によって変更してください。

syslog host SYSLOGサーバーのIP
syslog local address RTXルーター自身のIP
syslog facility local5
syslog notice on
syslog info on

この段階で、SYSLOGサーバーへRTXルーターのログが送信されていますので、SYSLOGサーバー側で確認をします。

CentOSの場合は、/ver/log/message
ubuntuの場合は、/ver/log/syslog

に記録されます。

このままですと、ローカルで出力されるログとリモートで受信したログがまとめて記録されますので、必要に応じてrsyslogで記録先ログファイルの分離やlogrotateでログ保存期間の設定を行ってください。

Teams側の準備

Teameで通知を受けるためにはWebHook用のURLを取得する必要があります。

下記手順に従い、Teamsにて通知先のチャネルを選択して Incomming Webhookコネクタを有効にし、WebHook用のURLを取得します。

https://docs.microsoft.com/ja-jp/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook

VPNログの検知と通知

これで、RTXルーターのログがSYSLOGサーバーで受信できるようになりましたので、下記RTXルーターのログを検知して、通知する為の設定をrsyslogに行います。

尚、ログの前半と後半でrsyslogでの格納先変数が異なります。
$syslogtagには「PP[ANONYMOUS01] 」部分、
$msgには「Call detected from user ‘User’」部分が
格納されるため、これを考慮する必要があります。

PP[ANONYMOUS01] Call detected from user 'User'

rsyslogでログを検知後、TeamsやSlackに通知する場合はWebHookをしますのでシェルスクリプトを実行する形にします。
メール通知する場合はrsyslogの ommailモジュールが使用できます。

rsyslogからシェルスクリプトを実行する方法は、旧来の方法と omprogモジュールを使用する方法があるので、どちらかお好きな方で設定します。

旧来の方法

旧来の方法で設定する場合、指定するシェルスクリプトへメッセージ内容を渡す場合、引数渡しの仕様となるので、下記のような形になります。

/etc/rsyslog.d/WebHook_Teams_argument.sh

#!/bin/bash

WEBHOOK_URL='https://<TeamsのWebHook用URL>'

MESSAGE=`echo $@ | sed -z 's/\n//g'`
curl -H "Content-Type: application/json" -d "{\"text\":\"${MESSAGE}\"}" $WEBHOOK_URL

作成したシェルスクリプトのパーミッションを755に設定後、動作確認を行います。
引数指定で実行してTeamsに通知が飛べば成功です。

$cd /etc/rsyslog.d
$.\WebHook_Teams_argument.sh test message

次に、rsyslog用のconfを作成します。
条件判断はプロパティベースのフィルタ形式で記載しています。

/etc/rsyslog.d/VPN_Login_Teams_argument.conf

$template login_msg_argument, "%timegenerated% %fromhost-ip% %syslogtag% %msg%\n"

:msg, contains, "Call detected from user" ^/etc/rsyslog.d/WebHook_Teams_argument.sh;login_msg_argument

omprogモジュールを使用する方法

omprogモジュールを使用する方法で設定する場合や、指定するシェルスクリプトへメッセージ内容を渡す場合、標準入力渡しの仕様となり、rsyslogと共にシェルスクリプトも常駐待ち受けする必要がある為、下記のような形になります。

/etc/rsyslog.d/WebHook_Teams_stdin.sh

#!/bin/bash

WEBHOOK_URL='https://<TeamsのWebHook用URL>'

while read LINE; do
MESSAGE=`echo $LINE | sed -z 's/\n//g'`
curl -H "Content-Type: application/json" -d "{\"text\":\"${MESSAGE}\"}" $WEBHOOK_URL
done

作成したシェルスクリプトのパーミッションを755に設定後、動作確認を行います。
実行すると入力待ち状態になりますので、テストメッセージを入力してTeamsに通知が飛べば成功です。
成功したら、Ctrl+Cで終了させておきます。

$cd /etc/rsyslog.d
$.\WebHook_Teams_stdin.sh

test message

次に、rsyslog用のconfを作成します。
条件判断はIFthenを使用した式ベースのフィルタ形式で記載しています。

/etc/rsyslog.d/VPN_Login_Teams_stdin.conf

$template login_msg, "%timegenerated% %fromhost-ip% %syslogtag% %msg%\n"

module(load="omprog")

if \
    ($syslogtag contains 'ANONYMOUS' and $msg contains 'Call detected from user') \
then {
    action(
        type="omprog"
        binary="/etc/rsyslog.d/WebHook_Teams_stdin.sh"
        template="login_msg"
    )
}

動作確認

設定が終わりましたら、rsyslogの構文チェックを行いエラーがない事を確認します。

rsyslogd -N 1 -c /etc/rsyslog.d/WebHook_Teams_stdin.sh

構文エラーがない事を確認した後、rsyslogを再起動します。

systemctl restart rsyslog

その後、RTXルーターへVPNログインを行い、Teamsに通知が飛べば成功です。
上手く通知が飛ばない場合、SELinux等でブロックされていないか確認してください。

追加の設定

これで、VPNログインの状況を把握する為の通知設定は完了しましたが、場合によっては各ユーザーの接続時間も把握したい場合もあると思います。

その場合は、検出条件を追加することで可能になります。
VPN接続時にRTXルーターが出力するログの中から下記ログを検知するようにします。

尚、①で割り当たるTunnel番号([4]の部分)と②で割り当たるPP ANONYMOUS番号(01の部分)の組み合わせは接続タイミング次第で異なりますが、①②の間で出力されるログの中に関連性の紐づけが確認できる内容のログが確認できないため、ログの通知日時を目安に紐づける必要があり、①と④の通知日時間が②で記録されたユーザーの接続時間相当になります。

①IP Tunnel[4] Up
②PP[ANONYMOUS01] Call detected from user ‘User’
③PP[ANONYMOUS01] PPP/IPCP up (Local: RTXルーター自身のIP, Remote: VPN端末に割り当てられた社内側のIP)
④IP Tunnel[4] Down

複数の条件にマッチさせたい場合は、条件の定義をIFthenを使用した式ベースのフィルタ形式で記載すると、まとめて記載することができます。

尚、下記定義の場合TunnelのUp/Downを無条件に通知しますので、AWS拠点間VPNやV6Pulus等の Tunnel についても通知されます。

$template login_msg, "%timegenerated% %fromhost-ip% %syslogtag% %msg%\n"

module(load="omprog")

if \
    ($syslogtag contains 'ANONYMOUS' and $msg contains 'Call detected from user') \
    or ($syslogtag contains 'ANONYMOUS' and $msg contains 'PPP/IPCP up') \
    or ($syslogtag contains 'Tunnel' and $msg contains 'Up') \
    or ($syslogtag contains 'Tunnel' and $msg contains 'Down') \
then {
    action(
        type="omprog"
        binary="/etc/rsyslog.d/WebHook_Teams_stdin.sh"
        template="login_msg"
    )
}

さいごに

本例ではTeamsへの通知を作成しましたが、Slackへ通知する場合も呼び出すシェルスクリプトをSlack用に変更する事で対応ができます。

尚、頻繁に通知が来ると思いますので、TeamsやSlackの通知先チャネル側での通知設定は無効にしておくとよいかもしれません。

又、シェルスクリプト自体は受け取った文字列をそのまま通知しているだけですので、rsyslog以外でも汎用的に使用することもできると思います。

最短でAWSを習得したい方におすすめ!
オンラインスクール「とらくら」

当ブログを運営しているオンラインスクール「とらくら」では、認定資格を取得するために必要なAWSの主要サービスの知識を、理論学習だけでなく、環境構築をハンズオン形式で実践できるカリキュラムをご用意しています。
参考書や模擬試験対策だけでは中々イメージができない内容でも「座学+実践」で効率良くインプットが可能です。

随時、個別の無料説明会を開催していますので、AWSの習得をお考えの方は、お気軽にお申込みください。


AWS WordPress環境構築コース、受講生募集中! インフラ構築コース、受講生募集中!

投稿者プロフィール

takai
takai
<インフラエンジニア>
■ 家電量販店での商品販売や配送、設置、テクニカル対応等の経験と知識を活用し、Windows環境を主としてオンプレミスの端末、サーバー、ネットワーク構築・運用経験豊富なエンジニア。
■ 広く浅くDIY、電子工作、車、カメラ、動画撮影など多岐色々なことに興味を持ち、自宅に簡易な検証環境を構築して日々コンピュータと戯れている逸般人

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です