企業安全建設之搭建開源SIEM平臺。 SIEM(security information and event management),顧名思義就是針對安全資訊和事件的管理系統,針對大多數企業是不便宜的安全系統,本文結合作者的經驗介紹如何使用開源軟體離線分析資料, 使用攻擊建模的方式識別攻擊行為。
回顧系統架構
以資料庫為例,通過logstash搜集mysql的查詢日誌,近即時備份到hdfs集群上,通過hadoop腳本離線分析攻擊行為。
資料庫日誌搜集
常見的資料日誌搜集方式有三種:
鏡像方式
大多數資料庫審計產品都支援這種模式,通過分析資料庫流量,解碼資料庫協定,識別SQL預計,抽取出SQL日誌
代理方式
比較典型的就是db-proxy方式,目前百度、搜狐、美團、京東等都有相關開源產品,前端通過db-proxy訪問後端的真實資料庫伺服器。 SQL日誌可以直接在db-proxy上搜集。
用戶端方式
通過在資料庫伺服器安裝用戶端搜集SQL日誌,比較典型的方式就是通過logstash來搜集,本文以用戶端方式進行講解,其餘方式本質上也是類似的。
logstash配置
安裝
下載logstash HTTPs://www.elastic.co/downloads/logstash 目前最新版本5.2.1版
開啟mysql查詢日誌
mysql查詢日誌
配置logstash
input {
file {
type => "mysql_sql_file"
path => "/var/log/mysql/mysql.log"
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
output {
kafka { broker_list => "localhost:9092" topic_id => "test" compression_codec => "snappy" # string (optiona l), one of ["none", "gzip", "snappy"], default: "none" }
}
運行logstash
bin/logstash -f mysql.conf
日誌舉例
2017-02-16T23:29:00.813Z localhost 170216 19:10:15 37 Connect
debian-sys-maint@localhost on
2017-02-16T23:29:00.813Z localhost 37 Quit
2017-02-16T23:29:00.813Z localhost 38 Connect debian-sys-maint@localhost on
2017-02-16T23:29:00.813Z localhost 38 Query SHOW VARIABLES LIKE 'pid_file'
切詞
最簡化操作是不用進行切詞,如果喜歡自動切分出資料庫名,時間等欄位,請參考:
grok語法
HTTPs://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns
grok語法調試
HTTP://grokdebug.herokuapp.com/
常見攻擊特徵
以常見的wavsep搭建靶場環境,請參考我的另外一篇文章《基於WAVSEP的靶場搭建指南》
使用SQL掃描連結
分析攻擊特徵,下列列舉兩個,更多攻擊特徵請大家自行總結
特徵一
2017-02-16T23:29:00.993Z localhost 170216 19:19:12 46 Query SELECT username, password FROM users WHERE username='textval ue' UNION ALL SELECT Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null, Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null, Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null, Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null, Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null#' AND password='textvalue2'
使用聯集查詢枚舉資料時會產生大量的Null欄位
特徵二、三
枚舉資料庫結構時會使用INFORMATION_SCHEMA,另外個別掃描器會使用GROUP BY x)a)
2017-02-16T23:29:00.998Z localhost 46 Query SELECT username, password FROM users WHERE username='textvalue' AND (SELECT 7473 FROM(SELECT COUNT(*),CONCAT(0x7171716271,(SELECT (CASE WHEN (8199= 8199) THEN 1 ELSE 0 END)),0x717a627871,FLOOR(RAND (0)*2))x FROM INFORMATION_SCHEMA. PLUGINS GROUP BY x)a)-- LFpQ' AND password='textvalue2'
hadoop離線處理
hadoop是基於map,reduce模型
簡化理解就是:
cat data.txt | ./map | ./reduce
最簡化期間,我們可以只開發map程式,在map中逐行處理日誌資料,匹配攻擊行為。
以perl腳本開發,python類似
#!/usr/bin/perl -w
my $rule="(null,){3,}|information_schema| GROUP BY x\\)a\\)";
my $line="";
while($line=)
{
if( $line=~/$rule/i )
{
printf($line);
}
}
在hadoop下運行即可。
生產環境
生產環境中的規則會比這複雜很多,需要你不斷補充,這裡只是舉例;
單純只編寫map會有大量的重複報警,需要開發reduce用於聚合;
應急回應時需要知道SQL注入的是那個庫,使用的是哪個帳戶,這個需要在logstash切割欄位時補充;
應急回應時最好可以知道SQL注入對應的連結,這個需要將web的accesslog與SQL日誌關聯分析,比較成熟的方案是基於機器學習,學習出基於時間的關聯矩陣;
用戶端直接搜集SQL資料要求mysql也開啟查詢日誌,這個對伺服器性能有較大影響,我知道的大型公司以db-prxoy方式接入為主,建議可以在db-proxy上搜集;
基於規則識別SQL注入存在瓶頸,雖然相對web日誌層面以及流量層面有一定進步,SQL語義成為必然之路。