開源EDR(OSSEC)基礎篇-01-設計定位與能力輸出
前言
介紹OSSEC之前,不得不提到當前比較熱門的技術EDR,近幾年隨著大資料SIEM系統的發展,EDR(端點威脅檢測與響應)技術成為了安全界萬眾寵愛的驕子,廣泛用於威脅檢測、攻擊溯源和響應處理的安全場景。
而OSSEC是一款開源的跨平臺的準EDR入侵檢測響應系統,可以實現商業EDR 大部分的功能,可以說OSSEC是所有EDR商業產品的原型,發展至今已經有10幾年的歷史。
在這篇文章中,我們將討論OSSEC這款開源產品的安全能力,儘可能完整的展現OSSEC在各種安全場景中的應用,瞭解這些有助於幫助企業安全管理者更好的使用這款開源安全工具來應對日趨嚴峻的安全問題。
1. 設計定位
1.1 主機監控
OSSEC通過檔案完整性監控,日誌監控,rootcheck和流程監控,全面監控企業資產系統活動的各個方面,對於安全管理提供了依據。
1.2 安全告警
當發生攻擊時,OSSEC會通過傳送告警日誌和郵件警報讓系統管理員及時感知威脅,並在短時間內進行應急處理,最大程度的避免企業遭受損失。OSSEC還可以通過syslog將告警資訊匯出到任何SIEM系統,譬如OSSIM進行關聯安全分析。
1.3 全平臺支援
最難能可貴的是,OSSEC提供了全平臺系統的支援,包括Linux,Solaris,AIX,HP-UX,BSD,Windows,Mac和VMware ESX,突破性的實現了主機入侵態勢感知的全覆蓋。
1.4 功能擴充套件
OSSEC得到了第三方安全團隊的支援,其中Wazuh就是基於OSSEC開發的一個高階版本,在OSSEC的自身功能的基礎上進行擴充套件和優化。
2. 主要能力
對於一款開源工具或者是商業產品,對於使用者最先關心的就是她到底能幹些什麼?
以下通過迷你案例來分別展示OSSEC的主要能力,讓我們暫時不關心如何配置,只關心她能實現什麼價值!!
2.1 日誌監控 異常行為檢測
日誌的監控可分為兩種,一種是被動的採集,通過採集需要的日誌,讀取日誌資訊,標準化輸出適應安全規則使用的內容,當匹配到內建或者自定義的規則,隨後輸出實時告警,從而發現異常;另一種是主動的查詢,通過週期下發命令查詢系統狀態資訊,然後進行新舊資訊比對,從而發現異常。
日誌監控例項
Web日誌識別惡意訪問
從這批日誌裡我們可以看到在一分鐘之內,同一個來源IP地址(207.44.184.96),頻繁的訪問不存在的頁面,出現了大量404的狀態碼,這意味著Web站點正在遭受掃描攻擊
[root@localhost ~]# tail -n 10 /var/log/httpd/access_log
207.44.185.96 - - [23/Mar/2018:19:57:37 -0300] "GET /b2/xmlsrv/xmlrpc.php HTTP/1.0" 404 297 "-" "-"
207.44.185.96 - - [23/Mar/2018:19:57:37 -0300] "GET /blogtest/xmlsrv/xmlrpc.php HTTP/1.0" 404 303 "-" "-"
207.44.185.96 - - [23/Mar/2018:19:57:37 -0300] "GET /blog/xmlsrv/xmlrpc.php HTTP/1.0" 404 299 "-" "-"
207.44.185.96 - - [23/Mar/2018:19:57:37 -0300] "GET /blogs/xmlsrv/xmlrpc.php HTTP/1.0" 404 300 "-" "-"
207.44.185.96 - - [23/Mar/2018:19:57:37 -0300] "GET /blogs/xmlrpc.php HTTP/1.0" 404 293 "-" "-"
207.44.185.96 - - [23/Mar/2018:19:57:36 -0300] "GET /community/xmlrpc.php HTTP/1.0" 404 297 "-" "-"
207.44.185.96 - - [23/Mar/2018:19:57:33 -0300] "GET /drupal/xmlrpc.php HTTP/1.0" 404 294 "-" "-"
207.44.185.96 - - [23/Mar/2018:19:57:30 -0300] "GET /blog/xmlrpc.php HTTP/1.0" 404 292 "-" "-"
207.44.185.96 - - [23/Mar/2018:19:57:30 -0300] "GET /xmlsrv/xmlrpc.php HTTP/1.0" 404 294 "-" "-"
207.44.185.96 - - [23/Mar/2018:19:57:30 -0300] "GET /xmlrpc/xmlrpc.php HTTP/1.0" 404 294 "-" "-"
- 日誌監控告警
Rule: 31151 fired (level 10) -> "Mutiple web server 400 error codes from same source ip."
使用者日誌識別登入異常
從這批日誌裡我們可以看到,同一個來源IP不斷的使用通過同一個賬戶admin嘗試SSH登入,結果都失敗了,不斷的失敗達到一定數量,那就意味著是暴力破解行為
[root@localhost ~]# tail -n 10 /var/log/secure
Jun 26 17:40:27 xx sshd[7629]: Failed password for invalid user admin from 61.146.178.13 port 42107 ssh2
Jun 26 17:40:25 xx sshd[7629]: Invalid user admin from 61.146.178.13
Jun 26 17:40:23 xx sshd[7625]: Failed password for invalid user admin from 61.146.178.13 port 41983 ssh2
Jun 26 17:40:20 xx sshd[7625]: Invalid user admin from 61.146.178.13
Jun 26 17:40:18 xx sshd[7621]: Failed password for invalid user guest from 61.146.178.13 port 41889 ssh2
Jun 26 17:40:15 xx sshd[7621]: Invalid user guest from 61.146.178.13
Jun 26 17:40:14 xx sshd[7617]: Failed password for invalid user test from 61.146.178.13 port 41797 ssh2
- 日誌監控告警
Rule: 5712 fired (level 10) -> "SSHD brute force trying to get access to the system."
系統狀態變更異常
作業系統有很多系統資訊,比如賬號密碼變更,啟動項變更,服務監聽變更,都是通過命令查詢獲知,而通過OSSEC的Command方法,可以週期下發查詢命令,並對輸出結果進行比對,及時感知狀態變化
- 測試方法
使用nc工具,臨時監聽TCP埠
[root@localhost ~]# nc -l 8443
- 日誌監控告警
我們從告警的輸出,就可以知道服務監聽的狀態發生的變更,告警分別列印了,狀態變更前後查詢命令輸出
** Alert 1499397975.7591: mail - ossec,
2018 Jul 21 12:23:15 (192.168.1.137) any->netstat -tan |grep LISTEN |egrep -v `(127.0.0.1| \1)` | sort
Rule: 531 (level 7) -> `Listened ports status (netstat) changed (new port opened or closed).`
ossec: output: `netstat -tan |grep LISTEN |egrep -v `(127.0.0.1| \1)` | sort`:
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:8443 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:37498 0.0.0.0:* LISTEN
tcp 0 0 :::111 :::* LISTEN
tcp 0 0 :::22 :::* LISTEN
tcp 0 0 :::62229 :::* LISTEN
Previous output:
ossec: output: `netstat -tan |grep LISTEN |egrep -v `(127.0.0.1| \1)` | sort`:
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:37498 0.0.0.0:* LISTEN
tcp 0 0 :::111 :::* LISTEN
tcp 0 0 :::22 :::* LISTEN
tcp 0 0 :::62229 :::* LISTEN
更多檢測功能
FTP賬戶密碼暴力破解檢測
SQL隱碼攻擊嘗試檢測
E-mail賬戶密碼暴力破解檢測
檔案系統狀態檢測
應用安裝解除安裝檢測
-
虛擬主機開關狀態檢測
…
當然OSSEC的異常行為檢測功能,不會僅限於上述例子,更多的功能還藏匿於內建規則,等待挖掘,最後隨著不斷深入理解日誌本身,你能利用OSSEC創造出更多更好用的功能。
關於OSSEC的規則部分內容會在後面的章節做詳細的介紹。
2.2 Syscheck檔案完整性檢測 篡改行為檢測
無論攻擊手段有多麼高明,最終的目的是以某種方式改變系統,從修改檔案的病毒到改變核心的後門程式,系統的完整性總會有一些變化,Syscheck完整性檢查是終端檢測的重要組成部分,通過查詢系統和Windows登錄檔中金鑰檔案的MD5/SHA1校驗和的更改來檢測系統完整性的變化,該功能的設計目的是監控作業系統中關鍵檔案的修改情況,及時發現篡改行為。
檔案完整性檢測例項
命令檔案替換監控
瞭解Linux的都知道Linux的一切皆檔案,Linux 中的各種事物比如像文件、目錄、鍵盤、監視器、硬碟、可移動媒體裝置、印表機、調變解調器、虛擬終端,等等一切都可看作是檔案,這就給了攻擊者一個很好的攻擊思路,那就是替換檔案,保留原來檔案的基本功能,同時嵌入後門程式,比較常見被替換的命令檔案有ps
、netstat
、ss
、lsof
等等
- 測試方法
通過vim編輯器做個刪除部分內容的操作,修改之前一定記得備份
[root@localhost ~]# vim /bin/netstat
- Syscheck告警
對於netstat
命令,做了/bin/netstat
檔案變化的監控,收到了下面的告警資訊,檔案大小正常大小為155000
,告警顯示檔案大小從155000
改變為129238
,這樣就能有效的監控命令檔案是否被替換,第一時間感知到這個危險操作
** Alert 1544237296.12315: mail - ossec,syscheck,
2018 Dec 07 21:48:16 bogon->syscheck
Rule: 550 (level 7) -> `Integrity checksum changed.`
Integrity checksum changed for: `/bin/netstat`
Size changed from `155000` to `129238`
Old md5sum was: `60523518c81d85c7d761bd6e6e9a1007`
New md5sum is : `8d07cb216d0f6cab7a9de4881f25244b`
Old sha1sum was: `428980466a122420885d6885b74b8054500367e2`
New sha1sum is : `e9ee23fc6888b2adb7b052670c17fc9dc9281a2c`
2.3 Rootcheck後門檢測 後門行為檢測
Rootkit是一種特殊的惡意軟體,它通過載入特殊的驅動,修改系統核心,進而達到隱藏資訊的目的。Rootkit的基本功能包括提供root後門,控制核心模組的載入、隱藏檔案、隱藏程式、隱藏網路埠,隱藏核心模組等,主要目的在於隱藏自己並且不被安全軟體發現,Rootkit幾乎可以隱藏任何軟體,包括檔案伺服器、鍵盤記錄器、Botnet 和 Remailer,而Rootcheck就是OSSEC提供的專門用於檢測作業系統rootkit的引擎
Rootcheck For Linux
- 使用rootkit_files檔案中包含的已知後門程式檔案或目錄特徵進行掃描識別異常
- 使用rootkit_trojans檔案中包含的已知被感染木馬檔案的簽名進行掃描識別異常
- 對裝置檔案目錄(/dev)、檔案系統、隱藏程式、隱藏埠,混雜模式介面的異常檢測
Rootcheck For Windows
- 通過使用win_applications_rcl檔案中包含的應用特徵進行掃描識別軟體應用
- 通過win_audit_rcl檔案中包含登錄檔進行掃描識別特殊登錄檔項的變動
- 通過win_malware_rcl檔案中包含的惡意軟體特徵進行掃描識別惡意軟體
- 通過system_audit_rcl檔案中包含的服務配置專案進行配置核查以及Web類威脅靜態特徵進行掃描識別異常
- 通過system_audit_ssh檔案中包含的SSH增強檢測功能特徵進行掃描識別異常
後門行為檢測例項
裝置目錄(/dev)建立隱藏檔案
- 測試方法
在/dev下建立隱藏檔案
[root@localhost dev]# touch .ssh
[root@localhost dev]# chmod 777 .ssh
[root@localhost dev]# ls -a /dev | grep `^.`
.
..
.ssh
- Rootcheck告警
rootcheck功能檢測到/dev目錄下存在隱藏檔案,隨後進行了提權操作
[root@localhost ossec]# tailf /var/ossec/logs/alerts/alerts.log
** Alert 1544791226.3893: mail - ossec,rootcheck,
2018 Dec 14 07:40:26 localhost->rootcheck
Rule: 510 (level 7) -> `Host-based anomaly detection event (rootcheck).`
File `/dev/.ssh` present on /dev. Possible hidden file.
** Alert 1544791227.4116: mail - ossec,rootcheck,
2018 Dec 14 07:40:27 localhost->rootcheck
Rule: 510 (level 7) -> `Host-based anomaly detection event (rootcheck).`
File `/dev/.ssh` is owned by root and has write permissions to anyone.
2.4 實時告警
通過 ossec.conf
檔案配置指定規則組、指定規則ID、指定伺服器(agent)觸發的實時告警發給專門負責的管理員郵箱,實現職責歸屬明確,故障類的告警發給運維管理員、安全類的告警發給安全管理員,特別關注的告警事件發給問題處理專員等
實時告警輸出例項
告警事件通過E-mail實時提醒
根據規則功能分組來確定告警傳送給誰處理
<email_alerts>
<email_to>249994395@qq.com</email_to>
<email_to>75016025@qq.com</email_to>
<level>12</level>
<group>sshd,</group>
<do_not_delay/>
</email_alerts>
根據規則ID來確定告警傳送給誰處理
<email_alerts>
<email_to>249994395@qq.com</email_to>
<rule_id>123, 124</rule_id>
<do_not_delay />
<do_not_group />
</email_alerts>
根據伺服器(agent-id)來確定告警傳送給誰處理
<email_alerts>
<email_to>249994395@qq.com</email_to>
<level>12</level>
<event_location>agent01|agent02</event_location>
<do_not_delay />
</email_alerts>
郵件告警內容
郵件主題:OSSEC Alert – localhost – Level 7 – Listened ports status (netstat) changed (new port opened or closed).
OSSEC HIDS Notification.
2018 Oct 09 11:21:37
Received From: localhost->netstat -tan |grep LISTEN |egrep -v `(127.0.0.1| \1)` | sort
Rule: 533 fired (level 7) -> "Listened ports status (netstat) changed (new port opened or closed)."
Portion of the log(s):
ossec: output: `netstat -tan |grep LISTEN |egrep -v `(127.0.0.1| \1)` | sort`:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 172.16.100.213:25 0.0.0.0:* LISTEN
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 :::80 :::* LISTEN
Previous output:
ossec: output: `netstat -tan |grep LISTEN |egrep -v `(127.0.0.1| \1)` | sort`:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 172.16.100.213:25 0.0.0.0:* LISTEN
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
2.5 主動響應
本文之前提到OSSEC是一款準EDR產品,其中體現的‘R’技術,就是指的的這個主動響應,我們可以根據特定的伺服器或伺服器組(agent)、特定的規則ID等多個條件關聯觸發響應動作,響應的動作可以通過指令碼程式去實現個性化的需求,這些需求可以是郵件提醒,也是可以是指令下發邊界安全裝置或者安全元件進行訪問封堵或者恢復,或者更多的本地化需求(指令碼實現),當然OSSEC內建也包含一些常用的響應指令碼,只需在此基礎上稍加改變,就可以投入使用
Active Responses
分為command
與active-response
兩個部分, 且一個能夠被執行的Active Responses
規則必須同時包含command
與active-response
兩個部分
主動響應處理例項
主機訪問控制列表(TCP Wrappers)指令碼聯動實現告警響應處理
建立呼叫響應指令碼命令
- name:定義命令名稱
- executable:呼叫的響應指令碼
- expect:輸出指令碼需要的引數(srcip或username)
<command>
<name>host-deny</name>
<executable>host-deny.sh</executable>
<expect>srcip</expect>
<timeout_allowed>yes</timeout_allowed>
</command>
配置主動響應規則
- command:呼叫響應指令碼命令(上面定義)
- location:規則生效的主機範圍(本地主機、服務控制端或指定的Agent等)
- rules_id:觸發響應動作的規則ID條件
- timeout:響應動作的持續時間,此處動作為禁止,10s後超時允許放行
<active-response>
<command>host-deny</command>
<location>local</location>
<rules_id>5551, 5712, 5720</rules_id>
<timeout>10</timeout>
</active-response>
響應指令碼
顯示host.deny指令碼的前10行,第七行說明指令碼需要輸入srcip引數,才能正常執行
[root@bogon ~]# head -n 10 /var/ossec/active-response/bin/host-deny.sh
#!/bin/sh
# Adds an IP to the /etc/hosts.deny file
# Requirements: sshd and other binaries with tcp wrappers support
# Expect: srcip
# Author: Daniel B. Cid
# Last modified: Nov 09, 2005
ACTION=$1
USER=$2
IP=$3
測試方法
重啟OSSEC程式, 手動嘗試多次SSH登入並且輸入錯誤密碼
主動響應日誌輸出
[root@bogon ~]#tail -f /var/ossec/logs/active-responses.log
Wed Dec 12 17:57:58 CST 2018 /var/ossec/active-response/bin/host-deny.sh add - A.B.C.D 1544608678.285043 5720
Wed Dec 12 17:59:28 CST 2018 /var/ossec/active-response/bin/host-deny.sh delete - A.B.C.D 1544608678.285043 5720
總結
在對OSSEC有個整體上的瞭解之後,我們將系統性的介紹OSSEC在各種環境中的安裝與部署,包括單機部署、客戶端與伺服器分離部署,以及如何把告警日誌資料儲存到MySQL中,並通過自帶的UI工具,進行展現告警。
相關文章
- 開源EDR(OSSEC)基礎篇- 02 -部署環境與安裝方式
- 【程式設計基礎】輸出程式設計
- 《轉生成為前端程式設計師01-基礎篇》前端程式設計師
- python基礎篇-輸入和輸出Python
- 11.程式程式設計基礎5:輸入輸出程式設計
- Java基礎篇--設計模式Java設計模式
- Java基礎輸入輸出Java
- [.net 物件導向程式設計基礎] (1) 開篇物件程式設計
- 《JavaScript設計模式與開發實踐》基礎篇(1)—— this、call 和 applyJavaScript設計模式APP
- 輸入和輸出基礎語法
- JavaScript非同步程式設計-基礎篇JavaScript非同步程式設計
- 驅動篇——核心程式設計基礎程式設計
- CSS基礎定位與精靈圖CSS
- shell基礎-輸出重定向
- Python程式設計基礎題(7-輸入星期數字,輸出對應英文)Python程式設計
- Socket原理與程式設計基礎程式設計
- 《JavaScript設計模式與開發實踐》基礎篇(2)—— 閉包和高階函式JavaScript設計模式函式
- 【WEB基礎】HTML & CSS 基礎入門(10)佈局與定位WebHTMLCSS
- 5、基礎篇-資源排程
- .net 開源模板引擎jntemplate 教程:基礎篇之語法
- 遊戲基礎知識——“運輸單位”的設計遊戲
- java多執行緒程式設計--基礎篇Java執行緒程式設計
- Python3.7黑帽程式設計——病毒篇(基礎篇)Python程式設計
- 程式設計能力與程式設計年齡程式設計
- 如何低投入0基礎做少兒程式設計?(開源乾貨!)程式設計
- iOS逆向與安全:基礎篇iOS
- 【Scala篇】--Scala初始與基礎
- TensorFlow筆記-01-開篇概述筆記
- vuejs深入淺出—基礎篇VueJS
- 深入淺出RxJava(一:基礎篇)RxJava
- 深入淺出RxJava(1):基礎篇RxJava
- Rhino基礎操作3 - 出圖篇
- 好程式設計師web前端分享HTML基礎篇程式設計師Web前端HTML
- 好程式設計師web前端分享CSS基礎篇程式設計師Web前端CSS
- 浪潮資訊釋出源2.0基礎大模型,千億引數全面開源大模型
- linux基礎篇01-測試常見linux命令集合一Linux
- 柳大的Linux講義·基礎篇(4)網路程式設計基礎Linux程式設計
- shell程式設計(三)輸入輸出程式設計