Qradar SIEM:查詢利器 AQL
對於 SIEM 平臺來說,好用的查詢方式非常重要。之前有體驗基於 ELK 搭建的平臺,在 kibana 上面是可以通過一些 filter 來做一些過濾並且是支援 lucene 的語法,包括一些簡單的邏輯查詢以及 wildquery 等等。但是的確是在做一些匯聚之類時不是很方便,一般需要通過 json 來建立查詢語句。後來好像也有轉 SQL 之類的外掛,但我也沒有使用過,總的來說體驗比較一般。
Qradar
Qradar 是一款比較成熟的商業 SIEM 平臺(儘管他們的 BUG 一大堆,但架不住別的更差啊),基本上也是屬於業界 TOP 5。商業產品的好處就是不用自己太折騰,搞搞就可以用,缺點就是貴。AQL(Ariel Query Language)是 Qradar 中的一種查詢語言,與普通的 SQL 的語句類似,但是閹割了一些高階功能的基礎上增加了一些基本功能。以下是 AQL 的基本流程:
可以看出 AQL 是一種非常類似於 SQL 的語言,所以基本上你用過 SQL 學會 AQL 也就分分鐘的事情,而且你也不會拿它去做特別複雜的巢狀查詢(因為它也不支援。。。)
Tips
雖然 AQL 終於讓我們有槍可以搞一搞了,但是還是有一些地方值得吐槽的地方。第一就是很多 ID 不知道其具體的對映,就比如我們想查詢一些事件的名稱或者規則的名稱,AQL 是不存在欄位名是事件名稱或者規則名稱的。不過你可以通過函式來進行轉換,比如使用 QIDNAME(qid)
來獲取事件名稱, RULENAME(123)
來獲取規則名稱。你沒辦法知道事件名稱或者規則名稱到底是對應什麼 ID,目前我用的辦法就是先去 IBM Develop API 裡面先去查詢。第二,AQL 查詢的結果我發現有某個規則的查詢結果和用 filter 查詢的結果不一致,不知道這是不是特例。還有其他的,想到再說。
下面就是我在使用過程中一些小經驗:
引號的使用
在 AQL 中,單引號和雙引號的使用是有區別的。單引號一般可以表示字串或者作為欄位的別名,如果你的欄位包含了空格,那麼你必須使用單引號。雙引號一般用來表示自定義屬性的名稱。還有一個值得注意的地方就是,當你在使用 WHERE,GROUP BY,ORDER BY
的時候,你必須要使用雙引號來使用別名,而不是單引號,是不是有點繞。其實有個好的方法就是不要使用單引號了,直接使用帕斯卡命名或者使用下劃線連線,比如 EventName
或者 Event_Name
,其實你自己想怎麼命名都可以啦。
Rule 的匹配
Qradar 裡面有很多內建的規則並且你能夠自己定義特定的規則。其實對於某個 rule 來說,也是有特定的 rule ID 的,即 creeventlist,如果某個 rule 的 creeventlist 是 123,那麼我們可以通過以下語句來找到這個 rule:
場景案例
根據我的理解,Qradar 所有的查詢歸根到底應該都是通過 AQL 來實現的,但是官方並沒有提供將普通的查詢轉換成 AQL 語句的工具。之前我有一些場景想通過 AQL 來實現,但是 IBM 的人說無法實現(此處應有吐槽),後來還是得靠自己來實現。
特定 IP 特定事件發生的時間大於特定的值
可能聽起來有那麼一點點繞,但這個場景還是蠻有必要的。因為經常有一些安全事件很長時間都沒有及時處置,那我們如何將這些事件撈出來呢。即該事件(sourceip 指定)的第一次出現的時間和最近出現一次的時間的時間間隔大於特定的指,那麼我們就可以通過這樣的語句來把這樣的事件找出來了。
查詢當前月份的事件
IBM 與日期相關的函式主要就是4個,即 LAST,START,STOP,NOW
。日期實現的邏輯太單一了,你只能指定具體的起始時間以及終止時間或者是 LAST1DAYS
這種。但是有一個非常普遍的場景就是我需要知道當前月份的情況,這就無法通過這幾個關鍵詞直接來實現,因為 CurrentMonthIS NOT LAST30DAYS
.那麼我們需要介紹一個函式 DATEFORMAT
,通過這個函式我們可以將時間轉化為字串型別,結合 NOW
以及 START,STOP
函式,既可以實現。
那麼我麼就可以寫出函式:
將這個時間作為起始時間,那麼我們就可以獲取當前月的事件了。其實,按照這種思路,理論上你可以獲取任意時間間隔。
總結
以上,即是我在使用 AQL 過程中一點小小的經驗。雖然 AQL 槽點滿滿,但總的來說對於大資料的分析的確提供了不少便利,尤其是通過 Pulse 我們可以實現比 DashBoard 優美並且靈活的視覺化 DashBoard。建議在使用過程中可以多看看官方的文件,以上很多解決方案在官方文件也都有提及。