【Elastic】Lanscope の PC 操作ログを取り込んでみた
はじめに
MOTEX 社の IT 資産管理ツールである LANSCOPE Endpoint Manager (旧 Lanscope Cat) [1] の PC 操作ログをセキュリティ対策強化に活用すべく、Elastic Cloud に取り込んでみました。
本投稿で説明する内容
本記事では Elastic 社の ETL ツールである Logstash [2] を使って LANSCOPE Endpoint Manager で取得可能なログのうち、サンプルとして操作ログ を Elasticsearch に取り込み、Kibana で検索や可視化できるようにします。
【本投稿の対象ログ】
以下、LANSCOPE Endpoint Manager から Syslog 送信可能なログになります。
No | ログ種別 | 説明 | 対応 OS | 対象 |
---|---|---|---|---|
01 | 資産アラームログ | ハードウェア構成の変更やリース切れ、新規アプリのインストールなどに関するアラートログ | Win/Mac | - |
02 | アプリ稼働ログ | 稼働しているアプリ名とその稼働日数や時間に関するログ | Win/Mac | - |
03 | アプリ起動アラームログ | 新規アプリの起動や指定した特定アプリの起動に関するアラートログ | Win/Mac | - |
04 | アプリ通信ログ | アプリ名と通信(宛先/送信元の IP アドレス、ポート番号、TCP or UDP)に関するログ | Win | - |
05 | アプリ禁止ログ | 禁止設定しているアプリや操作の実行を試みたログ | Win | - |
06 | 操作ログ | ファイル操作やウィンドウ切り替え操作に関するログ | Win/Mac | ○ |
07 | プリントログ | 印刷操作(プリンター名、ファイル名、枚数、印刷時刻など)に関するログ | Win/Mac | - |
08 | Web アクセスログ | Web ブラウザを使用した Web 通信(閲覧、ダウンロード、アップロード、書き込みなど)に関するログ | Win/Mac | - |
09 | 通信デバイスログ | Wi-Fi、Bluetooth、赤外線、有線などの接続/切断に関するログ | Win | - |
10 | アプリ ID 監査ログ | 監査対象に設定したアプリに関する監査ログ | Win | - |
11 | メール送信ログ | メールの送信(送信先、件名、添付ファイル名、送信時刻など)に関するログ | Win | - |
12 | 脅威検知ログ | Cyber Protection(CylancePROTECT)で検出した脅威に関するログ | Win | - |
13 | Microsoft Defender 検知ログ | Microsoft Defender 連携機能により検出した脅威に関するログ | Win | - |
14 | ドメインログオンログオフログ | Active Directory へのログオン状況(どのドメインに、どの端末が、いつ、ログオン or ログオフなど)に関するログ | Win | - |
15 | サーバファイル操作ログ | ファイルサーバに対するアクセスログ(ファイル名、操作者、操作内容、アクセス日時など) | Win | - |
16 | ネットワーク接続ログ | 社内ネットワークへの端末接続の検出や不正な端末の遮断に関するログ | Win/Mac | - |
17 | ログインユーザー ONOFF ログ | 操作端末に対するログオン操作(ON/OFF、ログオン/ログオフ、休止/復帰、ロックなど)に関するログ | Win/Mac | - |
前提
・LANSCOPE Endpoint Manager はオンプレミス版で事前構築済みです。
・ライセンスはパック 1000(標準パック, Web アクセス管理, デバイス制御)を適用しています。
・端末への LANSCOPE クライアントエージェント(MR) は事前導入済みです。
・仮想マシンを構築する上で利用した Azure サブスクリプションは事前作成済みです。
・Elastic Cloud(Elasticsearch と Kibana)の Deployment は事前作成済みです。
【参考】
・LANSCOPE On-premises App for Splunk
・LANSCOPE Cloud App for Splunk
利用環境
各ソフトウェアのバージョンは以下の通りです。
Product / Service | Version |
---|---|
LANSCOPE Endpoint Manager | 9.4.7.0 |
Windows Server OS | Windows Server 2019 Datacenter |
.NET Framework | 4.8.1 |
MS SQL Server | SQL Server 2019 Express Edition |
MS SQL Server Management Studio | 18.12.1 |
Logstash | 8.17.2 |
Linux OS | RHEL 8.10 |
Elastic Cloud | 8.17.2 (Subscription level: Gold) |
Azure Region | (Asia Pacific) Japan East |
Windows Client OS | Windows 11 Pro 23H2 |
macOS | Sequoia 15.3.1 |
【構成図】
・端末は Surface Laptop2 および Macbook Pro M4 を利用しています。
・エージェントはインターネット越しに LANSCOPE 管理サーバーと通信します。
・Azure 上には 2 台の VM(LANSCOPE 用と Logstash 用)を構築しています。
・LANSCOPE 管理サーバーから Logstash には TCP 1514 で Syslog 通信します。
・Logstash から Elastic Cloud にはインターネット越しに通信します。
全体構成図
実施内容
以下、実施手順になります。
- Logstash のインストール
- Logstash のパイプライン開発
- LANSCOPE Endpoint Manager の Syslog 連携設定
- Elastic Cloud でのログ検索
1. Logstash のインストール
まずは Logastash 用の Azure VM にログインします。
1-1. OS への SSH ログイン
VM 作成時にダウンロードした SSH 鍵を使って VM に SSH 接続します。
ダウンロードした SSH 鍵を ssh ディレクトリ配下に移動します。
mv /Users/<username>/Downloads/<your-private-key> ~/.ssh/
移動した SSH 鍵に所有者の読み取り権限を付与します。
chmod 400 ~/.ssh/<your-private-key>
azureuser ユーザーで Azure VM のパブリック IP アドレスに対して、SSH 接続します。
ssh -i ~/.ssh/<your-private-key> azureuser@<vm-public-ip-address>
1-2. Logastash のインストール
次は、公開署名鍵をダウンロードしてインストールします。
sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
logastash インストール用のリポジトリを登録します。
sudo vi /etc/yum.repos.d/logastash.repo
下記内容を上記で作成した logstash.repo
に貼り付けます。
[logstash-8.x]
name=Elastic repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
登録したリポジトリから Logstash をインストールします。
sudo yum install logstash
【補足】
再起動後も Logastash が自動起動するようにしたい場合は以下を実施してください。
sudo systemctl enable logstash
sudo systemctl daemon-reload
【参考】
・Installing Logstash(公式ページ)
2. Logstash のパイプライン開発
ここでは Logastash のパイプラインを開発します。
logstash のパイプラインは /etc/logstash/conf.d/
配下に .conf
拡張子のファイル [3] を作成して定義します。パイプライン構成ファイルは input、filter、output の 3つのセクション [4] で構成されます。
本投稿では、パイプライン構成ファイルは logstash.conf
とします。
sudo vi /etc/logstash/conf.d/logstash.conf
2-1. input の作成
まず、input 部分を作成します。
input {
tcp { # ①tcp 1514 ポートで syslog を受信する
port => 1514
host => "0.0.0.0"
codec => plain { charset => "UTF-8" }
type => "syslog"
}
}
【解説①】
・tcp input plugin
を使います。
・port
: ポート番号(今回は 1514)を指定します。
・host
: Syslog サーバーとしてリッスンする IP アドレスを指定します。(デフォルト値)
・codec
, charset
: UTF-8 のプレーンテキストとしてメッセージを受信します。
・type
: type フィールドの値を設定します。(なくても良いので、任意で設定してください)
【参考】
・Tcp input plugin(公式ページ)
2-2. filter の作成
次に filter 部分を作成します。
filter {
dissect { # ②メッセージのヘッダー部分をパースする
mapping => {
"message" => "<%{pri}>%{version} %{timestamp} %{hostname} %{appname} %{procid} %{msgid} [%{token} %{params}]"
}
}
kv { # ③メッセージの本体部分をパースする
source => "params"
value_split => "="
trim_value => "\""
field_split => " "
allow_empty_values => true
}
date { # ④timestamp の時刻を@timestamp に利用する
match => ["timestamp", "ISO8601"]
target => "@timestamp"
}
if ["UTCDate/Time"] { # ⑤日付時刻型に変換する
date {
match => ["UTCDate/Time", "ISO8601"]
target => "UTCDate/Time"
}
}
if ["ServerReceivedDate/Time"] { # ⑤日付時刻型に変換する
date {
match => ["ServerReceivedDate/Time", "ISO8601"]
target => "ServerReceivedDate/Time"
}
}
if ["PrintedTime"] { # ⑤日付時刻型に変換する
date {
match => ["PrintedTime", "ISO8601"]
target => "PrintedTime"
}
}
if ["ThreatDetectionUTCDate/Time"] { # ⑤日付時刻型に変換する
date {
match => ["ThreatDetectionUTCDate/Time", "ISO8601"]
target => "ThreatDetectionUTCDate/Time"
}
}
if ["ActivationTime"] { # ⑤日付時刻型に変換する
date {
match => ["ActivationTime", "ISO8601"]
target => "ActivationTime"
}
}
ruby { # ⑥日本のタイムゾーンに変換する
code => "event.set('[@metadata][local_time]',event.get('[@timestamp]').time.localtime.strftime('%Y.%m.%d'))"
}
mutate { # ⑦数値型の変換する
convert => {
"NumOfPrintedPages" => "integer"
"FileSize" => "integer"
"Score" => "integer"
"NumOfActivationDays" => "integer"
"ActivationTime(sec)" => "integer"
}
}
mutate { # ⑧フィールド値を小文字に変換する
lowercase => [ "appname", "msgid" ]
}
mutate { # ⑨不要なフィールドを削除する
remove_field => [ "params", "timestamp", "message" ]
}
}
【解説②】
・dissect filter plugin
を使います。
以下、LANSCOPE のサンプルログになります。
<012>1 2017-01-01T23:01:23.012+09:00 SubMgrHost LanScopeCat - Operation [LanScopeCat@49660 Category="1" Sub-ManagerNo="3" Dept="大阪本社\\開発本部\\製品開発部" AgentNo="5" Agent="PC0001-1" LogonUser="Administrator" ActivationTime="0:09:22" ActivationTime(sec)="562" Event="ACTIVE" Application="notepad.exe" WindowTitle="無題.txt - メモ帳" AlertTypeNo="1" AlertType="ウィンドウタイトル" Off-HourAlert="早朝" FileSize="12345" Label="" UTCDate/Time="2017-01-01T14:01:23.012+00:00" ServerReceivedDate/Time="2017-01-01T23:01:23.012+09:00" Device="MEMORYCARD_A375DB747738E3055A6755755E8E37E6" IPAddress="192.168.2.2"]
【ヘッダーフィールド】
以下、ログの先頭部分のヘッダーフィールドの一覧になります。どのログ種別でもフィールドは固定です。
フィールド名 | サンプル値 | 説明 |
---|---|---|
pri | <012> | ログの優先度 |
version | 1 | Syslog フォーマットバージョン |
timestamp | 2017-01-01T23:01:23.012+09:00 | クライアント側のログ取得日時 |
hostname | SubMgrHost | LANSCOPE サーバーのホスト名 |
appname | LanScopeCat | アプリケーション名(基本、LanScopeCat) |
procid | - | プロセスID(使用しないため、常に「-」) |
msgid | Operation | ログ種別名(Operation は操作ログ) |
・pri
だけ <> に挟まれた値を抜き取ります。
・それ以外のフィールドは半角スペース区切りとなっているので、それを各々抜き取ります。
・msgid
以降のメッセージは [
と ]
で囲われています。
・LanScopeCat@49660
は token
フィールドとして抜き取ります。
・それ以降のメッセージは key="value"
形式になるため、kv filter plugin
で処理します。
【解説③】
・dissect filter plugin
で抽出した params
を kv filter plugin
で処理します。
・key="value"
となっているため、value_split
と trim_value
でフィールド抽出します。
・key="value"
同士の間が半角スペースとなっているため、field_split
で指定します。
・value
が空値の場合があるため、allow_empty_vaule
を true
とします。
【解説④】
・date filter plugin
を使い、timestanmp
の値を @timsptamp
に利用します。
・timestamp
が ISO8601
形式の時刻フォーマットを取っています。
【解説⑤】
・date filter plugin
を使い、文字列型から日付時刻型に変換します。
・しかし、ログ種別によってはそのフィールドが存在しない場合があります。
・そのため、if ["フィールド名"]
と記載し、そのフィールドがある場合だけ処理します。
【解説⑥】
・ruby filter plugin
で @timestamnp
のタイムゾーンを JST にしたフィールドを作ります。
・そのフィールド名は [@metadata][local_time]
とします。
・フィールド値の形式を yyyy.mm.dd
形式とします。
・[@metadata][local_time]
フィールドは Elasticsearch の Index 名に利用します。
・Index の切り替えを UTC ではなく、JST で実施する目的となります。
【解説⑦】
・mutate filter plugin
の convert
を使い、文字列型から数値型に変換します。
【解説⑧】
・mutate filter plugin
の lowercase
を使い、appname
と msgid
の値を小文字にします。
【解説⑨】
・mutate filter plugin
の remove_field
を使い、Elasticsearch に取り込まないフィールドを削除します。
・params
、timestamp
、message
はフィールド抽出されたため、不要なフィールドとなります。
【参考】
・Dissect filter plugin(公式ページ)
・Kv filter plugin(公式ページ)
・Date filter plugin(公式ページ)
・Conditionals(公式ページ)
・Ruby filter plugin(公式ページ)
・Mutate filter plugin(公式ページ)
2-3. output の作成
最後は output 部分を作成します。
output { # ⑩Elastic Cloud にログを出力する
elasticsearch {
cloud_id => "<Cloud ID>"
cloud_auth => "elastic:<パスワード>"
index => "%{[appname]}-%{[msgid]}-%{[@metadata][local_time]}"
}
}
【解説⑨】
・elasticsearch output plugin
を使い、Elastic Cloud にログを送信します。
・cloud_id
と cloud_auth
は Elastic Cloud の接続認証に必要になります。
・cloud_id
は Elastic Cloud 管理画面で確認できます。
Cloud ID
・cloud_auth
は <username>:<password>
になります。
・index
はログを格納する Index 名になります。
・ログ種別ごとに Index を分けるために %{[msgid]}
を利用しています。(例: lanscopecat-operation-2025.03.04
)
【参考】
・Elasticsearch output plugin(公式ページ)
2-4. パイプライン構成ファイルの読み込み
編集していた logstash.conf
を :wq!
で上書き保存して終了します。
ファイルを読み込むため、Logstash を再起動(停止中の場合は「起動」)します。
sudo systemctl restart logstash
3. LANSCOPE Endpoint Manager の Syslog 連携設定
LANSCOPE のコンソールを起動し、マネージャーにログインします。
コンソールのログイン
[環境設定] > [連携設定] > [Syslog 送信設定]
を開きます。
Syslog 送信設定
[Syslog 送信を利用する]
にチェックを入れ、画面右下の [追加]
ボタンを押します。
下記項目を設定します。
❶ Logstash の名前を入力します。(任意の名前で OK です。今回は Azure VM 名を指定)
❷ Logstash VM のプライベート IP、ポート番号に 1514 を指定します。
❸ TCP を選択します。
Syslog 送信テスト
❹ の [送信テスト]
ボタンを押します。(エラーにならなければ OK です)
下部に [送信対象]
と [送信元サブマネージャー]
が表示されるため、全部チェックを入れます。
送信対象と送信元サブマネージャー
4. Elastic Cloud でのログ検索
Elastic Cloud 管理画面 の Deployment
の名前を開き、Kibana にログインします。
ログイン後、[Management] > [Stack Management] > [Index Management]
を開きます。
lanscopecat-
の Index があれば、ログの取り込みは成功です。
Index Management
Discover
画面に移動し、[Data view]
右の下矢印から [Create a data view]
を開きます。
Crerate a data view
❶ 以下の設定で LANSCOPE 用に Data View を作成します。
・Name
は好きな名前をつけます。(Index pattern と同じが分かりやすいです)
・Index pattern
を lanscopecat-*
とし、LANSCOPE の全 Index にマッチするようにします。
・Timestamp field
は @timestamnp
を指定します。
lanscope 用の Data view を作成
❷ のボタンを押して保存します。
❸ Data view
で作成した lanscopecat-*
を指定します。
❹ ↔︎
をクリックすると ❺ の取り込んだログの詳細が開きます。
【補足】
以下、操作ログ(Operation) をサンプルに、Windows と MacOS のログ情報の差異になります。
No | フィールド名 | Windows | MacOS |
---|---|---|---|
01 | @timestamp | 2025-03-03T10:02:51.456Z | 2025-03-03T20:58:21.000Z |
02 | ActivationTime | 0:09:07 | 0:00:00 |
03 | ActivationTime(sec) | 547 | 0 |
04 | Agent | DESKTOP-BB9MLP5 | MacBook-Pro |
05 | AgentNo | 2 | 1 |
06 | AlertType | (empty) | (empty) |
07 | AlertTypeNo | 0 | 0 |
08 | Application | chrome.exe | Google Chrome.app |
09 | appname | lanscopecat | lanscopecat |
10 | Category | 1 | 1 |
11 | Dept | test | test |
12 | Device | (empty) | (empty) |
13 | Event | ACTIVE | ACTIVE |
14 | FileSize | 0 | 0 |
15 | hostname | ls-mgr | ls-mgr |
16 | IPAddress | 192.168.0.29 | (empty) |
17 | Label | (empty) | (empty) |
18 | LogonUser | test-user2 | test-user1 |
19 | msgid | operation | operation |
20 | Off-HourAlert | 深夜 | 早朝 |
21 | pri | 116 | 116 |
22 | procid | - | - |
23 | ServerReceivedDate/Time | 2025-03-03T19:15:37.104+09:00 | 2025-03-04T05:59:23.366+09:00 |
24 | Sub-ManagerNo | 1 | 51 |
25 | token | LanScopeCat@49660 | LanScopeCat@49660 |
26 | UTCDate/Time | 2025-03-03T10:02:51.456+00:00 | 2025-03-03T20:58:21.000+00:00 |
27 | version | 1 | 1 |
28 | WindowTitle | 新しいタブ - Google Chrome | Discover - Elastic |
まとめ
さて、いかがでしたでしょうか?
なるべくコンパクトにまとめた長文の内容になってしまいました、すいません。
個人的には、実施内容
の 2.Logstash のパイプライン開発
が一番書きたかった内容ですので、そこだけでも楽しんで読んで頂けると嬉しいです。
今回は Logstash を使って ELastic Cloud に取り込みを行いましたが、次は別の方法で Microsoft Sentinel に取り込みたいと思います。そちらも実施したら、ブログにまとめたいと思います。
Discussion