2020年4月30日木曜日

syslog-ng Store Box大活用連載企画第6回「RPC APIを使ってみる、自社システムに統合!ログ検索の自動化!」


SSB 検索画面
螺子です。今回の記事はSSBのRPC APIについて紹介します。

RPC APIを使用すると、既存のWebシステムなどと連携、あるいは統合ができるのでユーザーは使い慣れたユーザーインターフェースを利用できます。また、SSBのIPアドレスやパスワードをバックエンドで使用させることでセキュリティを強化することもできます。

あるいは、コマンドを実行することでログ検索を自動化(検索した結果をcsv形式で保存)することもできます。

ここでは、「RPC APIクイックスタート ガイド」の内容から、"ログイン"、"ログスペースリスト出力"、"ログ件数とリスト出力"、"検索期間の指定"、"ログアウト"をwgetコマンドを使用して実行し、取得してみます。

wgetコマンド、およびjqコマンドを使用しますので、必要に応じてインストールしてださい。



wgetとjqのインストール

まず、下記のコマンドを実行して、wgetおよびjqをインストールします。
$ sudo apt -y install wget
$ sudo apt -y install jq
図1 wgetおよびjqインストールコマンド実行例

図2 wgetインストール例

ログイン

これで、準備ができました。それでは、早速始めてみましょう。

まず、変数にSSBのIPアドレスを設定します。ここでは、SSBのIPアドレスは"192.168.91.127"です。

$ SSB_IP=192.168.91.127
図3 SSBのIPアドレス設定例

wgetコマンドで、SSBのRCP APIにアクセス(ログイン)してみます。
最初のコマンドでは、ログインのレスポンスがJSON形式で返されているのが分かります。jqコマンドを使用してJSONレスポンスを見やすくするように整形しています。
次のコマンドでは、ログイン時の識別キー(セッションID)を変数に保存します。ログインごとに異なる識別キーが発行され、認証されたセッションを一意に管理します。
最後のコマンドは、echoコマンドでセッションIDを確認しています。セッションIDが異なっていることが分かります。

$ wget -q --no-check-certificate -O - "https://$SSB_IP/api/4/login" --post-data='username=admin&password=a' | jq '.'
{
"result": "44555634fcadd1f2dab94a79446b0fbb",
"error": {
"code": null,
"message": null
},
"warnings": []
}
$ SESSID=`wget -q --no-check-certificate -O - "https://$SSB_IP/api/4/login" --post-data='username=admin&password=a' | jq '.result' -r`
$ echo $SESSID
48cf1e5a8788808b226097e7687c3527
図4 SSBログイン例

図5 SSBログイン実行画面例

ログスペースリスト出力

次に、ログスペースのリストを取得します。リクエストにセッションIDを含めていることに注意してください。

$ wget -q --no-check-certificate -O - --header "Cookie: AUTHENTICATION_TOKEN=$SESSID" "https://$SSB_IP/api/4/search/logspace/list_logspaces" | jq '.result'
[
"Space69",
"center",
"cisco2970_default",
"cisco2970_noparse",
"filtered",
"fortigate",
"fortigate_default",
"fortigate_noDelimiter",
"fortigate_noparse",
"fortigate_parse",
"local",
"multi",
"ssb-internal",
"ssb-local",
"ssblocal",
"winevent"
]
図6 ログスペースリスト表示コマンド例

図7 ログスペースリスト表示画面例

ログ件数とリスト出力

次は、ログの件数とリストを出力します。検索式に"starting up program:syslog-ng"を指定してsyslog-ngの起動ログメッセージを検索しています。

$ wget -q --no-check-certificate -O - --header "Cookie: AUTHENTICATION_TOKEN=$SESSID" "https://$SSB_IP/api/4/search/logspace/number_of_messages/local?from=0&to=9999999999&search_expression=starting up program:syslog-ng" | jq '.result'
43
図8 ログ件数表示コマンド例

図9 ログ件数表示画面例

ログをリストを出力します。"offset"と"limit"を使用して出力件数を制限しています。

$ wget -q --no-check-certificate -O - --header "Cookie: AUTHENTICATION_TOKEN=$SESSID" "https://$SSB_IP/api/4/search/logspace/filter/local?from=0&to=9999999999&search_expression=starting up program:syslog-ng&offset=0&limit=10" | jq '.result'
[
{
"id": "810594056856928268",
"timestamp": 1561093646,
"processed_timestamp": 1561093646,
"priority": 5,
"facility": 5,
"host": "ssb1",
"message": "syslog-ng starting up; version='6.0.16', cfg-fingerprint='a4c2562c072569960ae14f87514fe0784550a841', cfg-nonce-ndx='0', cfg-signature='209cc73839fcf78dfc4c44c7a3fe816687b424a5'",
"program": "syslog-ng",
"pid": "957",
"dynamic_columns": {},
"tags": [],
"delimiters": " \n\r\t:&~?![]=,;()'\""
},
{
"id": "810598454903449747",
"timestamp": 1561453524,
"processed_timestamp": 1561453524,
"priority": 5,
"facility": 5,
"host": "ssb1",
"message": "syslog-ng starting up; version='6.0.16', cfg-fingerprint='2217df7826aeacc4d32e8309a5a4151dc442eb2f', cfg-nonce-ndx='0', cfg-signature='687784af547f3befbd26f296704cdd339b7f4658'",
"program": "syslog-ng",
"pid": "923",
"dynamic_columns": {},
"tags": [],
"delimiters": " \n\r\t:&~?![]=,;()'\""
},
:
:
図10 ログリスト表示コマンド例

図11 ログリスト表示画面例

SSBの検索ページで、検索式に"starting up program:syslog-ng"と入力して実行すると、ログ件数がRPC APIで取得した件数と同じであることがわかります。
図12 SSBログ検索実行時画面(検索式指定)例

検索期間の指定

次に検索期間を指定してログ件数を取得してみます。期間の指定にはUNIXタイムスタンプを使用するため、検索期間をdateコマンドでUNIXタイムスタンプに変換しています。

$ date +%s -d"Oct 11, 2019 10:00:00"
1570755600
$ date +%s -d"Oct 11, 2019 10:05:00"
1570755900
$ wget -q --no-check-certificate -O - --header "Cookie: AUTHENTICATION_TOKEN=$SESSID" "https://$SSB_IP/api/4/search/logspace/number_of_messages/local?from=1570755600&to=1570755900" | jq '.result'
179
図13 検索期間を指定したログ件数表示コマンド例

図14 検索期間を指定したログ件数表示画面例

SSBの検索ページで、検索期間を指定して実行すると、ログ件数がRPC APIで取得した件数と同じであることがわかります。
図15 SSBログ検索実行時画面(検索期間指定)例

ログアウト

最後に、ログアウトしてセッションを終了します。

$ wget -q --no-check-certificate -O - --header "Cookie: AUTHENTICATION_TOKEN=$SESSID" "https://$SSB_IP/api/4/logout" | jq '.'
{
"result": true,
"error": {
"code": null,
"message": null
},
"warnings": []
}
図16 ログアウトコマンド例

図17 ログアウト画面例

SSB RPC APIドキュメント

SSBのRPC APIのドキュメントは"https://<ip-address-of-ssb>/api/4/documentation"のURLで、web I/Fから閲覧できます。

図18 RPC APIドキュメント表示例

csv形式保存

最後に、検索したログをcsv形式に保存してみます。JSON形式で出力されているので、わざわざcsv形式に変換する必要がないのでは?とのツッコミはあると思いますが、まだcsvの需要があるようなので(笑)..


// 再度ログインします。
$ SESSID=`wget -q --no-check-certificate -O - "https://$SSB_IP/api/4/login" --post-data='username=admin&password=a' | jq '.result' -r`

// UNIXタイムスタンプで期間を指定(過去7日間)します。
$ START=`date -d '7 day ago' +%s`
$ END=`date +%s`

// 検索結果数を変数に格納します。
$ NUMBER=`wget -q --no-check-certificate -O - --header "Cookie: AUTHENTICATION_TOKEN=$SESSID" "https://$SSB_IP/api/4/search/logspace/number_of_messages/center?from=$START&to=$END&search_expression=program:microsoft_windows_security_auditing." | jq '.result'`

// 念のため検索結果数を確認します。
$ echo $NUMBER
883

// 検索結果数までループ処理します。offsetオプションで出力する検索位置を指定しています。
$ for ((i=0; i<$NUMBER; i+=100));
> do
> wget -q --no-check-certificate -O - --header "Cookie: AUTHENTICATION_TOKEN=$SESSID" "https://$SSB_IP/api/4/search/logspace/filter/center?from=$START&to=$END&&offset=$i&search_expression=program:microsoft_windows_security_auditing." | jq '.result';
> done
:
: (JSON形式で検索ログがターミナルに出力されます)
:

// もう一度、検索を実行します。今度はjqコマンドでメンバーとcsv形式に変換して出力をファイルにリダイレクトしています。
$ for ((i=0; i<$NUMBER; i+=100));
> do
> wget -q --no-check-certificate -O - --header "Cookie: AUTHENTICATION_TOKEN=$SESSID" "https://$SSB_IP/api/4/search/logspace/filter/center?from=$START&to=$END&offset=$i&search_expression=program:microsoft_windows_security_auditing." | jq -r '.result[] | [.host, .message] | @csv' >> test.csv;
> done

// 最後にログアウトして終了です。
$ wget -q --no-check-certificate -O - --header "Cookie: AUTHENTICATION_TOKEN=$SESSID" "https://$SSB_IP/api/4/logout" | jq '.'
図19 ログのcsv出力例

保存したcsvファイルをエクセルを開きます。

図20 csv形式の出力例

いかがでしたでしょうか?
RPC APIを使用して、SSBに保存されているログを取得するイメージがつかめたのではないでしょうか。


それでは、次回の連載記事をお楽しみに!


SSBは、高信頼ログ管理アプライアンスです。様々なデバイスおよびアプリケーションからログメッセージを収集、分類、フィルタリング、正規化して安全に保存可能です。ログデータの信頼性を担保し、膨大なログが発生する高負荷環境、あるいはログロストが許されない企業・組織のログ管理に最適です。


syslog-ng Store Boxについての詳細は、製品紹介ページ・製品ガイドをご参照ください。


評価版のダウンロード

問合わせ