Linuxサーバのセキュリティ監視プラクティス (導入編) - Sysmon for Linux

## はじめに
- 前回の[概要編](https://qiita.com/odorusatoshi/items/05209655932f0bb401ba)に続き、Sysmon for Linuxの導入の流れとTIPSをこちらでまとめていく
- 前回の概要編はSplunk Single構成のSH&IDXサーバにインストールした例でしたが、今回はSplunk Universal Forwarderをubuntuにインストールした構成にしています

## 検証構成
![スクリーンショット 2024-12-22 7.54.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/556e2454-91e0-83b3-4680-1820393713c3.png)


## 導入
#### ※Splunk UFの導入と初期設定は省略します
- Sysmon取得のためにMSのパッケージを準備
```shell
wget -q https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb

↑なぜかパッケージが0 byteで上手くDLできなかったのであきらめてcurlで取得

curl -O https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb

sudo dpkg -i packages-microsoft-prod.deb
```

- sysmon for linuxのインストール
```bash
sudo apt-get update
sudo apt-get install sysmonforlinux

# sudo apt-get install sysinternalsebpf
↑今回は未利用※
```

※eBPFがあるとカーネルレベルで詳細ロギングができる模様。次回調査テーマとして扱います。
![スクリーンショット 2024-12-22 10.02.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/c196b7c4-cc62-b8ed-490c-6712d10dc701.png)


- 初期設定
```bash
sudo sysmon -accepteula -i

sudo tail -f /var/log/syslog
↑ログの確認
```

- default config.xmlの確認と念の為コピーしておく
```bash
cat config.xml_org 
<Sysmon schemaversion="4.22">
<EventFiltering>
</EventFiltering>
</Sysmon>

cp -p config.xml config.xml_org
```


## SysmonロギングからSplunk関連のプロセスを除外
- Sysmon for Linuxを導入し、Splunk/Splunk UFが稼働していると余計なロギングをしてしまう
-特に多い、Event ID 1(ProcessCreate)と Event ID 11 (FileCreate)でSplunk関連のプロセスが大量に発生しているのでこれを除外したい
- 例：Splunk Indexer機能を利用していると、ファイル作成が暴発する
![スクリーンショット 2024-12-16 21.47.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/9fe40b82-5c84-0d4a-eb97-5c443c5e4468.png)

- 参考config.xmlとしてSplunkAttackRangeの以下ファイルを流用。ただしこれでもフィルタが不十分
    - [configs/SysMonLinux-CatchAll.xml](https://github.com/splunk/attack_range/blob/develop/configs/SysMonLinux-CatchAll.xml)
- SplunkForwarder関連の不要な操作をログからフィルタするために修正した**以下confg.xmlを適用する**
    - [v4.81_sysmonforlinuxconfig.xml](https://github.com/odorusatoshi/sysmon-config/blob/master/v4.81_sysmonforlinuxconfig.xml)


## 修正内容
- EventID:1 ProcessCreateでのポイントは以下Splunk関連のImageを除外する
```bash
 <!-- Splunk UF -->
        <Image condition="contains">splunk</Image>
        <Image condition="contains">streamfwd</Image>
        <Image condition="contains">splunkd</Image>
        <Image condition="contains">splunk-optimize</Image>
        <Image condition="contains">splunk-MonitorNoHandle</Image>
        <Image condition="contains">splunk-admon</Image>
        <Image condition="contains">splunk-netmon</Image>
        <Image condition="contains">splunk-regmon</Image>
        <Image condition="contains">splunk-winprintmon</Image>
        <Image condition="contains">btool</Image>
        <Image condition="contains">PYTHON</Image>
```

- EventID:11 FileCreateでのポイントは以下Splunk関連のImageを除外する
```bash
<TargetFilename condition="begin with">/opt/splunkforwarder/var/lib/splunk/modinputs/journald</TargetFilename> <!--Exclude Splunk Modinput Journal-->
<TargetFilename condition="begin with">/opt/splunk</TargetFilename> <!--Exclude Splunk -->
<TargetFilename condition="begin with">/data</TargetFilename> <!--Exclude Splunk Indexed Data-->
```
- config.xmlの更新
```bash
sysmon -c config.xml

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

Loading configuration file with schema version 4.81
Configuration file validated.

↑構文エラーがなければ良し

systemctl restart sysmon.service
↑サービス再起動
```
- ログが届きました
![スクリーンショット 2024-12-22 9.51.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/157d57b0-5f35-0358-9d0f-a2553f8d8421.png)


## (忘れないで)syslogとjournaldのログローテーション設定
- Splunkにログを転送しつつ、サーバ側のオリジナルログ(syslogとjournald)が溢れないように設定を入れておきます


### journaldローテーション設定
- journaldには永続ログ(/var/log/journal配下)と一時的なログ(/var/run/journal配下)を保持する

```bash
・ログ全体の最大サイズを50MB、ファイルごとの最大サイズを50MBに制限したい場合の例

vi /etc/systemd/journald.conf

[Journal]
SystemMaxUse=50M
SystemKeepFree=100M
SystemMaxFileSize=50M
SystemMaxFiles=10

・設定保存後、サービス再起動
sudo systemctl restart systemd-journald
```

- （参考）journaldのローテーションがちゃんとされているか確認
```bash
・diskサイズの確認
journalctl --disk-usage

Archived and active journals take up 106.0M in the file system.

・実際のサイズを確認
/var/log/journal/998b65a11cd3435a8bb3bb8fbcdbf9b8# ll
合計 116760
drwxr-sr-x+ 2 root systemd-journal    12288 12月 22 09:04  ./
drwxr-sr-x+ 3 root systemd-journal     4096  6月 18  2023  ../
-rw-r-----+ 1 root systemd-journal 50331648 12月 22 09:09  system.journal
-rw-r-----+ 1 root systemd-journal 52428800 12月 22 09:04 'system@6b1578d3dc9a40d89ecc89922da41b5e-0000000056eb9f53-000629d08eb1c8c5.journal'


・もう一度、サイズを確認
journalctl --disk-usage

Archived and active journals take up 58.0M in the file system.

・定期的に1ファイル50MBを超えると過去１世代アーカイブファイルを残してローテーションされていることがわかる
```

- (参考)journalログの２つのファイルの違い
![スクリーンショット 2024-12-22 9.14.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185759/30149753-1ee2-ee23-43cc-004ae8b5160e.png)

### syslogローテーション設定
- defaultでrsyslogがローテーション管理をしています
    - 環境に応じてローテーションタイミングは適宜変更できます
```bash
cat /etc/logrotate.d/rsyslog
/var/log/syslog
/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/lpr.log
/var/log/cron.log
/var/log/debug
/var/log/messages
{
	rotate 4
	weekly
	missingok
	notifempty
	compress
	delaycompress
	sharedscripts
	postrotate
		/usr/lib/rsyslog/rsyslog-rotate
	endscript
}
```

## 参照リンク
- https://github.com/microsoft/SysmonForLinux/blob/main/INSTALL.md
- https://dev.classmethod.jp/articles/sysmon-for-linux-oss/
- https://www.secuavail.com/kb/windows-linux/sysmonforlinux-ubuntu-almalinux/



#### 次回は実用編(Security Contentsを使った検知テスト)を実施していきます！