ntop ntopngユーザースクリプト アクティブ時間差分アラート

イタリアntop社のntopngが面白い。

2020年4月正式にv4系にメジャーバージョンアップを遂げたntop社のntopngですが、エンドユーザーが開発に関われる要素があります。

それがユーザースクリプトと呼ばれるプラグイン開発になります。

筆者の家ではコミュニティ版を利用していますが、ユーザースクリプトはluaのソースコードも読めますし、C++部分はAPIリファレンスもあるので開発が可能となっています。

今回は、監視ネットワーク上で長時間アクティブなホストを検知するユーザースクリプトactive.lua にデバックコードを追記して動作を確認してみました。

設定メニューをみても明確な動作が不明だったので、デバックコードを追記して確認しよう!といったノリです。

active.luaの修正に必要な知識を表にまとめてみました。

NO開発に必要な知識
1luaスクリプトのパス
/usr/share/ntopng/scripts/plugins/threshold_cross/user_scripts/host
2vi, emacsの使い方
3APIリファレンスマニュアルのURL
4ntopngの起動・停止方法
$sudo systemctl start/stop ntopng
5ntopngの手動起動方法
$sudo ntopng -i br0 -w 3000 –https-port 443 -m 192.168.1.0/24
6githubのURL
表1 ユーザースクリプト開発に必要な知識

項番5だけ説明が必要かと思います。

  • -i br0 インターフェイス名指定 
  • -w 3000 HTTPのポート番号指定
  • –https-port 443 HTTPSのポート番号指定
  • -m 192.168.1.0/24 筆者宅のサブネット

環境に合わせて項番5は修正してください。

次にactive.luaの追記したソースコードを張っておきます。

--
-- (C) 2019-20 - ntop.org
--

local alerts_api = require("alerts_api")
local alert_consts = require("alert_consts")
local user_scripts = require("user_scripts")

local script = {
  -- Script category
  category = user_scripts.script_categories.network,

  local_only = true,
  default_enabled = false,

  -- This script is only for alerts generation
  is_alert = true,

  -- See below
  hooks = {},

  gui = {
    i18n_title = "alerts_thresholds_config.activity_time",
    i18n_description = "alerts_thresholds_config.alert_active_description",
    i18n_field_unit = user_scripts.field_units.seconds,
    input_builder = "threshold_cross",
  }
}

-- #################################################################

function script.hooks.all(params)
  local value = alerts_api.host_delta_val(script.key, params.granularity, host.getTime()["total_activity_time"])
  local valueip = host.getIp()
  io.write("valueip :"..valueip.ip.."value :"..value.."\n")

  -- Check if the configured threshold is crossed by the value and possibly trigger an alert
  alerts_api.checkThresholdAlert(params, alert_consts.alert_types.alert_threshold_cross, value)
end

-- #################################################################

return script

追記したコードは、以下の2行だけです。

  local valueip = host.getIp()
  io.write("valueip :"..valueip.ip.."value :"..value.."\n")

このユーザースクリプトの動作を調べるために、ホストのIPアドレスとユーザースクリプトの値(value)を標準出力に出しているだけです。

ちなみに、luaで値はドットx2で挟まないとattempt to call a number valueエラーが出力されますので気おつけてください。

実行すると、以下のような標準出力が表示されます。

[1回目の標準出力]
valueip :192.168.1.2value :1930
.
.
[2回目の標準出力]
valueip :192.168.1.2value :3515

2行目のvalue: 1930がホストが最後にオンラインだった時刻と1回目にチェックした時刻との差分時間(秒)です。

約32分間オンラインのままということになります。

2回目の標準出力となりますと、3515秒。

約58分となり1時間前のチェック時間からオンラインのままであることが分かります。

このホストは常にオンラインなので、3回目、4回目も約60分の標準出力となります。

ここで、ntopngのGUI側の設定を見ていましょう。

図1 active.luaアラート設定

図1の設定は、1時間ごとにオンラインのホストをチェックして、前回チェックした時間との差分が1800秒以上のホストが存在すればアラートを投げます。

ユーザースクリプトactive.luaは以下のようなパターンで利用できるのではないでしょうか。

NOactive.lua活用法
1長時間利用されると困る拠点での監視アラート
例)ゲストWifiの不正利用発見
2学内ネットワークの調査
例) アセット管理のツールとして
3#2に類似してますが、野良デバイスの発見
4電力消費の為の長時間起動デバイスの特定
表2 active.luaの活用例

ユーザースクリプト、まだまだ面白そうなものがあるのでこの動作確認シリーズ、連載化出来たらいいですね。

(Visited 309 times, 1 visits today)
The following two tabs change content below.
【好きなもの】 インフラ技術が好き。古いものが好き。 【生きてきたフィールド】 システム運用、ソフトウェア開発、ミドルウェア検証、OSSサポート、プリセールスエンジニア、プロジェクトマネジメント 【このサイトでの役割】 サイト管理者。