eBPFベースのLinux向けSysmonがMicrosoftからOSS化されました
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