欢迎你们前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~linux
本文由 乌鸦 发表于 云+社区专栏
Sysdig是一个全面的开源系统活动监控,捕获和分析应用程序。它具备强大的过滤语言和可自定义的输出,以及可使用称为chisels 的Lua脚本扩展的核心功能。ios
应用程序经过访问内核来工做, 内核容许它查看每一个系统调用以及经过内核传递的全部信息。这也使其成为监视和分析系统上运行的应用程序容器生成的系统活动和事件的出色工具。shell
核心Sysdig应用程序监视其安装的服务器。可是,该项目背后的公司提供了一个名为Sysdig Cloud的托管版本,能够远程监控任意数量的服务器。数据库
独立应用程序可在大多数Linux发行版上使用,但在Windows和macOS上也可用,功能更为有限。除了sysdig
命令行工具,Sysdig还带有一个csysdig
带有相似选项的交互式UI 。ubuntu
在本教程中,您将安装并使用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/dev...
欢迎你们前往腾讯云+社区或关注云加社区微信公众号(QcloudCommunity),第一时间获取更多海量技术实践干货哦~
海量技术实践经验,尽在云加社区!