はじめに
- 近年Linux環境を狙った攻撃(ランサムウェアなど)も増えている
「ランサムウェア:Windowsに比べれば少ないものの、Linux向けのランサムウェアも存在します。2022年初旬から2023年までに、Linux向けランサムウェアの攻撃が62%増加したことが、2023年上半期セキュリティレポートで報告されています。例として、金融機関を対象としたKillDisk というランサムウェアがあります.」
-
MITRE ATT&CKの対応OSの中にもLinux環境の戦略と戦術が当然のようにある
-
Splunk Security ContentsにもLinux関連のルールが充実してきた
-
WindowsでおなじみのSysmonにLinux OS用のモジュールが出ている
- 数年前はosqueryを使いましょうと言っていたが、windowsでも慣れているsysmonは統一して監視もしやすいと個人的には思っている
-
以上の背景からLinuxサーバのセキュリティ監視ベストプラクティスをまとめていくシリーズを始める(まずは概要編)
- Sysmon for Linux 導入編はこちら
Linux環境のセキュリティ監視代表ログソース
-
監視に有用なログソース選別の方法として、Splunk Security ContentsからLinuxに関するAnalytics Storyを元に必要なデータおよびルールを見繕ってみた
-
というのもMITRE ATT&CKのLinuxにおけるDetection方法を見てみるとざっと以下の様なログソースが必要と出てくる
-
この中でもsysmonとauditdが比較的各ステップで出てくることに気づく
-
Splunk Security ContentsのLinux環境における検知ルールを見ても、sysmonとauditdが大半を占めている事がわかる
-
例:Compromised Linux HostルールパックはAuditdを使う
-
例:Linux livong off the landルールパックはSysmonも使っている
-
以上の事から、まず検知ルールが用意されているauditdとsysmonを中心に調査をしてみる
- 取り込み方法、ログ量、検知テストなど
検証環境
auth.log /secure.log
-
概要
-
取り込み方法
- secure.logの場合
- Splunk Add-on for Unix and Linuxを使ってsourcetype=linux_secureを利用すればOK
- auth.logの場合
- secure.logの場合
Auditd
- 概要
- Linuxカーネルの監査フレームワーク(Audit Framework)の一部で、セキュリティ監査ログを収集・管理するデーモン
- Auditdのインストールと設定は次回別記事で紹介します
- 取り込み方法
-
Splunk Add-on for Linuxを使ってsourcetype=linux:auditを利用
- ※昔からあるSplunk Add-on for Unix and Linuxの場合、sourcetype=linux_auditとなっており、Security Contentsのサーチがそのまま使えないので注意
-
Splunk Add-on for Linuxを使ってsourcetype=linux:auditを利用
- 容量:
Sysmon for Linux
- 概要
- Microsoftが開発した簡易EDRのLinux版です
- Sysmon for Linuxの導入
vi config.xml
<Sysmon schemaversion="4.81">
<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">
<TargetFilename condition="begin with">/opt/splunkforwarder/var/lib/splunk/modinputs/journald</TargetFilename> <!--Exclude Splunk Modinput Journal-->
</FileCreate>
</RuleGroup>
<!--Event ID 23 == FileDelete. Log all files being deleted -->
<RuleGroup name="" groupRelation="or">
<FileDelete onmatch="exclude"/>
</RuleGroup>
</EventFiltering>
</Sysmon>
- 取り込み方法
- Splunk Add-on for Sysmon for Linuxを使うとCIMにもマッピングしてくれる
- inputs設定はlinuxのjournaldをモニタリングする設定がdefaultで有効になっている
cat /opt/splunk/etc/apps/Splunk_TA_sysmon-for-linux/local/inputs.conf
[journald://sysmon]
index = linuxsysmon
- btoolでinputs設定を確認してみると、30秒間隔でjournaldに書きがしていることが分かる
/opt/splunk/etc/apps/Splunk_TA_sysmon-for-linux/local# /opt/splunk/bin/splunk btool inputs list --debug --app=Splunk_TA_sysmon-for-linux
/opt/splunk/etc/apps/Splunk_TA_sysmon-for-linux/local/inputs.conf [journald://sysmon]
/opt/splunk/etc/apps/Splunk_TA_sysmon-for-linux/local/inputs.conf index = linuxsysmon
/opt/splunk/etc/apps/Splunk_TA_sysmon-for-linux/default/inputs.conf interval = 30
/opt/splunk/etc/apps/Splunk_TA_sysmon-for-linux/default/inputs.conf journalctl-exclude-fields = __MONOTONIC_TIMESTAMP,__SOURCE_REALTIME_TIMESTAMP
/opt/splunk/etc/apps/Splunk_TA_sysmon-for-linux/default/inputs.conf journalctl-filter = _SYSTEMD_UNIT=sysmon.service
/opt/splunk/etc/apps/Splunk_TA_sysmon-for-linux/default/inputs.conf journalctl-include-fields = PRIORITY,_SYSTEMD_UNIT,_SYSTEMD_CGROUP,_TRANSPORT,_PID,_UID,_MACHINE_ID,_GID,_COMM,_EXE
/opt/splunk/etc/apps/Splunk_TA_sysmon-for-linux/default/inputs.conf journalctl-quiet = true
/opt/splunk/etc/apps/Splunk_TA_sysmon-for-linux/default/inputs.conf sourcetype = sysmon:linux
-
容量
-
TIPS: journaldから明示的にsyslog転送をNOにする
- syslogファイルがsysmonログで溢れます。。。私のubuntu環境の場合、defaultでsyslogにも書き出してしまう設定になっていたため、syslog転送を無効にしました
sudo nano /etc/systemd/journald.conf
ForwardToSyslog=no
sudo systemctl restart systemd-journald
AuditdとSysmonの違い
-
Chatgptに「Linux環境のセキュリティ監視におけるauditd とsysmonの用途の違いは?」聞いた際の回答サマリ
-
実際にMITRE ATT&CK のT1548.003で使われるsudoコマンドを叩いてどのように記録されるか検証してみた
-
更にSplunk Security ContentsのDetection: Linux APT Privilege Escalationも試してみる
(Detection: Linux APT Privilege Escalationの解説)
Linux システム上で sudo を介して昇格した権限による Advanced Package Tool (APT) の使用を検出します。この分析では、EDR(Endpoint Detection and Response)テレメトリを活用して、APTコマンドがsudo権限で実行されるプロセスを特定します。このアクティビティは、ユーザがrootとしてシステムコマンドを実行できることを示しており、rootシェルへの不正アクセスにつながる可能性があるため、重要な意味を持ちます。悪意があると確認された場合、攻撃者は特権を昇格させ、任意のコマンドを実行し、影響を受けたシステムを完全に制御できるようになり、深刻なセキュリティリスクを引き起こす可能性があります。
sudo apt-get update -o APT::Update::Pre-Invoke::=/bin/sh
- Security ContentsのSearchを実行
| tstats `security_content_summariesonly` count min(_time) as firstTime max(_time) as lastTime from datamodel=Endpoint.Processes where Processes.process="*apt*" AND Processes.process="*APT::Update::Pre-Invoke::*" AND Processes.process="*sudo*" by Processes.dest Processes.user Processes.parent_process_name Processes.process_name Processes.process Processes.process_id Processes.parent_process_id Processes.process_guid
| `drop_dm_object_name(Processes)`
| `security_content_ctime(firstTime)`
| `security_content_ctime(lastTime)`
| `linux_apt_privilege_escalation_filter`
参考設定
- Splunk謹製のAttack Rangeから参考にする
-
Sysmon
- https://github.com/splunk/attack_range/blob/develop/configs/SysMonLinux-CatchAll.xml
- Splunk Add-on for Sysmon for Linuxのマニュアルにも推薦文がある
-
Auditd
- https://raw.githubusercontent.com/Neo23x0/auditd/master/audit.rules
- Attack Range内でもNeo23x0作成のbest practiceを採用していた
-
次回の記事ネタ
- Auditdの有効化及び設定方法
- Sysmon for Linuxのチューニング方法 (2024.12.22リリース)