Splunk系列之Splunk搜索分析篇
一、簡單概述
Splunk 平臺的核心就是 SPL,即 Splunk 搜索處理語言。
它提供了非常強(qiáng)大的能力,通過簡單的SPL語句就可以實(shí)現(xiàn)對安全分析場景的描述。
這里,我們以Linux secure日志分析作為示例,進(jìn)行安全場景的構(gòu)建。
二、安全日志
我們先來了解一下Linux secure日志中比較常見的登錄日志,如下兩條登錄記錄作為示例:
#登錄失敗
Thu Feb 08 2022 00:15:04 www2 sshd[1100]: Failed password for root from 142.162.221.28 port 4585 ssh2
#登錄成功
Thu Feb 08 2022 00:15:05 mailsv1 sshd[74181]: Accepted password for nsharpe from 10.2.10.163 port 4245 ssh2
通過對比,我們可以找到幾個(gè)關(guān)鍵信息,比如登錄動(dòng)作(成功/失敗),用戶名、ip地址等,可以通過編輯正則表達(dá)式將關(guān)鍵字段提取出來,以便進(jìn)行搜索和分析。
新增字段提?。?/p>
三、安全分析場景
3.1 用戶暴力破解
場景描述:用戶賬戶在短時(shí)間內(nèi)嘗試大量的錯(cuò)誤密碼,即可視為用戶暴力破解攻擊。
安全策略:單一賬號,5分鐘內(nèi)超過20次登錄失敗
sourcetype="secure*" action=Failed | bucket _time span=5m | stats count by user,ip | search count>20
3.2 爆破用戶名最多的前10個(gè)用戶名/ip地址
場景描述:獲取暴力破解所使用的密碼本,或者暴力破解的來源IP地址。
- 爆破用戶名TOP 10
sourcetype="secure*" "failed password" | stats count by user| sort 10 -count
- 爆破IP地址TOP 10
sourcetype="secure*" AND "failed password" | stats count by ip | sort 10 -count
3.3 用戶異地登錄
場景描述:用戶在短時(shí)間內(nèi)多次異地登錄,即可視為賬號異常。
安全策略:1天內(nèi)超過3個(gè)城市登錄即可視為異地登錄異常。
sourcetype="secure*" action="Accepted"| bin _time span=1d |iplocation ip | stats values(ip) as ip values(City) as City dc(City) as src_count by user|search src_count>3
3.4 賬號共享
場景描述:同一個(gè)ip登錄多個(gè)賬號,以發(fā)現(xiàn)存在賬號共享的用戶。
安全策略:1天內(nèi)同一個(gè)ip登錄超過10個(gè)賬號
sourcetype="secure*" action="Accepted" | bin _time span=1d | stats count(user) by ip| rename count(user) as User_count | search User_count>10
3.5 異常登錄時(shí)間
場景描述:定義正常的服務(wù)器登錄時(shí)間,如在正常時(shí)間范圍之外登錄,可提示告警。
安全策略:凌晨0點(diǎn)到早上8點(diǎn)內(nèi),登錄成功的賬號。
sourcetype="secure*" action="Accepted" date_hour<8 | table _time,ip,user
3.6 異常IP登錄
場景描述:定義正常的服務(wù)器登錄地址,如在正常的IP地址之外登錄,可提示告警。
安全策略:查找登錄成功的用戶列表,排除來自堡壘機(jī)的登錄ip,就可以獲取到違規(guī)登錄行為。
sourcetype="secure*" action="Accepted" AND ip!="10.1.*" | stats count by ip,user
3.7 整體用戶登錄情況
場景描述:用戶整體的登錄趨勢應(yīng)該是呈現(xiàn)規(guī)律性變化,如果某一天出現(xiàn)異常,就需要對引發(fā)問題的原因進(jìn)行排查。
安全策略:查看每天登錄成功/失敗的次數(shù),有了對照做參考,我們?nèi)菀讖臄?shù)據(jù)趨勢看到異常情況。
sourcetype=secure-* "password" | timechart per_day(eval(action="Accepted"))
as success,per_day(eval(action = "Failed" OR action = "failed")) as Failed