rtx1210でsyslog監視

rtx1210でsyslog監視

rtx1210は高価だけどネットワークの勉強をするにはいい教材。

ブラウザでログインしてポチポチ設定することから初め、設定ファイルを入れ込めば複雑なことができることもわかった。

コマンドラインでいろいろできることがわかったとき、設定ファイルがその積み上げ結果というのもわかった。

ブラウザから設定保存するとconfig0.txtっていうファイルが作成できる。

この設定ファイルに以下の内容を追記して、ログ監視してみる。
やってることはembedded fileっていうのを定義しておき、この内容をルータ起動時から実行させる。

ヤマハのページにsyslog監視のサンプルがあった。他にもいくつかググって方法を探し、試しながら作成。

検出したい文字列は、いったんlinuxの監視処理で使ってたものをそのまま流用。

embedded file tmp.txt <<EOF
--[[

  ●SYSLOG 監視スクリプト-gvis
  SYSLOG を監視し、特定の文字列が含まれたログを検出したら、
  指定したshow log コマンドの出力結果を管理者にメールで
  送信するスクリプトです。

  メール本文には監視実施日の日付に検出された特定の文字列の履歴を含みます。

  原本はyamahaさまの以下のページにあったものから改造作成し、
  複数文字列を監視するようにしています。
  
  https://network.yamaha.com/setting/router_firewall/monitor/lua_script/syslog

]]


--------------------------##  設定値  ##--------------------------------

-- 検出したい SYSLOG の文字列パターン
ptn_tbl = {                         -- ★
    "error",
    "ERROR",
    "Error",
    "fail",
    "Fail",
    "FAIL",
    "panic",
    "Panic",
    "PANIC",
    "warn",
    "Warn",
    "WARN",
    "respond",
    "connect",
    "TUNNEL",
    "Login",
    "Logout",
    "Restarting router"
}

-- ptn の文字列パターンを検出したときに結果を通知する show コマンド
cmd_whenFind = "show log reverse"   -- ★

-- メールの設定
mail_tbl = {                        -- ★
    smtp_address = "smtp.xxxx.jp",
    from = "xxxx@gavann-it.com",
    to = "xxxx@gavann-it.com"
}

-- メールの送信に失敗したときに出力する SYSLOG のレベル (info, debug, notice)
log_level = "info"                  -- ★

----------------------##  設定値ここまで  ##----------------------------


------------------------------------------------------------
-- コマンドを実行結果を出力する関数                       --
------------------------------------------------------------
function exec_command(cmd)
    local rtn, str

    rtn, str = rt.command(cmd)
    if (not rtn) or (not str) then
        str = "実行失敗\r\n"
    end

    return rtn, string.format("# %s\r\n%s\r\n", cmd, str)
end

------------------------------------------------------------
-- 現在の日時を取得する関数                               --
------------------------------------------------------------
function time_stamp()
    local t

    t = os.date("*t")
    return string.format("%d/%02d/%02d %02d:%02d:%02d", 
        t.year, t.month, t.day, t.hour, t.min, t.sec)
end

------------------------------------------------------------
-- 今日の日付を取得する関数                               --
------------------------------------------------------------
function date_today()
    local today

    today = os.date("*t")
    return string.format("%d/%02d/%02d", 
        today.year, today.month, today.day)
end

------------------------------------------------------------
-- メインルーチン                                         --
------------------------------------------------------------
local rtn, logstr

while (true) do

    -- SYSLOGから何か追加された文字列を格納するまで待つ
    rtn, logstr = rt.syslogwatch(".*")

    -- SYSLOG文字列が何か拾えたらマッチする文字列を探す
    if (rtn) and (logstr) then
        for i, str in ipairs(logstr) do
            for j, ptn in ipairs(ptn_tbl) do

                -- マッチする文字列があったらメールする
                if string.find(str, ptn) ~= nil then
                    mail_tbl.text = string.format("ログに検索文字列が検出されました。\r\n検索文字列: \"%s\"\r\n\r\n", ptn)

                    runCmd = cmd_whenFind .. " | grep " .. ptn .. " | grep " .. date_today()
                    rtn, str = exec_command(runCmd)
                    mail_tbl.text = mail_tbl.text .. str

                    mail_tbl.subject = string.format("auto)alertReport-Netlog-rtx1210 (%s)", time_stamp())
                    rtn = rt.mail(mail_tbl)
                    if (not rtn) then
                        rt.syslog(log_level, "failed to send mail. (syslogWatch-rtx1210lua)")
                    end
                end
            end
        end
    end
end


EOF

embedded fileの定義を起動時から実行するように設定ファイルに書いておくと、SYSLOGを監視してくれる。

schedule at 1 startup * lua emfs:/tmp.txt

この監視のおかげで、監視キーワードがログで見つかる都度メールしてくれるようになる。

172.16.17.xxのwindowsの仮想マシンからssh接続したり、ブラウザで接続したら”Login”ってのがログに載って監視スクリプトが反応してくれる。

例えば本文はこんな感じ。イベント発生から数秒でメールが飛んでくる。

Model: RTX1210
SystemName: RTX1210_S4H013716
Revision: Rev.14.01.38
Time: 2021/06/15 08:02:37

ログに検索文字列が検出されました。
検索文字列: "Login"

# show log reverse | grep Login | grep 2021/06/15
2021/06/15 08:02:31: Login succeeded for SSH: 172.16.17.xx nari
2021/06/15 08:01:57: Login succeeded for SSH: 172.16.17.xx nari
2021/06/15 07:10:08: Login succeeded for SSH: 172.16.17.xx nari
2021/06/15 07:09:34: Login succeeded for SSH: 172.16.17.xx nari
2021/06/15 05:35:42: Login succeeded for SSH: 172.16.17.xx nari

おかげで、linuxで1分ごとにsyslog監視処理動かしてたのをやめて、この処理に切り替えた。

コメント