🔎

【Elastic】Lanscope の PC 操作ログを取り込んでみた

2025/03/04に公開

はじめに

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 にはインターネット越しに通信します。


全体構成図

実施内容

以下、実施手順になります。

  1. Logstash のインストール
  2. Logstash のパイプライン開発
  3. LANSCOPE Endpoint Manager の Syslog 連携設定
  4. Elastic Cloud でのログ検索

1. Logstash のインストール

まずは Logastash 用の Azure VM にログインします。

1-1. OS への SSH ログイン

VM 作成時にダウンロードした SSH 鍵を使って VM に SSH 接続します。

ダウンロードした SSH 鍵を ssh ディレクトリ配下に移動します。

SSH 鍵の移動
mv /Users/<username>/Downloads/<your-private-key> ~/.ssh/

移動した SSH 鍵に所有者の読み取り権限を付与します。

読み取り権限の付与
chmod 400 ~/.ssh/<your-private-key>

azureuser ユーザーで Azure VM のパブリック IP アドレスに対して、SSH 接続します。

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.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 をインストールします。

Logastash のインストール
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] を作成して定義します。パイプライン構成ファイルは inputfilteroutput の 3つのセクション [4] で構成されます。

本投稿では、パイプライン構成ファイルは logstash.conf とします。

logstash.conf の作成
sudo vi /etc/logstash/conf.d/logstash.conf

2-1. input の作成

まず、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
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 のサンプルログになります。

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@49660token フィールドとして抜き取ります。
・それ以降のメッセージは key="value" 形式になるため、kv filter plugin で処理します。

【解説③】
dissect filter plugin で抽出した paramskv filter plugin で処理します。
key="value" となっているため、value_splittrim_value でフィールド抽出します。
key="value" 同士の間が半角スペースとなっているため、field_split で指定します。
value が空値の場合があるため、allow_empty_vauletrue とします。

【解説④】
date filter plugin を使い、timestanmp の値を @timsptamp に利用します。
timestampISO8601 形式の時刻フォーマットを取っています。

【解説⑤】
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 pluginconvert を使い、文字列型から数値型に変換します。

【解説⑧】
mutate filter pluginlowercase を使い、appnamemsgid の値を小文字にします。

【解説⑨】
mutate filter pluginremove_field を使い、Elasticsearch に取り込まないフィールドを削除します。
paramstimestampmessage はフィールド抽出されたため、不要なフィールドとなります。

【参考】
Dissect filter plugin(公式ページ)
Kv filter plugin(公式ページ)
Date filter plugin(公式ページ)
Conditionals(公式ページ)
Ruby filter plugin(公式ページ)
Mutate filter plugin(公式ページ)

2-3. output の作成

最後は 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_idcloud_auth は Elastic Cloud の接続認証に必要になります。
cloud_idElastic 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 を再起動(停止中の場合は「起動」)します。

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 patternlanscopecat-* とし、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 に取り込みたいと思います。そちらも実施したら、ブログにまとめたいと思います。

脚注
  1. LANSCOPE エンドポイントマネージャー オンプレミス版(公式ページ) ↩︎

  2. Logstash(公式ページ) ↩︎

  3. Pipeline Configuration Files(公式ページ) ↩︎

  4. Creating a Logstash pipeline(公式ページ) ↩︎

Logspect Tech Blog

Discussion