介绍
Sysdig是一个全面的开源系统活动监控、捕捉和分析应用程序,它具有强大的过滤语言,可自定义输出,以及核心功能,可以通过名为 _chisels_的 Lua脚本来扩展。
该应用程序通过点击内核来工作,这使其能够看到每个系统调用和所有通过内核传递的信息,这也使其成为监控和分析系统活动和由应用程序容器生成的事件的绝佳工具。
核心Sysdig应用程序监控其安装的服务器,然而,该项目背后的公司提供了一个名为Sysdig Cloud的托管版本,可以远程监控任何数量的服务器。
该独立的应用程序在大多数Linux发行版上可用,但在Windows和macOS上也可用,功能更有限,除了sysdig
命令行工具外,Sysdig还配备了一个名为csysdig
的交互式界面,具有类似的选项。
在本教程中,您将安装并使用Sysdig来监控Ubuntu 16.04服务器.您将流现场事件,将事件保存到文件中,过滤结果,并探索csysdig
交互式用户界面。
前提条件
要完成本教程,您将需要:
- 一个 Ubuntu 16.04 服务器设置为 Ubuntu 16.04 初始服务器安装指南,包括一个 sudo 非 root 用户和一个防火墙。
步骤 1 – 使用官方脚本安装 Sysdig
在Ubuntu存储库中有一个Sysdig包,但它通常是当前版本背后的修订或两次。在发布时,例如,使用Ubuntu的包管理器安装Sysdig会给你Sysdig 0.8.0。
但首先,更新包数据库,以确保您有最新的可用包列表:
1sudo apt-get update
现在,下载Sysdig的安装脚本,使用以下命令弯曲
:
1curl https://s3.amazonaws.com/download.draios.com/stable/install-sysdig -o install-sysdig
这会将安装脚本下载到当前文件夹的install-sysdig
文件中。您需要以高权限执行此脚本,并且运行您从互联网下载的脚本很危险。在执行脚本之前,请通过在文本编辑器中打开其内容或使用少
命令在屏幕上显示内容:
1less ./install-sysdig
一旦您对脚本将运行的命令感到满意,请使用以下命令执行脚本:
1cat ./install-sysdig | sudo bash
该命令将安装所有依赖,包括内核头和模块。
1[secondary_label Output]
2* Detecting operating system
3* Installing Sysdig public key
4OK
5* Installing sysdig repository
6* Installing kernel headers
7* Installing sysdig
8
9...
10
11sysdig-probe:
12Running module version sanity check.
13 - Original module
14 - No original module exists within this kernel
15 - Installation
16 - Installing to /lib/modules/4.4.0-59-generic/updates/dkms/
17
18depmod....
19
20DKMS: install completed.
21Processing triggers for libc-bin (2.23-0ubuntu5) ...
现在你已经安装了Sysdig,让我们看看使用它的一些方法。
步骤2 – 实时监控您的系统
在本节中,你将使用sysdig
命令来查看 Ubuntu 16.04 服务器上的某些事件。sysdig
命令需要 root 权限来运行,并且需要任何数量的选项和过滤器。
1sudo sysdig
但是,正如你在运行命令后所看到的那样,很难分析被写到屏幕上的数据,因为它连续流,并且在您的服务器上发生了很多事件。
在我们使用一些选项再次运行命令之前,让我们通过从命令中查看样本输出来熟悉输出:
1[secondary_label Output]
2253566 11:16:42.808339958 0 sshd (12392) > rt_sigprocmask
3253567 11:16:42.808340777 0 sshd (12392) < rt_sigprocmask
4253568 11:16:42.808341072 0 sshd (12392) > rt_sigprocmask
5253569 11:16:42.808341377 0 sshd (12392) < rt_sigprocmask
6253570 11:16:42.808342432 0 sshd (12392) > clock_gettime
7253571 11:16:42.808343127 0 sshd (12392) < clock_gettime
8253572 11:16:42.808344269 0 sshd (12392) > read fd=10(<f>/dev/ptmx) size=16384
9253573 11:16:42.808346955 0 sshd (12392) < read res=2 data=..
输出的列是:
1[secondary_label Output]
2%evt.num %evt.outputtime %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.info
以下是每个列的含义:
- evt.cpu是增量事件号.
- evt.outputtime是您可以自定义的事件时间标签。
- evt.cpu是事件被捕获的CPU号。在上面的输出中, evt.cpu是 0,这是服务器的第一个CPU。
- proc.name是产生事件的过程的名称。
- thread.tid是事件的生成时间标签,相当于单个线程的PID。 *evt.dir**是事件的方向。你会看到 **>输入事件和 **<**输出事件。
- evt.tipe是事件的名称,例如
运行sysdig
几乎没有任何价值,就像你在上一个命令中所做的,因为里面有如此多的信息流,但是你可以使用这个语法将选项和过滤器应用到命令中:
1sudo sysdig [option] [filter]
您可以使用以下方式查看可用的过滤器的完整列表:
1sysdig -l
有一个广泛的过滤器列表,涵盖多个类或类别. 以下是其中一些类:
- fd: 过滤文件描述(FD)信息,如 FD 号码和 FD 名称。
- process: 过滤过程信息,如产生事件的过程的 id 和名称。
- evt: 过滤事件信息,如事件号码和时间。
- user: 过滤用户信息,如用户 ID、用户名、用户主目录或登录壳。
- group: 过滤组信息,如组和名称。
由于在本教程中覆盖每个过滤器是不切实际的,所以让我们尝试几个,从 syslog.severity.str 过滤器开始在 syslog 类中,这允许您在特定严重程度上查看发送给 syslog 的消息。
1sudo sysdig syslog.severity.str=info
<$>[注] 注: 根据您的服务器的活动水平,在输入此命令后,您可能不会看到任何输出,或者您可能需要很长时间才能看到任何输出。
杀死命令,按CTRL+C
。
输出,应该相当容易解释,应该看起来像这样:
1[secondary_label Output]
210716 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
3618099 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
4627648 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
5629992 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
6639224 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
7639530 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/
8640031 03:17:01.619412864 0 cron (27042) < sendto syslog sev=info msg=Jan 24 03:17:01 CRON[27042]: pam_unix(cron:session): session closed for user
例如,要搜索nano
中的事件,请执行以下命令:
1sudo sysdig proc.name=nano
由于这个命令在nano
上文件,你将不得不使用nano
文本编辑器打开文件以查看任何输出。打开另一个终端编辑器,连接到您的服务器,并使用nano
打开文本文件。
然后你会看到一些类似于此的输出:
1[secondary_label Output]
221840 11:26:33.390634648 0 nano (27291) < mmap res=7F517150A000 vm_size=8884 vm_rss=436 vm_swap=0
321841 11:26:33.390654669 0 nano (27291) > close fd=3(<f>/lib/x86_64-linux-gnu/libc.so.6)
421842 11:26:33.390657136 0 nano (27291) < close res=0
521843 11:26:33.390682336 0 nano (27291) > access mode=0(F_OK)
621844 11:26:33.390690897 0 nano (27291) < access res=-2(ENOENT) name=/etc/ld.so.nohwcap
721845 11:26:33.390695494 0 nano (27291) > open
821846 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
921847 11:26:33.390710510 0 nano (27291) > read fd=3(<f>/lib/x86_64-linux-gnu/libdl.so.2) size=832
再次,通过键入CTRL+C
来杀死命令。
使用sysdig
获取系统事件的实时视图并不总是使用它的最佳方法. 幸运的是,还有另一种方法 - 捕捉事件到一个文件进行分析。
步骤 3 – 捕捉系统活动到使用 Sysdig 的文件
通过使用sysdig
捕捉系统事件到一个文件,您可以稍后分析这些事件. 要将系统事件保存到一个文件中,请通过sysdig
选项 -w 并指定目标文件名称,如下:
1sudo sysdig -w sysdig-trace-file.scap
Sysdig 会将生成的事件保存到目标文件,直到您按下CTRL+C
。随着时间的推移,该文件可以变得相当大。 但是,使用 -n 选项,您可以指定您希望 Sysdig 捕获多少事件。
1sudo sysdig -n 300 -w sysdig-file.scap
虽然您可以使用 Sysdig 来捕捉特定数量的事件到一个文件中,但一个更好的方法是使用 -C 选项将捕获分解为特定大小的文件,而不是压倒本地存储,您可以指示 Sysdig 只保留一些保存的文件。
例如,要将事件连续保存到大小不超过 1 MB 的文件中,并且只保留最后五个文件(这就是 -W 选项所做的),请执行以下命令:
1sudo sysdig -C 1 -W 5 -w sysdig-trace.scap
使用ls -l sysdig-trace*
列出文件,你会看到类似于此的输出,有五个日志文件:
1[secondary_label Output]
2-rw-r--r-- 1 root root 985K Nov 23 04:13 sysdig-trace.scap0
3-rw-r--r-- 1 root root 952K Nov 23 04:14 sysdig-trace.scap1
4-rw-r--r-- 1 root root 985K Nov 23 04:13 sysdig-trace.scap2
5-rw-r--r-- 1 root root 985K Nov 23 04:13 sysdig-trace.scap3
6-rw-r--r-- 1 root root 985K Nov 23 04:13 sysdig-trace.scap4
与实时捕获一样,您可以将过滤器应用到保存的事件中,例如,若要保存由过程nano
生成的 200 个事件,请键入以下命令:
1sudo sysdig -n 200 -w sysdig-trace-nano.scap proc.name=nano
然后,在连接到您的服务器的另一个终端中,打开一个包含nano
的文件并通过键入文本或保存该文件来生成一些事件。
你会如何捕捉到你服务器上生成的所有写作事件?你会这样应用过滤器:
1sudo sysdig -w sysdig-write-events.scap evt.type=write
点击CTRL+C
几分钟后退出。
您可以在使用sysdig
来保存系统活动时做得更多,但这些例子应该给您一个很好的想法,看看如何分析这些文件。
步骤 4 – 使用 Sysdig 阅读和分析事件数据
通过 Sysdig 读取从文件中捕获的数据就像将 -r 开关传输到 `sysdig' 命令一样简单:
1sudo sysdig -r sysdig-trace-file.scap
这会将文件的全部内容投放到屏幕上,这并不是最好的方法,特别是如果文件大,幸运的是,您可以在阅读您在写时应用的文件时应用相同的过滤器。
例如,若要阅读您创建的 sysdig-trace-nano.scap 跟踪文件,但只查看特定类型的事件,例如写事件,请键入此命令:
1sysdig -r sysdig-trace-nano.scap evt.type=write
产量应该类似于:
1[secondary_label Output]
221340 13:32:14.577121096 0 nano (27590) < write res=1 data=.
321736 13:32:17.378737309 0 nano (27590) > write fd=1 size=23
421737 13:32:17.378748803 0 nano (27590) < write res=23 data=#This is a test file..#
521752 13:32:17.611797048 0 nano (27590) > write fd=1 size=24
621753 13:32:17.611808865 0 nano (27590) < write res=24 data= This is a test file..#
721768 13:32:17.992495582 0 nano (27590) > write fd=1 size=25
821769 13:32:17.992504622 0 nano (27590) < write res=25 data=TThis is a test file..# T
921848 13:32:18.338497906 0 nano (27590) > write fd=1 size=25
1021849 13:32:18.338506469 0 nano (27590) < write res=25 data=hThis is a test file..[5G
1121864 13:32:18.500692107 0 nano (27590) > write fd=1 size=25
1221865 13:32:18.500714395 0 nano (27590) < write res=25 data=iThis is a test file..[6G
1321880 13:32:18.529249448 0 nano (27590) > write fd=1 size=25
1421881 13:32:18.529258664 0 nano (27590) < write res=25 data=sThis is a test file..[7G
1521896 13:32:18.620305802 0 nano (27590) > write fd=1 size=25
让我们来看看你在上一节中保存的文件的内容: sysdig-write-events.scap
文件. 我们知道在文件中保存的所有事件都是写事件,所以让我们来看看内容:
1sudo sysdig -r sysdig-write-events.scap evt.type=write
您将看到这样的东西,如果您捕获事件时在服务器上有任何SSH活动:
1[secondary_label Output]
242585 19:58:03.040970004 0 gmain (14818) < write res=8 data=........
342650 19:58:04.279052747 0 sshd (22863) > write fd=3(<4t>11.11.11.11:43566->22.22.22.22:ssh) size=28
442651 19:58:04.279128102 0 sshd (22863) < write res=28 data=.8c..jp...P........s.E<...s.
542780 19:58:06.046898181 0 sshd (12392) > write fd=3(<4t>11.11.11.11:51282->22.22.22.22:ssh) size=28
642781 19:58:06.046969936 0 sshd (12392) < write res=28 data=M~......V.....Z...\..o...N..
742974 19:58:09.338168745 0 sshd (22863) > write fd=3(<4t>11.11.11.11:43566->22.22.22.22:ssh) size=28
842975 19:58:09.338221272 0 sshd (22863) < write res=28 data=66..J.._s&U.UL8..A....U.qV.*
943104 19:58:11.101315981 0 sshd (12392) > write fd=3(<4t>11.11.11.11:51282->22.22.22.22:ssh) size=28
1043105 19:58:11.101366417 0 sshd (12392) < write res=28 data=d).(...e....l..D.*_e...}..!e
1143298 19:58:14.395655322 0 sshd (22863) > write fd=3(<4t>11.11.11.11:43566->22.22.22.22:ssh) size=28
1243299 19:58:14.395701578 0 sshd (22863) < write res=28 data=.|.o....\...V...2.$_...{3.3|
1343428 19:58:16.160703443 0 sshd (12392) > write fd=3(<4t>11.11.11.11:51282->22.22.22.22:ssh) size=28
1443429 19:58:16.160788675 0 sshd (12392) < write res=28 data=..Hf.%.Y.,.s...q...=..(.1De.
1543622 19:58:19.451623249 0 sshd (22863) > write fd=3(<4t>11.11.11.11:43566->22.22.22.22:ssh) size=28
1643623 19:58:19.451689929 0 sshd (22863) < write res=28 data=.ZT^U.pN....Q.z.!.i-Kp.o.y..
1743752 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
到服务器的IP地址, 22.22.22.22
. 这些事件发生在与服务器的SSH连接上,所以这些事件是预期的。
您可以使用 Sysdig 的许多比较运算器. 您看到的第一个运算器是 =. 其他运算器是 !=, >, >=, **<**和 <=. 在以下命令中, fd.rip 过滤远程 IP 地址。
1sysdig -r sysdig-write-events.scap fd.rip!=11.11.11.11
显示来自客户端 IP 地址以外的 IP 地址的写事件的部分输出显示在下面的输出中:
1[secondary_label Output]
2294479 21:47:47.812314954 0 sshd (28766) > read fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) size=1
3294480 21:47:47.812315804 0 sshd (28766) < read res=1 data=T
4294481 21:47:47.812316247 0 sshd (28766) > read fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) size=1
5294482 21:47:47.812317094 0 sshd (28766) < read res=1 data=Y
6294483 21:47:47.812317547 0 sshd (28766) > read fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) size=1
7294484 21:47:47.812318401 0 sshd (28766) < read res=1 data=.
8294485 21:47:47.812318901 0 sshd (28766) > read fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) size=1
9294486 21:47:47.812320884 0 sshd (28766) < read res=1 data=.
10294487 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)
11294488 21:47:47.812350355 0 sshd (28766) < fcntl res=2(<f>/dev/null)
12294489 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)
13294490 21:47:47.812351918 0 sshd (28766) < fcntl res=0(<f>/dev/null)
14294554 21:47:47.813383844 0 sshd (28767) > write fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) size=976
15294555 21:47:47.813395154 0 sshd (28767) < write res=976 data=........zt.....L.....}[email protected],ecdh-sha2-nistp256,ecdh-s
16294691 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来密切关注攻击您的服务器的流量的一个例子。
让我们看看使用一些额外的脚本来分析事件流。
步骤5 – 使用Sysdig Chisels用于系统监测和分析
在 Sysdig 演讲中, chisels 是您可以使用的 Lua 脚本来分析 Sysdig 事件流以执行有用的操作。 每个 Sysdig 安装时,有近 50 个脚本,您可以使用此命令查看系统上可用的 chisels 的列表:
1sysdig -cl
一些更有趣的chisels包括:
- netstat:列表(并可选过滤)网络连接.
- shellshock_detect: 打印 shellshock攻击
- spy_users: 显示交互式用户活动.
- list_login_shells: 列出登录壳 IDs.
- spy_ip: 显示与给定的 IP 地址交换的数据.
- spy_port: 显示使用给定的 IP 端口号交换的数据.
- spy_file: 对所有文件的任何进程所做的任何读取或写入响应。
要更详细地描述一个,包括任何相关论点,请使用-i
旗,然后是的名称。
1sysdig -i netstat
现在你知道所有你需要知道的关于使用这个netstat
,点击它的力量来监控你的系统通过运行:
1sudo sysdig -c netstat
输出应该与以下相似:
1[secondary_label Output]
2Proto Server Address Client Address State TID/PID/Program Name
3tcp 22.22.22.22:22 11.11.11.11:60422 ESTABLISHED 15567/15567/sshd
4tcp 0.0.0.0:22 0.0.0.0:* LISTEN 1613/1613/sshd
如果您在客户端地址
列中看到来自您自己的 IP 地址以外的 ESTABLISHED SSH 连接,这应该是一个红旗,您应该更深入地探索。
更有趣的是spy_users
,它允许您在系统上查看交互式用户活动。
离开这个命令:
1sudo sysdig -c spy_users
然后,打开第二个终端并连接到您的服务器。在第二个终端中执行一些命令,然后返回运行sysdig
的终端。在第一个终端中输入的命令将响应您执行sysdig -c spy_users
命令的终端。
接下来,让我们探索 Csysdig,一个图形工具。
步骤 6 – 使用 Csysdig 用于系统监测和分析
Csysdig 是附带 Sysdig 的另一个实用程序. 它有一个交互式用户界面,提供与sysdig
在命令行上可用的相同功能. 它就像顶部
,顶部
和路径
,但更富有功能。
与sysdig
命令一样,csysdig
命令可以执行实时监控,并可以将事件捕捉到文件中以进行后续分析,但csysdig
为您提供了每两秒更新系统数据的更有用的实时视图。
1sudo csysdig
这将打开一个接口,如下图所示的接口,显示由监控主机上的所有用户和应用程序生成的事件数据。
在接口的底部有几个按钮,你可以用来访问程序的不同方面。最显著的是 Views按钮,这类类别类似于csysdig
收集的指标类别。有 29 个视图可用,包括 Processes, System Calls, Threads, Containers, Processes CPU, Page Faults, Files和 Directories。
当你在没有论点的情况下开始csysdig
时,你将从 Processes视图中看到实时事件。通过点击Views**
按钮或按F2
键,你将看到可用的视图列表,包括列的描述。你也可以通过点击F7
按钮或点击Legend**
按钮查看列的描述。
下面的图像显示了应用程序的 Views界面。
<$>[注] ** 注:** 对于每个按钮,有相应的键盘快捷键,或热键,在按钮的左侧。
虽然你可以运行csysdig
而无需任何选项和参数,但命令的语法,就像sysdig
一样,通常采取这样的形式:
1sudo csysdig [option]... [filter]
最常见的选项是 -d,用于修改更新之间的延迟,以毫秒。例如,要查看每 10 秒更新的 csysdig
输出,而不是默认 2 秒,请键入:
1sudo csysdig -d 10000
您可以使用 -E 选项将用户和组信息从视图中排除:
1sudo csysdig -E
这可以使csysdig
开始更快,但速度的增加在大多数情况下是微不足道的。
若要指示csysdig在一定数量的事件后停止捕捉,请使用 -n 选项。应用程序将在达到该数字后退出。
1sudo csysdig -n 100000
要分析痕迹文件,请通过csysdig
选项 -r,如下:
1sudo csysdig -r sysdig-trace-file.scap
您可以使用与sysdig
相同的过滤器来限制csysdig
的输出,例如,而不是查看系统上的所有用户生成的事件数据,您可以通过使用以下命令启动csysdig
来过滤用户的输出,该命令将显示仅由根用户生成的事件数据:
1sudo csysdig user.name=root
输出应该与下面的图像相似,尽管输出将反映您服务器上正在运行的内容:
若要查看生成事件的可执行的输出,请在没有路径的情况下将二进制的名称传递给过滤器。下面的示例将显示由nano
命令生成的所有事件。
1sudo csysdig proc.name=nano
有几十个过滤器可用,您可以使用以下命令查看:
1sudo csysdig -l
你会注意到,这是你用来查看sysdig
命令可用的过滤器的相同选项,所以sysdig
和csysdig
大致相同。 主要区别在于csysdig
配备了易于使用的交互式用户界面。 要随时退出csysdig
,请按键盘上的Q
键。
结论
Sysdig 帮助您监控和故障排除您的服务器. 它将为您提供对监控主机上的所有系统活动的深入了解,包括由应用程序容器生成的活动。 虽然本教程没有针对具体的容器,但监控由容器生成的系统活动的能力使 Sysdig 与类似的应用程序不同。
Sysdig 的是核心 Sysdig 功能的强大扩展。它们是用 Lua 编写的,因此您可以随时自定义它们或从头开始编写一个。