この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
Windows にはOSのプロセス生成、ファイル操作などのイベントを収集する Sysmon というツールが存在します。 先月の 2021/10/14 に Windows Sysinternals の誕生25周年を記念し、Linux 向けの sysmonが Microsoft からOSSとしてリリースされました。
- Sysinternals/SysmonCommon: The common parts of the Sysinternals Sysmon tool shared between the Windows and Linux versions.
- Lead Microsoft Engineer Kevin Sheldrake Brings Sysmon to Linux | | LinuxSecurity.com
OS の違いこそあるものの、収集イベントの種類や設定ファイル、ログフォーマットなどは既存の Windows 版に寄せて作られています。
Sysmon は、システムコール、ネットワーク接続、ファイル操作などのイベントをフックする必要があるため、Linuxカーネルでサンドボックス化されたプログラムを実行する eBPF が活用されています。
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 にログを集約・分析するなどしたほうが良いでしょう。
最後に
Microsoft から OSS としてリリースされた Sysmon For Linux を Ubuntu にインストールし、イベントを収集する方法を紹介しました。
既存の Windows 向け Sysmon の設定やログ出力を踏襲しているため、 Windows OS 向けに Sysmon を利用している環境においては、Linux OS 向けにも展開しやすいのではないかと思いました。
ライブラリ(SysinternalsEBPF)をチラ見すると、随分スッキリと書かれており、 eBPF の偉大さを感じることができました。
それでは。
参考
- Automating the deployment of Sysmon for Linux ? and Azure Sentinel in a lab environment ? - Microsoft Tech Community
- Lead Microsoft Engineer Kevin Sheldrake Brings Sysmon to Linux | | LinuxSecurity.com
- Sysinternals/SysmonForLinux
- GitHub - Sysinternals/SysinternalsEBPF: The Linux port of the Sysinternals Sysmon tool.
- eBPF - Introduction, Tutorials & Community Resources