![見出し画像](https://assets.st-note.com/production/uploads/images/141856277/rectangle_large_type_2_119fe4a3226f3ad3a3b8c41620b8cd5c.png?width=1200)
はじめてのTWSLA(すごいログ分析ツール)
はじめに言っておきたいこと
TWSLAは、英語でTWSNMP`s Simple Log Analyzerの略ですが、日本語ではTWSNMPの作者が作った、すごい(S)ログ(L)分析ツール(ア(A)ナライザー)の略です。
2年前に
を作りました。これを本業のログ分析に活用していますが、機能が多すぎるのとGUIの操作が煩雑になってしまうので、もう少し改善したいと思っていました。
そこで、自分がログを分析する時に何が必要かを考え抜いて作ることにしました。
思い立ったら、すぐ使える
すごいスピードで検索できる
ログの件数をすごいスピードでカウントできる
ログから数値データをすごいスピードで取りだせる
検索のフィルターとかデータ取り出しの指定を簡単にできる
結果をテキストファイルやグラフ画像ファイルに簡単に出力できる
分析が終わったら後始末が簡単
が必要なことでした。
これを実現したのがTWSLAなのです。
Linux(Unix)のコマンドの精通している人なら、grep,sed,awkとかを駆使してログ分析するのでしょうが、それを1つのコマンドで実現したものです。
インストールの方法
実行ファイルが1つしかないのでインストールは簡単です。
使っているOSのファイルをダウンロードしZIPファイルを展開すてPATHの通っているディレクトリにコピーすればよいです。
実行ファイルのサイズが小さいので、このnote記事に添付できました。
2024/6/7 v1.1.0に更新しました。
Windows版
Mac OS版
Intel CPUはamd64、AppleのCPU(M1,M2など)はarm64です。
Linux版
Intel CPUはamd64、ARM CPUはarm64です。
基本的なこと
ログ分析の流れ
TWSLAを使ってログを分析する時の基本的な流れは
ログをインポートする
ログを分析する
結果をファイルに保存する
のような感じです。
対応しているログ
2024/8時点では
テキストファイルで1行毎にタイムスタンプがあるもの
Windowsのevtx形式
です。テキスト形式のファイルはZIPやtar.gzの中にあっても直接読み込めます。gzで圧縮されていてるファイルにも対応しています。
Jun 14 15:16:01 combo sshd(pam_unix)[19939]: authentication failure; logname= uid=0 euid=0 tty=NODEVssh ruser= rhost=218.188.2.4
のようなファイルです。
タイムスタンプは、魔法を使っていろんな形式に対応しています。昔のsyslogでもRFCで定義されている新しい形式でも、UNIXタイムの数値でもよいです。いくつもタイムスタンプがある場合は、一番左側にあるタイムスタンプを採用します。
SCPやSSHでサーバーから直接ログファイルを読み込むことができます。
TWSNMP FC/FKから読み込むこともできます。
シンプルフィルター
正規表現に精通しているなら正規表現のフィルターを使えばよいのですが、そうでない人のためにシンプルフィルターを用意しました。私のためでもあります。lsやdirコマンドで指定する*や?で、何か文字列や文字があることを示します。
Message*のように書けば、正規表現のMessage.*になるようなものです。
$を書けば、そこで終わりという指定もできます。
正規表現でIPアドレスのフィルターを指定する時は、192.168.2.1ではだめで
192\.168\.\2\.1のような面倒なことになりますが、シンプルフィルターは、そのままかけます。
コマンドのオプションで-fで指定します。ファイル名のパータンも、この方法です。正規表現は-rで指定します。
v1.1.0までは、-fと-rのフィルターはどちらか片方だけが有効な仕様でしたがv1.2.0以降は、両方のAND条件に変更しました。このほうが便利なので。
除外フィルター
ログの中に不要な行がある時に、どんどん除外したい場合があります。grep の-vオプションと同じものをつけました。こちらは正規表現で指定します。
アバウトな時間範囲の指定
時間範囲の指定は、アバウトな入力にこだわっています。
2024/01/01T00:00:00+900-2024/01/02T00:00:00+900
のような入力を毎回するのは面倒です。
これを
2024/1/1,1d
のような感じで入力できます。
開始,期間
開始,終了
終了,期間
の3パターンに対応しています。
-tオプションです。
データ抽出パターンの簡易な指定
ログからデータを抽出する方法としてはGROKが有名ですが、覚えるのが面倒なので、簡易に指定できる方法をあみだしました。
-e オプションと-pオプションで指定します。
-eは、パターンで
ip : IPアドレス
mac: MACアドレス
number: 数値
email:メールアドレス
のように簡易な指定できます。-pは位置です。
-p 2で2番目に発見したものを取り出します。IPアドレスが2つ以上ある場合に2番目のものを指定するとかです。
もう少し複雑な指定もできます。
count=%{number}
のような形式です。シンプルフィルターの中に%{何か}のように書けば
%{何か}の部分だけ取り出します。何かは、先程のipやemailの他にwordがあります。
環境変数を設定する
テーブル表示の罫線を正しく表示するためには、
RUNEWIDTH_EASTASIAN=0
という環境変数を設定してください。
Linux,Mac OSは
export RUNEWIDTH_EASTASIAN=0
Windows のPowerShellは
$Env:RUNEWIDTH_EASTASIAN=0
です。
グラフの保存
countやextractコマンドの結果画面が保存を実行する時に拡張子をpngにすれば、結果をテキストファイルではなくグラフ画像を保存します。
![](https://assets.st-note.com/img/1716673091146-7s9MJteCEj.png?width=1200)
のような感じです。
コマンドの説明
helpコマンドを実行すると
$twsla help
Simple Log Analyzer by TWSNMP
Set the environment variable.
RUNEWIDTH_EASTASIAN=0
Usage:
twsla [command]
Available Commands:
anomaly Anomaly log detection
completion Generate the autocompletion script for the specified shell
count Count log
delay Search for delays in the access log
extract Extract data from log
help Help about any command
import Import log from source
search Search logs.
tfidf Log analysis using TF-IDF
version Show twsla version
Flags:
--config string config file (default is $HOME/.twsla.yaml)
-d, --datastore string Bblot log db (default "./twsla.db")
-f, --filter string Simple filter
-h, --help help for twsla
-v, --not string Invert regexp filter
-r, --regex string Regexp filter
-t, --timeRange string Time range
Use "twsla [command] --help" for more information about a command.
のように使い方が表示されます。
コマンドを図示すると
![](https://assets.st-note.com/img/1723064466841-B0pvupQP5o.png?width=1200)
のような感じです。v1.1.0からanomalyコマンドが追加されました。
v1.3.0からdelayコマンドを追加しました。
importコマンド
ログをインポートするためのコマンドです。
$twsla help import
twsla import --help
Import log from source
source is file | dir | scp | ssh | twsnmp
Usage:
twsla import [flags]
Flags:
-c, --command string SSH Command
-p, --filePat string File name pattern
-h, --help help for import
--json Parse JSON windows evtx
-k, --key string SSH Key
-s, --source string Log source
--utc Force UTC
Global Flags:
--config string config file (default is $HOME/.twsla.yaml)
-d, --datastore string Bblot log db (default "./twsla.db")
-f, --filter string Simple filter
-v, --not string Invert regexp filter
-r, --regex string Regexp filter
-t, --timeRange string Time range
-sまたは--sourceで読み込むログの場所を指定します。
ファイルを指定すれば、指定したファイルだけ読み込みます。これはわかりやすいです。
実行すれば
$twsla import -s ~/Downloads/Linux_2k.log
/ Loading path=/Users/ymimacmini/Downloads/Linux_2k.log line=2,000 byte=212 kB
Total file=1 line=2,000 byte=212 kB time=138.986218ms
のような感じで、読み込んだログの件数、サイズ、かかった時間を表示します。
ディレクトリを指定するとディレクトリの中のファイルを読み込みます。-pまたは--filePatで、ファイルのパターンを指定すれば、ディレクトリの中のファイルを限定できます。パターンの指定は、シンプルフィルターです。
$twsla import -s ~/Downloads -p "Linux*"
/ Loading path=/Users/ymimacmini/Downloads/Linux_2k.log line=2,000 byte=212 kB
Total file=1 line=2,000 byte=212 kB time=75.410115ms
ZIPファイルやtar.gz形式のファイルから読み込む場合もファイル名のパターンを指定できます。
読み込む時に、シンプルフィルター、正規表現のフィルターや時間範囲を指定することができます。読み込む量を減らすことができます。
SCP、SSHやTWSNMPのログを読み込むためには、URLを指定します。
scp://root@192.168.1.210/var/log/messages
のような形式です。SSHの鍵の登録が必要です。
この転送に関しては、玄人向けなので別の記事で詳しく書くつもりです。
v1.1.0からevtxファイルを読み込む時に--jsonを指定すれば、WindowsのイベントログをJSON形式で読み込みます。詳しい情報が表示できます。
![](https://assets.st-note.com/img/1717709455800-myzsaGfpvI.png?width=1200)
ログの読み込み先は、-dオプションで指定します。bboltのデータベースです。省略すれば、カレントディレクトリのtwsla.dbになります。
search コマンド
ログの読み込みが終われば、検索できます。
twsla help search
Search logs.
Simple filters, regular expression filters, and exclusion filters can be specified.
Usage:
twsla search [flags]
Flags:
-h, --help help for search
Global Flags:
--config string config file (default is $HOME/.twsla.yaml)
-d, --datastore string Bblot log db (default "./twsla.db")
-f, --filter string Simple filter
-v, --not string Invert regexp filter
-r, --regex string Regexp filter
-t, --timeRange string Time range
シンプルフィルター、正規表現のフィルターや時間範囲を指定してログを絞り込んでいけます。
$twsla search -f fail
のような感じで検索すると
![](https://assets.st-note.com/img/1716672574781-gcWleWK4jC.png?width=1200)
検索結果の画面の右上にキー入力のヘルプが表示されます。
sキーで結果を保存できます。rキーで表示を逆順にします。qキー終了です。
countコマンド
ログの件数を時間単位に集計したり、ログの中のデータをキーにして集計したりするコマンドです。
$twsla help count
Count the number of logs.
Number of logs per specified time
Number of occurrences of items extracted from the log
Usage:
twsla count [flags]
Flags:
-e, --extract string Extract pattern
-h, --help help for count
-i, --interval int Specify the aggregation interval in seconds.
-n, --name string Name of key (default "Key")
-p, --pos int Specify variable location (default 1)
Global Flags:
--config string config file (default is $HOME/.twsla.yaml)
-d, --datastore string Bblot log db (default "./twsla.db")
-f, --filter string Simple filter
-v, --not string Invert regexp filter
-r, --regex string Regexp filter
-t, --timeRange string Time range
検索と同じようにフィルターをかけることができます。
-e オプションで抽出するデータを指定した場合、このデータ単位で集計します。指定しない場合は、時間単位のログの数を集計します。
時間単位の集計は、
twsla count -f fail
のように指定すると
![](https://assets.st-note.com/img/1717709793390-R450RHfeJN.png?width=1200)
のような結果になります。時間の間隔は-iオプションで指定します。省略すれば、よしなに設定されるはずです。
v1.1.0から前のログからの差分時間(Delta)も表示されます。上部に、平均の間隔も表示されます。
cキーでカウント数によってソートできます。kキーで時間でソートです。
sキーで結果を保存できます。拡張子をpngにすれば、グラフになります。
![](https://assets.st-note.com/img/1716674447895-OPrP8zMSUQ.png?width=1200)
同じ検索条件で-e ipを指定して、集計すると
![](https://assets.st-note.com/img/1716674531194-O7j5QXhIHo.png?width=1200)
のような結果になります。こちらもソートできます。グラフに保存すると
![](https://assets.st-note.com/img/1716674623362-MkHGX4qUZ2.png?width=1200)
のようにTOP10の割合がグラフになります。
extractコマンド
ログから特定のデータを取り出すコマンドです。
twsla help extract
Extract data from the log.
Numeric data, IP addresses, MAC addresses, email addresses
words, etc. can be extracted.
Usage:
twsla extract [flags]
Flags:
-e, --extract string Extract pattern
-h, --help help for extract
-n, --name string Name of value (default "Value")
-p, --pos int Specify variable location (default 1)
Global Flags:
--config string config file (default is $HOME/.twsla.yaml)
-d, --datastore string Bblot log db (default "./twsla.db")
-f, --filter string Simple filter
-v, --not string Invert regexp filter
-r, --regex string Regexp filter
-t, --timeRange string Time range
検索と同じフィルターが指定できます。抽出するデータの指定もcountコマンドと同じです。
twsla extract -f fail -e ip
のようなコマンドで実行すると
![](https://assets.st-note.com/img/1716674893720-WqYN0wwrvt.png?width=1200)
のような時系列のデータになります。キーでソートもできます。結果をグラフに保存もできます。
![](https://assets.st-note.com/img/1716675034354-UvMuVYryxl.png?width=1200)
数値データは、そのままグラフにしますが、IPアドレスなどの項目は、項目の番号をグラフにします。
tfidfコマンド
TF-IDFを使って、珍しいログを探します。
$twsla help tfidf
Use TF-IDF to find rare logs.
You can specify a similarity threshold and the number of times the threshold is allowed to be exceeded.
Usage:
twsla tfidf [flags]
Flags:
-c, --count int Number of threshold crossings to exclude
-h, --help help for tfidf
-l, --limit float Similarity threshold between logs (default 0.5)
-n, --top int Top N
Global Flags:
--config string config file (default is $HOME/.twsla.yaml)
-d, --datastore string Bblot log db (default "./twsla.db")
-f, --filter string Simple filter
-v, --not string Invert regexp filter
-r, --regex string Regexp filter
-t, --timeRange string Time range
を実行すると
![](https://assets.st-note.com/img/1716675268711-yeoAjdEYAx.png?width=1200)
のような結果になるます。2000件の中の珍しログ3件を見つけています。
-lでしきい値、-cで許容回数を指定できます。玄人向けなので
詳しいことは別の記事に書くつもりです。
v1.10から-nで珍しい上位N件を取得できるようになりました。
anomalyコマンド
v1.1.0で追加したコマンドです。ログをAI分析して異常なものを見つけるコマンドです。
Anomaly log detection
Detect anomaly logs using isolation forests.
Detection modes include walu, SQL injection, OS command injections, and directory traverses.
Usage:
twsla anomaly [flags]
Flags:
-e, --extract string Extract pattern
-h, --help help for anomaly
-m, --mode string Detection modes(tfidf|sql|os|dir|walu|number) (default "tfidf")
Global Flags:
--config string config file (default is $HOME/.twsla.yaml)
-d, --datastore string Bblot log db (default "./twsla.db")
-f, --filter string Simple filter
-v, --not string Invert regexp filter
-r, --regex string Regexp filter
-t, --timeRange string Time range
-mでモードを指定します。tfidfはTF-IDFでログの特徴ベクターを作成します。sql,os,dirは、SQLインジェクション、OSインジェクションなどに登場するキーワードの数からログの特徴ベクターを作成します。waluは
です。numberは、ログに登場する数値から特徴ベクターを作成します。
-eオプションで数値の位置を指定できます。
start*end
のように指定すると
11:00 start 0.1 0.2 1.4 end
のようなログの 0.1 0.2 1.4の3つだけ採用します。
分析結果は
![](https://assets.st-note.com/img/1717710550350-NG6evcVbRm.png?width=1200)
のような感じで表示されます。Scoreが大きいほど異常と判断しています。
SQLインジェクションやWALUはWebサーバーのアクセスログの分析に効果があります。
delayコマンド
v1.3.0で追加したコマンドです。Accessログから処理の遅延を検知するためのコマンドです。ApacheのAccessログはHTTPのリクエストを受け付けた時点の時刻をタイムスタンプに記録します。実際にログに出力するのは、処理が終わって応答を返してからです。このためにログのタイムスタンプが前後して記録さる場合があります。先に記録されたものより前の時刻のログが後から記録されるという意味です。この逆転現象を利用すると処理の遅延を検知できます。リクエストの処理や大きなファイルのダウンロードに時間がかかるなどの遅延です。
ApacheのAccessログをSyslogに転送して記録するとタイムスタンプが2つあるログになります。この2つ以上タイムスタンプのあるログの時間差が処理の遅延を表している場合があります。これを検知するモードも作りました。
Search for delays in the access log
Usage:
twsla delay [flags]
Flags:
-h, --help help for delay
-q, --timePos int Specify second time stamp position
--utc Force UTC
Global Flags:
--config string config file (default is $HOME/.twsla.yaml)
-d, --datastore string Bblot log db (default "./twsla.db")
-f, --filter string Simple filter
-v, --not string Invert regexp filter
-r, --regex string Regexp filter
-t, --timeRange string Time range
-q のオプションに1以上の値をつけると2つ以上のタイムスタンプを処理するモードになります。-qを省略するか0を指定するとAccessログの逆転現象を利用して遅延を検知するモードになります。
![](https://assets.st-note.com/img/1723064539386-Xo4AG4qm3Y.png?width=1200)
遅延を検知できない場合は、何も表示されません。
右端が遅延時間です。ログを選択してEnterキーを押せばログを詳しく表示します。tキーで時刻順にソートします。dキーで遅延の大きさ順にソートします。sキーでファイルに保存できます。拡張子をpngにするとグラフ画像を保存します。
![](https://assets.st-note.com/img/1723064799604-VwdzrZ3bSg.png?width=1200)
verisonコマンド
TWSLAのバージョンを表示します。
twsla v1.0.0(04ab4ca)
カッコの中は、GitHUBのコミット番号です。
のどのコミットで作成されたかがわかります。
説明に使ったログの入手
この説明に使ったサンプルのログを手に入れたい人は
のLinuxのフォルダにあるログです。
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。