Log,一個讓人又愛又恨的東西
又臭又長不好讀,每天產生一大堆,不小心就塞爆了硬碟搞掛了主機,又吃不少效能
但,
他也是除錯時重要的救星,唯一可以了解系統狀況的夥伴,以及,在駭客攻擊中,讓你存活的必要手段
一起來瞭解他吧!
這是「戰情分析」系列課程
我們會一路從「Log概論」、「Log分析」、「Log處理」、「SOC」、「資安戰情室」一路深入,最終我們將能掌握自己的系統,看到駭客,並作出回應
這不是傳統的課程,請不要來「聽課」,腦袋硬梆梆的是做不好資安的,請不吝跟大家分享想法
另外如果你已經有相當經驗,可以跳過這堂課,但也歡迎來聊天
授權方式 CC: BY-SA
黑魔法防禦術 FB群組 => https://www.facebook.com/groups/308549376151517
加入請記得回答問題喔,如果一直沒收到加入回覆,請發個訊息跟我聯絡,或看一下收件夾
為了記錄曾經發生過的重要事件而產生的數據
https://www.youtube.com/watch?v=XvyrUfuLGVk
請大家分享一下第一次看到Log滿畫面刷的時候是什麼時候,以及感想XD
- 除錯
- 效能調教
- 稽核追蹤
- 鑑識
- 了解現況
- 備份、資料同步、回溯(常用在DB)
另外
- Mysql binary log, Oracle redo log, GIT
- log 也可拿來讓 monitor system 做近即時的狀態通報之類的,或是很簡單的統計流量或使用狀態 (eg. 把 httpd access log 用時間區段 (像是 1 min) group 就可以得到每分鐘的線上人數
- 架站的時候
- e04,有bug!
- in this case, git log 很有用,用其他 log 找到錯在哪裡也可以找到這段程式碼是誰寫的
- 系統不穩定而抓狂的網管
- 前提是各種 log 都要有留,這部分應該要搭配 log server 一起服用
- 被駭客打的嫑嫑的可憐人
- 怒氣沖沖準備上法院的主管
- 駭客
- 資安人員
- 找出駭客的行跡
- 發現異常行為
- 尋找弱點
- 釐清「曾經發生過什麼事」
- 舉證上法院 → 不可否認性/ 憑證
- 得知目前的安全性與政策成效
- 網路流量
- 登出入記錄
- 存取紀錄
- 指令操作(異常、特權)
- 排程動作
- 系統運作檢核點
- 以時間為主軸
- 主體(誰發起了這則log)
- 事件描述
- 最好有 人、事、時、地、物
- 隨時間產生
- 多為文字紀錄
- 有少數是用自己的格式,不過都有相對應的工具可以解出來
- 非常大量
- 不應被修改,生成後固定
- 可被歸檔、分割
- 一般來說人們很討厭他
https://en.wikipedia.org/wiki/Syslog
- Syslog Factility
Kern / User / mail / daemon / auth / syslog / lpr / news / uucp / authpriv / ftp / cron / local0~7
- Syslog Severity
Emergency / Alert / Critical / Error / Warning / Notice / Info / Debug
* 我遇過一些系統是直接 pipe 到 /var/log/messages 的,猜測應該是設定問題 XD
* 姆,比較不建議這麼做,這樣容易寫入打架,同時LogRotate的時候會出包
* 基本上遇到的那台系統也沒拿來當 server,可能是系統預設問題 XD?
- 時間
- 事件名稱
- 事件編號
- 嚴重程度Severity
- 發生的主機
- 來源
- 目標
- 動作
- filelog / kernel log
- syslog
- 這裡會大略介紹什麼是syslog
常見Log file
- /var/log/auth.log
- /var/log/boot.log
- /var/log/dmesg
- /var/log/dpkg.log
- /var/log/kern.log
- /var/log/mail.*
- /var/log/syslog /var/log/message
- /var/log/wtmp utmp lastlog
- /var/log/apache2/access.log
- /var/log/apache2/error.log
族繁不及備載...
xxx.xxx.tw:80 114.27.125.17 - - [09/Apr/2017:07:42:38 +0800] "GET /s/pixmicat.php?mode=module&load=mod_shoutbox&action=latest HTTP/1.1" 200 416 "[](http://xxx.xxx.tw/s/)http://[x](http://p.komica.acg.club.tw/s/)[x](http://x.tw/s/)[x](http://xx.tw/s/)[.](http://xxx.tw/s/)[x](http://xxx..tw/s/)xx.tw/s/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
xxx.xxx.tw:80 183.178.169.204 - - [09/Apr/2017:07:42:41 +0800] "GET /a/pixmicat.php?mode=module&load=mod_shoutbox&action=latest HTTP/1.1" 200 432 "[](http://xxx.xxx.tw/a/)http://[x](http://.tw/a/)[x](http://x.tw/a/)[x](http://xx.tw/a/)[.](http://xxx.tw/a/)[x](http://xxx..tw/a/)[x](http://xxx.x.tw/a/)[x](http://xxx.xx.tw/a/).tw/a/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
Sun Apr 09 07:46:12 2017 [client 126.xxx.60.57] File does not exist: /home/xxx/www/favicon.ico, referer: http://xxx.xxx.com/photo/mt/c/DSCF7116.JPG
Sun Apr 09 07:48:19 2017 [client 68.xxx.180.113] File does not exist: /home/p/a/src/1486650846281.gif
Sun Apr 2 12:28:51 2017 [pid 2] CONNECT: Client "174.106.37.179"
Sun Apr 2 12:28:53 2017 pid 1 FAIL LOGIN: Client "174.106.37.179"
Sun Apr 2 14:25:55 2017 [pid 2] CONNECT: Client "115.159.55.184"
Sun Apr 2 14:25:57 2017 [pid 1] [club] FAIL LOGIN: Client "115.159.55.184"
Sun Apr 2 14:25:59 2017 [pid 2] CONNECT: Client "115.159.55.184"
Sun Apr 2 14:26:03 2017 [pid 1] [xxx.xxx.xxx.club.tw] FAIL LOGIN: Client "115.159.55.184"
Sun Apr 2 14:26:04 2017 [pid 2] CONNECT: Client "115.159.55.184"
Sun Apr 2 14:26:07 2017 [pid 1][xxx] FAIL LOGIN: Client "115.159.55.184"
Sun Apr 2 14:26:08 2017 [pid 2] CONNECT: Client "115.159.55.184"
Sun Apr 2 14:26:12 2017 [pid 1] [clubtw] FAIL LOGIN: Client "115.159.55.184"
Apr 9 07:42:29 xxx rsyslogd: [origin software="rsyslogd" swVersion="5.x.x" x-pid="1006" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
Apr 9 07:42:48 xxx anacron[23088]: Job 'cron.daily' terminated (mailing output)
Apr 9 07:42:48 xxx anacron[23088]: Normal exit (1 job run)
Apr 9 07:42:48 xxx postfix/pickup[22694]: 323FA6010A: uid=0 from=<root>
Apr 9 07:42:48 xxx postfix/cleanup[23501]: 323FA6010A: [email protected]
Apr 9 07:42:48 xxx postfix/qmgr[1968]: 323FA6010A: [email protected], size=466, nrcpt=1 (queue active)
Apr 9 07:42:48 xxx postfix/local[23503]: 323FA6010A: [email protected], orig_to=<root>, relay=local, delay=0.02, delays=0.02/0/0/0, dsn=2.0.0, status=sent (delivered to mailbox)
Apr 9 07:42:48 xxx postfix/qmgr[1968]: 323FA6010A: removed
Apr 9 11:22:12 xxx sshd[xx]: Accepted password for xxx from xxx.xxx.xxx.82 port 55825 ssh2
Apr 9 11:22:12 xxx sshd[xx]: pam_unix(sshd:session): session opened for user xxx by(uid=0)
Apr 9 11:25:01 xxx CRON[xx]:pam_unix(cron:session): session opened for user root by(uid=0)
Apr 9 11:46:12 xxx sudo: xxx : TTY=pts/3 ; PWD=/var/log ; USER=root ;COMMAND=/bin/su
Apr 9 11:46:12 xxx sudo: pam_unix(sudo:session): session opened for user root by xxx(uid=1000)
Apr 9 11:46:12 xxx su[xx]: Successful su for root by root
Apr 9 11:46:12 xxx su[xx]: + /dev/pts/3 root:root
Apr 9 11:46:12 xxx su[xx]: pam_unix(su:session): session opened for user root by xx(uid=0)
$ last
xxx pts/4 220-xxx-xxx-82.h Sun Apr 9 13:26 still logged in
xxx pts/3 220-xxx-xxx-82.h Sun Apr 9 11:22 still logged in
wtmp begins Sun Apr 9 11:22:16 2018
圖1.1
補充:windows安全日誌分析之logparser篇
很多時候,我們只是想知道很簡單的問題
- 今天有多少人登入?
- 某個檔案的下載次數?
- 有沒有壞人正在試著暴力破解密碼?
- 某個站流量的使用時間分佈?
- 也有些時候,我只是想觀察某個使用者到底上了我的站一路上做了些什麼
Log分析大致上有兩個走向
- 逐行理解
- 統計概觀
前者大量使用在鑑識中,而後者協助你快速的找到有問題的地方快速切入
畢竟當面對海量的Log滿天飛的時候,一條一條看想要找到問題,幾乎是不可能的任務
這裡介紹以Unix指令行做簡單快速的Log分析
大多數情況下,你可以快速地得到“單一參數”的統計結果,可以直接丟去excel畫圖
複雜的多值統計也可以做到,但就需要寫複雜的Script了
優勢是你幾乎到任意Unix機台都能夠快速的對Log進行分析,熟練之後可以相當隨心所欲
缺點是複雜計算不容易實現,這種循序處理效能也不好,對於大量數據的情況,我們等一下會介紹更好的工具
-f , -n
-v, regex
-d -n 行號
-d, -c, -f
-c, -n
-d, regex
太複雜了自己看,猛猛的神物
- Linux日志终极指南
http://os.51cto.com/art/201703/535721.htm
- 用SQL指令分析網站日誌 輕鬆掌握主機運作狀況
http://www.netadmin.com.tw/article_content.aspx?sn=1703130003
感謝阿喵補充,grep事實上可以使用regex的功能來進行Log選擇與切割。
這個範本使用-oP參數,分別代表著“僅輸出選擇的Group”以及“使用perl style regex”
$ echo "foo 'bar'" | grep -Po "(?<=')[^']+(?=')"
bar
也有這樣的變形用法,無視換行萃取多筆同類型資料
$ echo "aaa 111 bbb 222 ccc 333" | egrep -o "([0-9]+)"
111
222
333
另一方面很多時候如果你會遇到中間有不定長度的空格的時候,單純用cut去切會很蛋疼,awk會更加方便
$ cat /tmp/tt
Sun Apr 2 12:28:51 2017 [pid 2] CONNECT: Client "174.106.37.179"
Sun Apr 12 12:28:53 2017 pid 1 FAIL LOGIN: Client "174.106.37.179"
$ cat /tmp/tt | cut -d' ' -f 5 #因為日期的縮排導致空白數量不固定,切錯啦
12:28:51
2017
$ cat /tmp/tt | awk '{print $5}' #正確的取到年
2017
2017
http://ithelp.ithome.com.tw/articles/10021489
Sun Apr 2 12:28:51 2017 [pid 2] CONNECT: Client "174.106.37.179"
Sun Apr 2 12:28:53 2017 pid 1 FAIL LOGIN: Client "174.106.37.179"
Sun Apr 2 14:25:55 2017 [pid 2] CONNECT: Client "115.159.55.184"
Sun Apr 2 14:25:57 2017 pid 1 FAIL LOGIN: Client "115.159.55.184"
Sun Apr 2 14:25:59 2017 [pid 2] CONNECT: Client "115.159.55.184"
Sun Apr 2 14:26:03 2017 pid 1 FAIL LOGIN: Client "115.159.55.184"
Sun Apr 2 14:26:04 2017 [pid 2] CONNECT: Client "115.159.55.184"
Sun Apr 2 14:26:07 2017 pid 1 FAIL LOGIN: Client "115.159.55.184"
Sun Apr 2 14:26:08 2017 [pid 2] CONNECT: Client "115.159.55.184"
Sun Apr 2 14:26:12 2017 pid 1 FAIL LOGIN: Client "115.159.55.184"
$ cat vsftpd.log* | grep FAIL | cut -c 35- | tr -d ']' | cut -d' ' -f1 | sort | uniq -c | sort -n | tail
868 club888
868 club_tw
868 club-tw
868 ppclub
869 club666
873 tw
881 clubtw
890 pp.xxx.club.tw
1372 club
1416 pp
$ cat vsftpd.log* | grep FAIL | awk '{print $8 " " $12}' | sort | uniq -c | sort -n | tail
868 [club123456] "115.159.55.184"
868 [club888] "115.159.55.184"
868 [club_tw] "115.159.55.184"
868 [club-tw] "115.159.55.184"
868 [clubtw] "115.159.55.184"
868 [pp] "115.159.55.184"
868 [ppclub] "115.159.55.184"
868 [pp.xxx.club.tw] "115.159.55.184"
868 [tw] "115.159.55.184"
869 [club666] "115.159.55.184"
$ cat vsftpd.log* | grep FAIL | grep -v "115.159.55.184" | awk '{print $8 " " $12}' | sort | uniq -c | sort -n | tail
58 [pp] "60.249.245.180"
59 [club] "60.249.245.180"
60 [acg] "60.249.245.180"
88 [admin] "45.76.185.49"
88 [ftp] "45.76.185.49"
88 [root] "45.76.185.49"
97 [pp] "166.62.39.130"
98 [acg] "166.62.39.130"
98 [club] "166.62.39.130"
102 [komica] "166.62.39.130"
$ for line in cat vsftpd.log* | grep FAIL | awk '{print $12}' | sort | uniq; do echo -n "$line: ";cat vsftpd.log*|grep $line|awk '{print $8}'| sort | uniq -c|wc -l ; done | awk '{print $2" "$1}'| sort -n | tail
6 "60.13.132.38":
6 "60.13.192.113":
6 "60.216.4.162":
6 "60.249.245.180":
6 "85.99.113.82":
6 "95.9.179.10":
7 "62.149.193.132":
13 "115.159.55.184":
54 "112.64.217.127":
82 Client:
$ cat other_vhosts_access.log | cut -d'[' -f 2 | cut -d':' -f1-2 | sort | uniq -c
896 09/Apr/2017:07
3315 09/Apr/2017:08
4286 09/Apr/2017:09
4778 09/Apr/2017:10
6075 09/Apr/2017:11
5580 09/Apr/2017:12
6635 09/Apr/2017:13
6958 09/Apr/2017:14
6583 09/Apr/2017:15
6119 09/Apr/2017:16
呃...還是太複雜嗎?
好吧,我們來看看一些現成工具
基本上來說,你得先把資料轉換成Excel或是CSV檔案,這可以透過Script來實現
雖然Excel有資料解析精靈可以用,使用前得先確認你的資料跟你想像中長得一樣,免得匯進去各種爆炸
大體上來說,你可以輕鬆用它建立許多基本圖表,長條圖、折線圖、圓餅圖、區域圖、雷達圖、散佈圖、地圖等,是最基本的工具
即時更新 / 屬記憶體資料庫
http://www.qlik.com/us/products/qlik-sense/getting-started
免費的工具,專注在視覺化與互動
- 類似Excel的簡易操作介面,
- 但是有更棒且可擴充的圖表,
- 能對資料進行清理、轉換、過濾、再製(ETL)
- 產生的圖表可即時互動,輕鬆深入理解資料的本質
- 非常高的效能
大致上的操作是:檔案拖進去,選擇欄位,拉圖表,就這樣了XD
然後如果需要更新資料,再拖一次就是了
值得一試
我之前用過AWstats,不過後來都直接shell處理掉了,下面有一堆可用的軟體列表
https://en.wikipedia.org/wiki/Web_log_analysis_software
不過這個也很酷炫
Logstalgia http://logstalgia.io/
https://www.youtube.com/watch?v=jqlIQ0MXsnA
即時狀態
apachetop
圖1.2
http://img1.51cto.com/attachment/200908/13/612518_1250155488VmfN.jpg
把pfSense防火牆的Log用Logstalgia展現
https://xn--blgg-hra.no/2016/02/live-visualizing-mikrotik-firewall-traffic-with-logstalgia/
VisualFirewall,類似 Logstalgia ,可惜不會動
https://www.chrisleephd.us/projects/visualfirewall.html
glTail.rb 看起來也很炫,雖然我不太懂為什麼他要加入物理引擎...
從這邊開始就是一個完整的環境了
https://www.youtube.com/watch?v=TOxu97lvqRc
相當不錯的分析套件,OpenSource
包含ElasticSearch資料儲存搜尋、LogStash資料收集轉換、Kibana視覺化
優點:快速完成圖表,互動性也不差,全分散式架構很威猛
缺點:你還是需要Regex的能力去對Log切欄位,ElasticSearch無法關閉的Ranking機制在大量數據時會造成瓶頸,而Kibana與ElasticSearch的Restful連結並沒有足夠安全的驗證機制,如果丟在外網跑可能很快就會燒起來惹(CVE-2015-1427 )
專門處理巨量資料的情況,台灣應該沒什麼需要用到的場景在(資料量不夠大)
效能稱不上好,成本不低,也不是很方便(目前好像沒有現成的套件,都自己寫),但數據量大的時候只有他了
由於LogStash跟Flume(fluentd?)都有把資料解析後匯入HDFS的能力,所以用他分析的也不在少數
前面有提供免費的Desktop版的介紹了,Server則帶有更多企業級屬性,諸如報表(n-printing)、多人共享、多人同步編輯、自動刷新等等。如果要用在商業上,那就是他了
一個Unix Like的Log管理系統,號稱全分散式,有很好的效能,強項在即時標記與過濾
但關聯性分析方面就弱一點,然後可能比ArcSight還貴
https://www.youtube.com/watch?v=-q-Ue603vKc
這玩意看起來也滿帥的,是外掛套件,不過非常吃效能
相當昂貴,專注於資安上的分析系統,同時可以分析與畫圖,產生報告,甚至做到即時回應
因為專注在資安上,所以有很多預製的樣板如ISO 27001來協助稽核跟分析,欄位則是固定寫死的
強項是關聯性分析軟體ESM,不過真的有本事去使用這個技術的人少之又少...
然後效能實在是 = =
- 缺點我就不多說了,用了好幾年心裡各種幹
- 視覺化能力真的很弱,只有事件圖能看
圖3
- 第一階段切到這邊,後面可能會講太多....
2016COSCUP Everything is log https://speakerdeck.com/poga/everything-is-log
萬事萬物皆是 LOG - 參考資料 http://ppt.cc/WTpok
萬事萬物皆是 LOG - 系統架構也來點科普 https://www.slideshare.net/poga/log-65475572
從記錄收集分析談IT Log管理 http://jackforsec.blogspot.tw/2009/11/it-log.html
HP ArcSight Vs. IBM QRadar Vs. McAfee Nitro Vs. Splunk Vs. RSA Security Vs. LogRhythm
https://www.itcentralstation.com/product_reviews/logrhythm-review-32130-by-vinod-shankar
PHP Apache Access Log 分析工具 拆分字段成CSV文件並插入Mysql