eBPFベースのLinux向けSysmonがMicrosoftからOSS化されました

2021.11.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Windows にはOSのプロセス生成、ファイル操作などのイベントを収集する Sysmon というツールが存在します。 先月の 2021/10/14 に Windows Sysinternals の誕生25周年を記念し、Linux 向けの sysmonが Microsoft からOSSとしてリリースされました。

OS の違いこそあるものの、収集イベントの種類や設定ファイル、ログフォーマットなどは既存の Windows 版に寄せて作られています。

Sysmon は、システムコール、ネットワーク接続、ファイル操作などのイベントをフックする必要があるため、Linuxカーネルでサンドボックス化されたプログラムを実行する eBPF が活用されています。

※ 図は Automating the deployment of Sysmon for Linux ? and Azure Sentinel in a lab environment ? - Microsoft Tech Community から引用

Sysmon の主なコンポーネントは以下の3つです

  • sysinternalsEBPF : eBPF を活用した Sysmon 向けライブラリ
  • sysmon : メインプログラム
  • sysmonLogView : sysmon の生成する XML 形式のログをパースするプログラム

Amazon EC2 Ubuntu 20.04 に Sysmon をインストールし、インベントのロギングとイベント閲覧までを簡単に確認したので、共有します。

やってみた

RedHat, Ubuntu など主要ディストリビューション向けにパッケージが提供されています。

レポジトリの鍵のインストール

$ wget -q https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
$ sudo dpkg -i packages-microsoft-prod.deb

パッケージのインストール

$ sudo apt-get update
$ sudo apt-get install sysinternalsebpf # ライブラリ
$ sudo apt-get install sysmonforlinux   # プログラム

プログラムがインストールされていることを確認

$ sysmon -h
$ sudo /opt/sysmon/sysmonLogView -h  # root 権限が必要

エージェントの起動

どのイベントをフックするか、設定ファイルで指定します。

設定のフォーマットは Windows 向けと同等です。

全部補足する場合の設定ファイルは以下です。

<Sysmon schemaversion="4.70">
  <EventFiltering>
    <!-- Event ID 1 == ProcessCreate. Log all newly created processes -->
    <RuleGroup name="" groupRelation="or">
      <ProcessCreate onmatch="exclude"/>
    </RuleGroup>
    <!-- Event ID 3 == NetworkConnect Detected. Log all network connections -->
    <RuleGroup name="" groupRelation="or">
      <NetworkConnect onmatch="exclude"/>
    </RuleGroup>
    <!-- Event ID 5 == ProcessTerminate. Log all processes terminated -->
    <RuleGroup name="" groupRelation="or">
      <ProcessTerminate onmatch="exclude"/>
    </RuleGroup>
    <!-- Event ID 9 == RawAccessRead. Log all raw access read -->
    <RuleGroup name="" groupRelation="or">
      <RawAccessRead onmatch="exclude"/>
    </RuleGroup>
    <!-- Event ID 10 == ProcessAccess. Log all open process operations -->
    <RuleGroup name="" groupRelation="or">
      <ProcessAccess onmatch="exclude"/>
    </RuleGroup>
    <!-- Event ID 11 == FileCreate. Log every file creation -->
    <RuleGroup name="" groupRelation="or">
      <FileCreate onmatch="exclude"/>
    </RuleGroup>
    <!--Event ID 23 == FileDelete. Log all files being deleted -->
    <RuleGroup name="" groupRelation="or">
      <FileDelete onmatch="exclude"/>
    </RuleGroup>
  </EventFiltering>
</Sysmon>

設定ファイルを -i オプションで指定し、初回起動時は -accepteula で 使用許諾契約書に同意します。

$ sudo sysmon -accepteula -i config.xml

Sysmon v1.0.0 - Monitors system events
Sysinternals - www.sysinternals.com
By Mark Russinovich, Thomas Garnier and Kevin Sheldrake
Copyright (C) 2014-2021 Microsoft Corporation
Using libxml2. libxml2 is Copyright (C) 1998-2012 Daniel Veillard. All Rights Reserved.

Loading configuration file with schema version 4.70
Sysmon schema version: 4.81
Configuration file validated.
Created symlink /etc/systemd/system/multi-user.target.wants/sysmon.service → /etc/systemd/system/sysmon.service.

$ sudo systemctl status sysmon
● sysmon.service - Sysmon event logger
     Loaded: loaded (/etc/systemd/system/sysmon.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2021-11-11 08:30:25 UTC; 1h 17min ago
    Process: 2042 ExecStart=/opt/sysmon/sysmon -i /opt/sysmon/config.xml -service (code=exited, status=0/SUCCESS)
   Main PID: 2103 (sysmon)
      Tasks: 1 (limit: 1124)
     Memory: 184.0M
     CGroup: /system.slice/sysmon.service
             └─2103 /opt/sysmon/sysmon -i /opt/sysmon/config.xml -service

Nov 11 09:47:32 ip-172-31-43-133 sysmon[2103]: <Event><System><Provider Name="Linux-Sysmon" Guid="{ff032593-a8d3-4f13-b0d6-01fc615a0f97}"/><EventID>5</EventID><Version>3</Version><Level>4</Level><Task>5</Task><>
Nov 11 09:47:32 ip-172-31-43-133 sysmon[2103]: <Event><System><Provider Name="Linux-Sysmon" Guid="{ff032593-a8d3-4f13-b0d6-01fc615a0f97}"/><EventID>5</EventID><Version>3</Version><Level>4</Level><Task>5</Task><>
Nov 11 09:47:32 ip-172-31-43-133 sysmon[2103]: <Event><System><Provider Name="Linux-Sysmon" Guid="{ff032593-a8d3-4f13-b0d6-01fc615a0f97}"/><EventID>1</EventID><Version>5</Version><Level>4</Level><Task>1</Task><>
Nov 11 09:47:32 ip-172-31-43-133 sysmon[2103]: <Event><System><Provider Name="Linux-Sysmon" Guid="{ff032593-a8d3-4f13-b0d6-01fc615a0f97}"/><EventID>5</EventID><Version>3</Version><Level>4</Level><Task>5</Task><>
Nov 11 09:47:33 ip-172-31-43-133 sysmon[2103]: <Event><System><Provider Name="Linux-Sysmon" Guid="{ff032593-a8d3-4f13-b0d6-01fc615a0f97}"/><EventID>1</EventID><Version>5</Version><Level>4</Level><Task>1</Task><>
Nov 11 09:47:33 ip-172-31-43-133 sysmon[2103]: <Event><System><Provider Name="Linux-Sysmon" Guid="{ff032593-a8d3-4f13-b0d6-01fc615a0f97}"/><EventID>3</EventID><Version>5</Version><Level>4</Level><Task>3</Task><>
Nov 11 09:47:33 ip-172-31-43-133 sysmon[2103]: <Event><System><Provider Name="Linux-Sysmon" Guid="{ff032593-a8d3-4f13-b0d6-01fc615a0f97}"/><EventID>3</EventID><Version>5</Version><Level>4</Level><Task>3</Task><>
Nov 11 09:47:33 ip-172-31-43-133 sysmon[2103]: <Event><System><Provider Name="Linux-Sysmon" Guid="{ff032593-a8d3-4f13-b0d6-01fc615a0f97}"/><EventID>3</EventID><Version>5</Version><Level>4</Level><Task>3</Task><>
Nov 11 09:47:33 ip-172-31-43-133 sysmon[2103]: <Event><System><Provider Name="Linux-Sysmon" Guid="{ff032593-a8d3-4f13-b0d6-01fc615a0f97}"/><EventID>1</EventID><Version>5</Version><Level>4</Level><Task>1</Task><>
Nov 11 09:47:33 ip-172-31-43-133 sysmon[2103]: <Event><System><Provider Name="Linux-Sysmon" Guid="{ff032593-a8d3-4f13-b0d6-01fc615a0f97}"/><EventID>1</EventID><Version>5</Version><Level>4</Level><Task>1</Task><>
lines 1-20/20 (END)

初回起動時に EULA に同意するオプションを省くと、以下のエラーメッセージが出ます。

$ sudo sysmon  -i config.xml
...
This is the first run of this program. You must accept EULA to run Sysmon.
Use -accepteula to accept EULA.

$

イベントを発生

プロセスの起動、ファイル操作、ネットワーク通信などを発生させ、イベントを記録させます。

$ touch /tmp/foo をすると、以下のログが syslog に出力されました。

$ sudo tail -f /var/log/syslog
...
Nov 11 09:48:32 ip-172-31-43-133 sysmon: <Event><System><Provider Name="Linux-Sysmon" Guid="{ff032593-a8d3-4f13-b0d6-01fc615a0f97}"/><EventID>11</EventID><Version>2</Version><Level>4</Level><Task>11</Task><Opcod
e>0</Opcode><Keywords>0x8000000000000000</Keywords><TimeCreated SystemTime="2021-11-11T09:48:32.294330000Z"/><EventRecordID>3231</EventRecordID><Correlation/><Execution ProcessID="2103" ThreadID="2103"/><Channel>Linux-Sysmon/Operational</Channel><Computer>ip-172-31-43-133</Computer><Security UserId="0"/></System><EventData><Data Name="RuleName">-</Data><Data Name="UtcTime">2021-11-11 09:48:32.295</Data><Data Name="ProcessGuid">{ec223c17-e6f0-618c-6180-535f1b560000}</Data><Data Name="ProcessId">2949</Data><Data Name="Image">/usr/bin/touch</Data><Data Name="TargetFilename">/tmp/foo</Data><Data Name="CreationUtcTime">2021-11-1109:48:32.295</Data><Data Name="User">ubuntu</Data></EventData></Event>

sysmonLogView でイベントを見やすく

ログフォーマットは XML のため、可視性が優れません。

XML をパースする付属プログラム sysmonLogView でログを閲覧します。このプログラムの実行にはルート権限が必要です。

$ sudo tail -f /var/log/syslog | sudo /opt/sysmon/sysmonLogView -e 11
Event SYSMONEVENT_FILE_CREATE
        RuleName: -
        UtcTime: 2021-11-11 09:52:02.316
        ProcessGuid: {ec223c17-e7c2-618c-6140-e3acb5550000}
        ProcessId: 2976
        Image: /usr/bin/touch
        TargetFilename: /tmp/bar
        CreationUtcTime: 2021-11-11 09:52:02.316
        User: ubuntu

-e オプションでイフィルターするベントの種類を指定できます。

Event ID Description
1 Logs when a new process is created.
3 Logs TCP/UDP connections on the machine
4 Logs the state of the Sysmon service (started or stopped).
5 Logs when a process terminates.
9 Logs when a process conducts reading operations, from the drive.
11 Logs when a file is created or overwritten.
16 Logs when the local Sysmon configuration is updated.
23 Logs when a file is deleted by a process.

今回はファイルの作成のため、 11:Logs when a file is created or overwritten. を指定しています。

次はインターネットから SSH ログインしたときのイベントです。 3:Logs TCP/UDP connections on the machine を指定しています。

$ sudo tail -f /var/log/syslog  | sudo /opt/sysmon/sysmonLogView -e 3
...
Event SYSMONEVENT_NETWORK_CONNECT
        RuleName: -
        UtcTime: 2021-11-11 10:17:29.576
        ProcessGuid: {ec223c17-d342-618c-351f-bd7859550000}
        ProcessId: 673
        Image: /usr/sbin/sshd
        User: root
        Protocol: tcp
        Initiated: false
        SourceIsIpv6: false
        SourceIp: 1.2.3.4
        SourceHostname: -
        SourcePort: 58840
        SourcePortName: -
        DestinationIsIpv6: false
        DestinationIp: 172.31.43.133
        DestinationHostname: -
        DestinationPort: 22
        DestinationPortName: -

ログを Azure Sentinel に統合

Linux サーバー内にログをとどめておくのはもったいないです。 次の記事のように Azure Sentinel にログを集約・分析するなどしたほうが良いでしょう。

Automating the deployment of Sysmon for Linux ? and Azure Sentinel in a lab environment ? - Microsoft Tech Community

最後に

Microsoft から OSS としてリリースされた Sysmon For Linux を Ubuntu にインストールし、イベントを収集する方法を紹介しました。

既存の Windows 向け Sysmon の設定やログ出力を踏襲しているため、 Windows OS 向けに Sysmon を利用している環境においては、Linux OS 向けにも展開しやすいのではないかと思いました。

ライブラリ(SysinternalsEBPF)をチラ見すると、随分スッキリと書かれており、 eBPF の偉大さを感じることができました。

それでは。

参考