歡迎你們前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~linux
Sysdig是一個全面的開源系統活動監控,捕獲和分析應用程序。它具備強大的過濾語言和可自定義的輸出,以及可使用稱爲chisels 的Lua腳本擴展的核心功能。shell
應用程序經過訪問內核來工做, 內核容許它查看每一個系統調用以及經過內核傳遞的全部信息。這也使其成爲監視和分析系統上運行的應用程序容器生成的系統活動和事件的出色工具。數據庫
核心Sysdig應用程序監視其安裝的服務器。可是,該項目背後的公司提供了一個名爲Sysdig Cloud的託管版本,能夠遠程監控任意數量的服務器。ubuntu
獨立應用程序可在大多數Linux發行版上使用,但在Windows和macOS上也可用,功能更爲有限。除了sysdig
命令行工具,Sysdig還帶有一個csysdig
帶有相似選項的交互式UI 。安全
在本教程中,您將安裝並使用Sysdig來監視Ubuntu 16.04服務器。您將流式傳輸實時事件,將事件保存到文件,過濾結果以及瀏覽csysdig
交互式UI。bash
要完成本教程,您須要:服務器
sudo
命令的非root
的帳戶。在Ubuntu存儲庫中有一個Sysdig包,但它一般是當前版本的一兩個版本。例如,在發佈時,使用Ubuntu的軟件包管理器安裝Sysdig將爲您提供Sysdig 0.8.0。可是,您可使用項目開發頁面中的官方腳原本安裝它,這是推薦的安裝方法。這是咱們將使用的方法。微信
但首先,更新包數據庫以確保您擁有最新的可用包列表:網絡
$ sudo apt-get update
如今curl
使用如下命令下載Sysdig的安裝腳本:
$ curl https://s3.amazonaws.com/download.draios.com/stable/install-sysdig -o install-sysdig
這會將安裝腳本下載install-sysdig
到當前文件夾的文件中。您須要使用提高的權限執行此腳本,而且運行從Internet下載的腳本是危險的。在執行腳本以前,經過在文本編輯器中打開它或使用less
命令在屏幕上顯示內容來審覈其內容:
$ less ./install-sysdig
一旦您熟悉腳本將運行的命令,請使用如下命令執行腳本:
$ cat ./install-sysdig | sudo bash
命令將安裝全部依賴項,包括內核頭文件和模塊。安裝的輸出相似於如下內容:
* Detecting operating system * Installing Sysdig public key OK * Installing sysdig repository * Installing kernel headers * Installing sysdig ... sysdig-probe: Running module version sanity check. - Original module - No original module exists within this kernel - Installation - Installing to /lib/modules/4.4.0-59-generic/updates/dkms/ depmod.... DKMS: install completed. Processing triggers for libc-bin (2.23-0ubuntu5) ...
如今您已經安裝了Sysdig,讓咱們看一下使用它的一些方法。
在本節中,您將使用 sysdig
命令查看Ubuntu 16.04服務器上的某些事件。 sysdig
命令須要root權限才能運行,而且它須要任意數量的選項和過濾器。運行 命令最簡單的方法是不帶任何參數。這將爲您提供每兩秒刷新一次的系統數據的實時視圖:
$ sudo sysdig
可是,正如您在運行命令時所看到的那樣,分析正在寫入屏幕的數據可能很困難,由於它會持續流動,而且您的服務器上發生了不少事件。按下CTRL+C
中止sysdig
。
在咱們使用一些選項再次運行命令以前,讓咱們經過查看命令的示例輸出來熟悉輸出:
253566 11:16:42.808339958 0 sshd (12392) > rt_sigprocmask 253567 11:16:42.808340777 0 sshd (12392) < rt_sigprocmask 253568 11:16:42.808341072 0 sshd (12392) > rt_sigprocmask 253569 11:16:42.808341377 0 sshd (12392) < rt_sigprocmask 253570 11:16:42.808342432 0 sshd (12392) > clock_gettime 253571 11:16:42.808343127 0 sshd (12392) < clock_gettime 253572 11:16:42.808344269 0 sshd (12392) > read fd=10(<f>/dev/ptmx) size=16384 253573 11:16:42.808346955 0 sshd (12392) < read res=2 data=..
輸出的列是:
%evt.num %evt.outputtime %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.info
如下是每列的含義:
像上一個sysdig
命令同樣,運行幾乎沒有任何價值,由於流入的信息太多了。可是您可使用如下語法對命令應用選項和過濾器:
$ sudo sysdig [option] [filter]
您可使用如下方法查看可用過濾器的完整列表:
$ sysdig -l
有一個普遍的過濾器列表,涵蓋了幾個類或類別。如下是一些課程:
因爲本教程中的每一個過濾器都不實用,因此讓咱們嘗試一下,從syslog類中的syslog.severity.str過濾器開始,它容許您查看以特定嚴重性級別發送到syslog的消息。此命令顯示在「信息」級別發送到syslog的消息:
$ sudo sysdig syslog.severity.str=info
注意:根據服務器上的活動級別,在輸入此命令後可能看不到任何輸出,或者在看到任何輸出以前可能須要很長時間。要強制發出問題,請打開另外一個終端模擬器並執行將向syslog生成消息的操做。例如,執行包更新,升級系統或安裝任何包。
按下CTRL+C
便可終止命令。
輸出應 很容易解釋,看起來應 是這樣的:
10716 03:15:37.111266382 0 sudo (26322) < sendto syslog sev=info msg=Jan 24 03:15:37 sudo: pam_unix(sudo:session): session opened for user root b 618099 03:15:57.643458223 0 sudo (26322) < sendto syslog sev=info msg=Jan 24 03:15:57 sudo: pam_unix(sudo:session): session closed for user root 627648 03:16:23.212054906 0 sudo (27039) < sendto syslog sev=info msg=Jan 24 03:16:23 sudo: pam_unix(sudo:session): session opened for user root b 629992 03:16:23.248012987 0 sudo (27039) < sendto syslog sev=info msg=Jan 24 03:16:23 sudo: pam_unix(sudo:session): session closed for user root 639224 03:17:01.614343568 0 cron (27042) < sendto syslog sev=info msg=Jan 24 03:17:01 CRON[27042]: pam_unix(cron:session): session opened for user 639530 03:17:01.615731821 0 cron (27043) < sendto syslog sev=info msg=Jan 24 03:17:01 CRON[27043]: (root) CMD ( cd / && run-parts --report /etc/ 640031 03:17:01.619412864 0 cron (27042) < sendto syslog sev=info msg=Jan 24 03:17:01 CRON[27042]: pam_unix(cron:session):
您還能夠過濾單個流程。例如,從nano
上查看事件,請執行如下命令:
$ sudo sysdig proc.name=nano
因爲此命令文件管理器已啓用nano
,您必須使用nano
文本編輯器打開文件以查看任何輸出。打開另外一個終端編輯器,鏈接到您的服務器,而後使用nano
打開文本文件。寫幾個字符並保存文件。而後返回原始終端。
而後,您將看到相似於此的一些輸出:
21840 11:26:33.390634648 0 nano (27291) < mmap res=7F517150A000 vm_size=8884 vm_rss=436 vm_swap=0 21841 11:26:33.390654669 0 nano (27291) > close fd=3(<f>/lib/x86_64-linux-gnu/libc.so.6) 21842 11:26:33.390657136 0 nano (27291) < close res=0 21843 11:26:33.390682336 0 nano (27291) > access mode=0(F_OK) 21844 11:26:33.390690897 0 nano (27291) < access res=-2(ENOENT) name=/etc/ld.so.nohwcap 21845 11:26:33.390695494 0 nano (27291) > open 21846 11:26:33.390708360 0 nano (27291) < open fd=3(<f>/lib/x86_64-linux-gnu/libdl.so.2) name=/lib/x86_64-linux-gnu/libdl.so.2 flags=4097(O_RDONLY|O_CLOEXEC) mode=0 21847 11:26:33.390710510 0 nano (27291) > read fd=3(<f>/lib/x86_64-linux-gnu/libdl.so.2) size=832
再次,經過按下CTRL+C
來終止命令。
獲取系統事件的實時視圖sysdig
並不老是使用它的最佳方法。幸運的是,還有另外一種方法 - 將事件捕獲到文件中以便稍後進行分析。咱們來看看如何。
使用系統事件捕獲文件能夠sysdig
讓您在之後分析這些事件。爲了節省系統事件記錄到文件中,傳遞sysdig
的-w
選項,並指定目標文件名,以下所示:
$ sudo sysdig -w sysdig-trace-file.scap
Sysdig將繼續將生成的事件保存到目標文件,直到您按下爲止CTRL+C
。隨着時間的推移, 文件可能會變得很是大。可是,使用-n
選項,您能夠指定但願Sysdig捕獲的事件數。捕獲目標事件數後,它將退出。例如,要將300個事件保存到文件,請輸入:
$ sudo sysdig -n 300 -w sysdig-file.scap
雖然您可使用Sysdig將指定數量的事件捕獲到文件中,但更好的方法是使用-C選項將捕獲分解爲特定大小的較小文件。爲了避免淹沒本地存儲,您能夠指示Sysdig只保留一些保存的文件。換句話說,Sysdig支持在一個命令中將事件捕獲到具備文件輪換的日誌。
例如,要將事件連續保存到大小不超過1 MB的文件中,而且只保留最後五個文件(這是-W選項的做用),請執行如下命令:
$ sudo sysdig -C 1 -W 5 -w sysdig-trace.scap
列出使用的文件ls -l sysdig-trace*
,你會看到與此相似的輸出,有五個日誌文件:
-rw-r--r-- 1 root root 985K Nov 23 04:13 sysdig-trace.scap0 -rw-r--r-- 1 root root 952K Nov 23 04:14 sysdig-trace.scap1 -rw-r--r-- 1 root root 985K Nov 23 04:13 sysdig-trace.scap2 -rw-r--r-- 1 root root 985K Nov 23 04:13 sysdig-trace.scap3 -rw-r--r-- 1 root root 985K Nov 23 04:13 sysdig-trace.scap4
與實時捕獲同樣,您能夠對已保存的事件應用過濾器。例如,要保存進程生成的200個事件nano
,請輸入如下命令:
$ sudo sysdig -n 200 -w sysdig-trace-nano.scap proc.name=nano
而後,在鏈接到服務器的另外一個終端中,打開文件nano
並經過輸入文本或保存文件生成一些事件。將捕獲事件sysdig-trace-nano.scap
直到sysdig
記錄200個事件。
您將如何捕獲服務器上生成的全部寫入事件?你會像這樣應用過濾器:
$ sudo sysdig -w sysdig-write-events.scap evt.type=write
片刻以後按下CTRL+C
退出。在將系統活動保存到文件時,您能夠作更多的事情sysdig
,可是這些示例應 讓您很是清楚如何去作。咱們來看看如何分析這些文件。
使用Sysdig從文件中讀取捕獲的數據就像將-r開關傳遞給sysdig
命令同樣簡單,以下所示:
$ sudo sysdig -r sysdig-trace-file.scap
這會將文件的整個內容轉儲到屏幕上,這不是最好的方法,特別是若是文件很大的話。幸運的是,您能夠在讀取寫入時應用的文件時應用相同的過濾器。
例如,要讀取sysdig-trace-nano.scap
您建立的跟蹤文件,但只查看特定類型的事件(如寫入事件),請輸入如下命令:
$ sysdig -r sysdig-trace-nano.scap evt.type=write
輸出應相似於:
21340 13:32:14.577121096 0 nano (27590) < write res=1 data=. 21736 13:32:17.378737309 0 nano (27590) > write fd=1 size=23 21737 13:32:17.378748803 0 nano (27590) < write res=23 data=#This is a test file..# 21752 13:32:17.611797048 0 nano (27590) > write fd=1 size=24 21753 13:32:17.611808865 0 nano (27590) < write res=24 data= This is a test file..# 21768 13:32:17.992495582 0 nano (27590) > write fd=1 size=25 21769 13:32:17.992504622 0 nano (27590) < write res=25 data=TThis is a test file..# T 21848 13:32:18.338497906 0 nano (27590) > write fd=1 size=25 21849 13:32:18.338506469 0 nano (27590) < write res=25 data=hThis is a test file..[5G 21864 13:32:18.500692107 0 nano (27590) > write fd=1 size=25 21865 13:32:18.500714395 0 nano (27590) < write res=25 data=iThis is a test file..[6G 21880 13:32:18.529249448 0 nano (27590) > write fd=1 size=25 21881 13:32:18.529258664 0 nano (27590) < write res=25 data=sThis is a test file..[7G 21896 13:32:18.620305802 0 nano (27590) > write fd=1 size=25
讓咱們看一下您在上一節中保存的文件的內容:sysdig-write-events.scap
文件。咱們知道保存到文件中的全部事件都是寫事件,因此讓咱們查看內容:
$ sudo sysdig -r sysdig-write-events.scap evt.type=write
這是部分輸出。若是捕獲事件時服務器上有任何SSH活動,您將看到相似的內容:
42585 19:58:03.040970004 0 gmain (14818) < write res=8 data=........ 42650 19:58:04.279052747 0 sshd (22863) > write fd=3(<4t>11.11.11.11:43566->22.22.22.22:ssh) size=28 42651 19:58:04.279128102 0 sshd (22863) < write res=28 data=.8c..jp...P........s.E<...s. 42780 19:58:06.046898181 0 sshd (12392) > write fd=3(<4t>11.11.11.11:51282->22.22.22.22:ssh) size=28 42781 19:58:06.046969936 0 sshd (12392) < write res=28 data=M~......V.....Z...\..o...N.. 42974 19:58:09.338168745 0 sshd (22863) > write fd=3(<4t>11.11.11.11:43566->22.22.22.22:ssh) size=28 42975 19:58:09.338221272 0 sshd (22863) < write res=28 data=66..J.._s&U.UL8..A....U.qV.* 43104 19:58:11.101315981 0 sshd (12392) > write fd=3(<4t>11.11.11.11:51282->22.22.22.22:ssh) size=28 43105 19:58:11.101366417 0 sshd (12392) < write res=28 data=d).(...e....l..D.*_e...}..!e 43298 19:58:14.395655322 0 sshd (22863) > write fd=3(<4t>11.11.11.11:43566->22.22.22.22:ssh) size=28 43299 19:58:14.395701578 0 sshd (22863) < write res=28 data=.|.o....\...V...2.$_...{3.3| 43428 19:58:16.160703443 0 sshd (12392) > write fd=3(<4t>11.11.11.11:51282->22.22.22.22:ssh) size=28 43429 19:58:16.160788675 0 sshd (12392) < write res=28 data=..Hf.%.Y.,.s...q...=..(.1De. 43622 19:58:19.451623249 0 sshd (22863) > write fd=3(<4t>11.11.11.11:43566->22.22.22.22:ssh) size=28 43623 19:58:19.451689929 0 sshd (22863) < write res=28 data=.ZT^U.pN....Q.z.!.i-Kp.o.y.. 43752 19:58:21.216882561 0 sshd (12392) > write fd=3(<4t>11.11.11.11:51282->22.22.22.22:ssh) size=28
請注意,前面輸出中的全部行都包含11.11.11.11:51282->22.22.22.22:ssh。這些是從客戶端的外部IP地址11.11.11.11
到服務器22.22.22.22
的IP地址的事件。這些事件發生在與服務器的SSH鏈接上,所以須要這些事件。可是有沒有其餘SSH寫事件不是來自這個已知的客戶端IP地址?這很容易找到。
您可使用Sysdig的許多比較運算符。你看到的第一個是=。其餘的是!=,>,> =,<和<=。在如下命令中,fd.rip過濾遠程IP地址。咱們將使用!=比較運算符來查找來自如下IP地址的事件:
$ sysdig -r sysdig-write-events.scap fd.rip!=11.11.11.11
如下輸出中顯示了部分輸出, 輸出顯示存在來自客戶端IP地址之外的IP地址的寫入事件:
294479 21:47:47.812314954 0 sshd (28766) > read fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) size=1 294480 21:47:47.812315804 0 sshd (28766) < read res=1 data=T 294481 21:47:47.812316247 0 sshd (28766) > read fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) size=1 294482 21:47:47.812317094 0 sshd (28766) < read res=1 data=Y 294483 21:47:47.812317547 0 sshd (28766) > read fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) size=1 294484 21:47:47.812318401 0 sshd (28766) < read res=1 data=. 294485 21:47:47.812318901 0 sshd (28766) > read fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) size=1 294486 21:47:47.812320884 0 sshd (28766) < read res=1 data=. 294487 21:47:47.812349108 0 sshd (28766) > fcntl fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) cmd=4(F_GETFL) 294488 21:47:47.812350355 0 sshd (28766) < fcntl res=2(<f>/dev/null) 294489 21:47:47.812351048 0 sshd (28766) > fcntl fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) cmd=5(F_SETFL) 294490 21:47:47.812351918 0 sshd (28766) < fcntl res=0(<f>/dev/null) 294554 21:47:47.813383844 0 sshd (28767) > write fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) size=976 294555 21:47:47.813395154 0 sshd (28767) < write res=976 data=........zt.....L.....}....curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-s 294691 21:47:48.039025654 0 sshd (28767) > read fd=3(<4t>221.229.172.117:49802->45.55.71.190:ssh) size=8192
進一步調查還顯示,流氓IP地址33.33.33.33
屬於中國的一臺機器。這是值得擔憂的事情!這只是一個例子,說明如何使用Sysdig密切注意服務器上的流量。
讓咱們看一下使用一些額外的腳原本分析事件流。
在Sysdig的說法中,chisels是可使用的Lua腳本,用於分析Sysdig事件流以執行有用的操做。每一個Sysdig安裝都附帶有近50個腳本,您可使用如下命令查看系統上可用的chisels列表:
$ sysdig -cl
一些更有趣的chisels包括:
有關chisels的更詳細描述(包括任何相關參數),請使用-i
標誌,而後使用chisels的名稱。所以,例如,要查看有關netstat
chisels的更多信息,請輸入:
$ sysdig -i netstat
既然您已經瞭解了使用 netstat
chisels所須要知道的一切,請經過運行如下方式來監控系統:
$ sudo sysdig -c netstat
輸出應相似於如下內容:
Proto Server Address Client Address State TID/PID/Program Name tcp 22.22.22.22:22 11.11.11.11:60422 ESTABLISHED 15567/15567/sshd tcp 0.0.0.0:22 0.0.0.0:* LISTEN 1613/1613/sshd
若是您在「 客戶端地址」列中看到來自您的IP地址之外的ESTABLISHED SSH鏈接,那麼這應 是一個紅色標記,您應 進行更深刻的探測。
一個更有趣的chiselsspy_users
,它容許您查看系統上的交互式用戶活動。
退出此命令:
$ sudo sysdig -c spy_users
而後,打開第二個終端並鏈接到您的服務器。在第二個終端中執行一些命令,而後返回到終端運行sysdig
。您在第一個終端中輸入的命令將在您執行sysdig -c spy_users
命令的終端上回顯。
接下來,讓咱們探索一個圖形工具Csysdig。
Csysdig是Sysdig附帶的另外一個實用程序。它具備交互式用戶界面,提供與命令行相同的功能sysdig
。這就像top
,htop
和strace
,但功能豐富的多。
與sysdig
命令同樣, csysdig
命令能夠執行實時監視,並能夠將事件捕獲到文件中以供之後分析。可是csysdig
,您能夠每兩秒刷新一次更實用的系統數據實時視圖。要查看示例,請輸入如下命令:
$ sudo csysdig
這將打開以下圖所示的界面, 界面顯示受監控主機上的全部用戶和應用程序生成的事件數據。
Csysdig的主界面
在界面的底部有幾個按鈕,您可使用它們來訪問程序的不一樣方面。最值得注意的是「 視圖」按鈕,它相似於收集的指標類別csysdig
。開箱即用的視圖有29個,包括進程,系統調用,線程,容器,進程CPU,頁面錯誤,文件和目錄。
當您在csysdig
沒有參數的狀況下啓動時 ,您將從「 進程」視圖中看到實時事件。經過單擊「 視圖」按鈕或F2
按鍵,您將看到可用視圖列表,包括列的說明。您還能夠經過F7
按鍵或單擊「 圖例」按鈕來查看列的說明。csysdig
經過F1
按鍵或單擊「 幫助」按鈕,能夠訪問應用程序自己()的摘要手冊頁。
下圖顯示了應用程序的Views界面的列表。
Csysdig視圖窗口
注意:對於每一個按鈕,按鈕的左側都有相應的鍵盤快捷鍵或熱鍵。按兩次快捷鍵將返回上一個窗口。按下
ESC
鍵將得到相同的結果。
雖然你能夠在csysdig
沒有任何選項和參數的狀況下運行,但命令的語法與sysdig
s同樣,一般採用如下形式:
$ sudo csysdig [option]... [filter]
最多見的選項是-d,用於修改更新之間的延遲(以毫秒爲單位)。例如,要查看csysdig
每10秒更新一次的輸出,而不是默認值2秒,請輸入:
$ sudo csysdig -d 10000
您可使用-E選項從視圖中排除用戶和組信息:
$ sudo csysdig -E
這可使csysdig
啓動更快,但在大多數狀況下速度增益能夠忽略不計。
要指示csysdig
在必定數量的事件後中止捕獲,請使用-n選項。應用程序將在達到 數字後退出。被捕獲事件的數量必須在五個數字中; 不然你甚至不會看到csysdig
UI:
$ sudo csysdig -n 100000
分析跟蹤文件,經過csysdig
了-r選項,以下所示:
$ sudo csysdig -r sysdig-trace-file.scap
您可使用與之相同的過濾器sysdig
來限制csysdig
輸出。所以,例如,您能夠經過csysdig
使用如下命令啓動用戶來過濾用戶輸出,而不是查看系統上全部用戶生成的事件數據, 命令將顯示僅由root用戶生成的事件數據:
$ sudo csysdig user.name=root
輸出應相似於下圖中顯示的輸出,但輸出將反映服務器上正在運行的內容:
root生成的Csysdig數據
要查看生成事件的可執行文件的輸出,請將過濾器的名稱傳遞給不帶路徑的二進制文件。如下示例將顯示 nano
命令生成的全部事件。換句話說,它將顯示文本編輯器所在的全部打開文件nano
:
$ sudo csysdig proc.name=nano
有幾十個可用的過濾器,您可使用如下命令查看:
$ sudo csysdig -l
您會注意到,這與您用於查看sysdig
命令可用的過濾器的選項相同。因此sysdig
,csysdig
幾乎是同樣的。主要區別在於csysdig
鼠標友好的交互式UI。要csysdig
隨時退出,請按Q
鍵盤上的鍵。
Sysdig可幫助您監控服務器並對其進行故障排除。它將使您深刻了解受監視主機上的全部系統活動,包括應用程序容器生成的活動。雖然本教程未特別涵蓋容器,但監視容器生成的系統活動的能力使Sysdig與相似的應用程序區別開來。項目主頁上提供了更多信息。
Sysdig的chisels是核心Sysdig功能的強大擴展。它們是用Lua編寫的,因此你老是能夠自定義它們或者從頭開始編寫它們。要了解有關製做chisels的更多信息,請訪問 項目的官方chisels 頁面。
若是您對其餘監視系統的工具,例如:使用Ubuntu 16.04上的osquery監視系統安全性,能夠訪問騰訊雲訪問更多的教程。
參考文獻:《How To Monitor Your Ubuntu 16.04 System with Sysdig》
問答
相關閱讀
此文已由做者受權騰訊雲+社區發佈,原文連接:https://cloud.tencent.com/developer/article/1172074?fromSource=waitui
歡迎你們前往騰訊雲+社區或關注雲加社區微信公衆號(QcloudCommunity),第一時間獲取更多海量技術實踐乾貨哦~
海量技術實踐經驗,盡在雲加社區!