简介
sysdig 是一款全新的系统级探索和故障诊断工具,它将 Strace、tcpdump 和 lsof 等著名实用工具的优点整合到一个应用程序中。如果这还不够,sysdig 还能将系统活动保存到跟踪文件中,以便日后分析。
此外,安装程序还提供了一个丰富的脚本库(称为 chisels),以帮助您解决常见问题或满足监控需求,从显示失败的磁盘 I/O 操作到查找某个进程花费时间最多的文件,等等。你还可以根据自己的需要编写脚本,进一步增强 sysdig 的功能。
在本文中,我们将首先介绍 sysdig 的基本用法,然后探讨使用 sysdig 进行网络分析,包括在 CentOS 7 LAMP 服务器上审计网络流量的示例。请注意,示例中使用的 VPS 并没有承受很大的负载,但足以显示当前审计任务的基本情况。
先决条件
在开始之前,请确保您具备这些先决条件。
- CentOS 7 Droplet
- 在 CentOS 7 VPS 上设置 LAMP 服务器。请参阅本文获取说明
- 此外,你应该有一个具有 sudo 访问权限 的非 root 用户账户,用于运行 sysdig。
安装 sysdig
登录服务器并按照以下步骤操作:
第 1 步 - 信任 Draios GPG 密钥
Draios 是 sysdig 背后的公司。
在进行安装之前,yum 会使用此密钥验证即将下载的软件包的真实性。
要将 Draios 密钥手动添加到 RPM 密钥环中,请使用带有 --import
标记的 rpm
工具:
1sudo rpm --import https://s3.amazonaws.com/download.draios.com/DRAIOS-GPG-KEY.public
然后,下载 Draios 软件源并配置 yum 以使用它:
1sudo curl -s -o /etc/yum.repos.d/draios.repo http://download.draios.com/stable/rpm/draios.repo
第 2 步 - 启用 EPEL 资源库
Extra Packages for Enterprise Linux (EPEL) 是一个由 Fedora 项目维护的高质量免费开源软件源,与 Red Hat Enterprise Linux 和 CentOS 等衍生软件 100% 兼容。要下载 sysdig 所需的动态内核模块支持(DKMS)软件包,以及下载其他依赖项,都需要使用该资源库。
1sudo yum -y install epel-release
第 3 步 - 安装内核头文件
之所以需要这样做,是因为 sysdig 需要构建一个定制的内核模块(名为 "sysdig-probe"),并使用它来运行。
1sudo yum -y install kernel-devel-$(uname -r)
第 4 步 - 安装 sysdig 软件包
现在我们可以安装 sysdig。
1sudo yum -y install sysdig
第 5 步 - 以非 root 用户身份运行 sysdig
为了安全起见,最好由非 root 用户运行 sysdig。为 sysdig 创建一个自定义组:
1sudo groupadd sysdig
向组中添加一个或多个用户。在我们的示例中,我们将添加用户 sammy 。
1sudo usermod -aG sysdig sammy
找到 sysdig 的二进制文件:
1which sysdig
您可能会收到如下回复
1/usr/bin/sysdig
赋予 sysdig 组的所有成员运行 sysdig
可执行文件(仅限该二进制文件)的权限。用以下命令编辑 /etc/sudoers
:
1sudo visudo
在 "组 "部分为 sysdig 组添加以下行。在 %wheel
部分之后添加新行即可。将路径替换为 sysdig 在系统中的位置:
1## Same thing without a password
2# %wheel ALL=(ALL) NOPASSWD: ALL
3
4## sysdig
5%sysdig ALL= /usr/bin/sysdig
如果需要进一步了解如何编辑 /etc/sudoers
文件,建议查看 本文。
运行 sysdig
您可以在两种模式下运行 sysdig。
您可以实时查看服务器活动流,也可以将系统操作记录保存到文件中,以便日后进行离线分析。
由于您很可能希望使用第二个选项,因此我们将在此介绍第二个选项。请注意,在将系统活动保存到文件时,sysdig 会获取操作系统的完整快照,因此在该时间间隔内服务器上发生的所有事情都将可供离线分析。
注意: 运行 sysdig 命令时,请确保每个选项前都有一个短破折号。复制和粘贴可能会导致单破折号被粘贴为长破折号,从而无法被程序识别。
让我们运行一个基本的 sysdig 命令,捕捉 1000 行服务器活动。
要捕获系统活动到名为 act1.scap
的文件,并将输出限制为 1000 个事件,请运行以下命令(如果要在未指定的时间段内运行 sysdig,请省略 -n 1000
部分)。使用 -z
开关可以压缩跟踪文件。
1sudo sysdig -w act1.scap.gz -n 1000 -z
注意:** 如果在上一步中省略了 -n 开关,可以按 CTRL + C 组合键中断 sysdig 的执行。
Chisels - sysdig 脚本概述
Chisels 是 sysdig 脚本。要显示可用凿子的列表,我们需要运行以下命令:
1sudo sysdig -cl
为了使用 sysdig 创建的跟踪文件审核 CentOS 7 LAMP 服务器上的网络流量,我们将使用网络类别下的凿子:
1Category: Net
2-------------
3iobytes_net Show total network I/O bytes
4spy_ip Show the data exchanged with the given IP address
5spy_port Show the data exchanged using the given IP port number
6topconns top network connections by total bytes
7topports_server Top TCP/UDP server ports by R+W bytes
8topprocs_net Top processes by network I/O
有关特定凿子的更多描述及其使用说明,可通过以下链接查看:
1sudo sysdig -i chisel name
例如
1sudo sysdig -i spy_ip
此输出:
1Category: Net
2-------------
3spy_ip Show the data exchanged with the given IP address
4shows the network payloads exchanged with an IP endpoint. You can combine this chisel with the -x, -X or -A sysdig command line switches to customize the screen output
5Args:
6[ipv4] host_ip - the remote host IP address
7[string] disable_color - Set to 'disable_colors' if you want to disable color output
参数 "部分表示是否需要向凿子传递参数。如果是 spy_ip
,则需要将 IP 地址作为参数传递给凿子。
审核网络流量(实例)
让我们通过一个实际例子来了解如何使用 sysdig 分析带宽使用情况并查看有关网络流量的详细信息。
要从该测试中获得最佳结果,您需要在服务器上设置一个虚拟表单,以便产生适当的流量。如果您的服务器刚安装了 LAMP 系统,您可以在 /var/www/html/index.php
'中制作这个表单。
1<body>
2<form id="loginForm" name="loginForm" method="post" action="login.php">
3 <table width="300" border="0" align="center" cellpadding="2" cellspacing="0">
4 <tr>
5 <td width="112"><b>Username:</b></td>
6 <td width="188"><input name="login" type="text" class="textfield" id="login" /></td>
7 </tr>
8 <tr>
9 <td><b>Password:</b></td>
10 <td><input name="pass" type="password" class="textfield" id="pass" /></td>
11 </tr>
12 <tr>
13 <td> </td>
14 <td><br />
15 <input type="submit" name="Submit" value="Login" /></td></tr>
16 </table>
17</form>
18</body>
这不是必需的,但为了使一切更整洁,您还可以创建 /var/www/html/login.php
页面:
1<body>
2 <p>Form submitted.</p>
3</body>
警告: 测试完成后,请删除此表单!
第 1 步 - 为离线分析保存实时数据
我们将发出以下命令,开始采集日志数据:
1sudo sysdig -w act1.scap.gz -z -s 4096
让 sysdig 运行一段合理的时间。当 sysdig 运行时,命令提示符会挂起。
现在,在网络浏览器中访问服务器的域名或 IP 地址。您既可以访问现有网页,也可以访问不存在的网页,以产生一些流量。如果你想让这个示例发挥作用,就应该访问主页,在登录信息中填写任何你喜欢的内容,然后提交登录表单几次 。此外,还可以在 MySQL/MariaDB 数据库中运行查询。
生成一些流量后,按 CTRL + C 停止 sysdig。然后,您就可以运行本教程稍后讨论的分析查询了。
在生产环境中,您可以在服务器繁忙时启动 sysdig 数据收集。
了解过滤器:类和字段
在对 sysdig 数据进行排序之前,我们先来解释一下 sysdig 命令的一些基本要素。
Sysdig 提供类和字段作为过滤器。根据面向对象编程理论的类比,您可以把类看成对象,把字段看成属性。
您可以通过以下方式显示完整的类和字段列表:
1sudo sysdig -l
在分析跟踪文件时,我们将使用类和字段来过滤输出。
第 2 步 - 使用跟踪文件执行离线分析
由于我们要审计进出 LAMP 服务器的网络流量,因此将加载跟踪文件 act1.scap.gz
并使用 sysdig 执行以下测试:
显示占用网络带宽最多的进程列表
1sudo sysdig -r act1.scap.gz -c topprocs_net
你应该会看到类似这样的输出:
1Bytes Process
2------------------------------
3331.68KB httpd
424.14KB sshd
54.48KB mysqld
在这里,您可以看到 Apache 占用了最大的带宽("httpd "进程)。
根据该输出结果,您可以做出明智和有支持的判断,决定是否需要增加可用带宽,以满足当前和未来的估计请求。否则,您可能需要对进程可使用的可用带宽的最大速率进行适当限制。
按进程显示网络使用情况
我们可能还想知道哪些 IP 正在使用 httpd
消耗的网络带宽,如上例所示。
为此,我们将使用 "topconns "凿(按总字节数显示顶级网络连接),并添加一个由类 "proc "和字段 "name "组成的过滤器,以过滤结果,只显示 "http "连接。换句话说,使用以下命令
1sudo sysdig -r act1.scap.gz -c topconns proc.name=httpd
这将返回服务器的顶级网络连接,包括源连接,其中提供请求的进程是 httpd
。
1Bytes Proto Conn
2------------------------------
356.24KB tcp 111.111.111.111:12574->your_server_ip:80
451.94KB tcp 111.111.111.111:15249->your_server_ip:80
551.57KB tcp 111.111.111.111:27832->your_server_ip:80
651.26KB tcp 111.111.222.222:42487->your_server_ip:80
748.20KB tcp 111.111.222.222:42483->your_server_ip:80
848.20KB tcp 111.111.222.222:42493->your_server_ip:80
94.17KB tcp 111.111.111.111:13879->your_server_ip:80
103.14KB tcp 111.111.111.111:27873->your_server_ip:80
113.06KB tcp 111.111.222.222:42484->your_server_ip:80
123.06KB tcp 111.111.222.222:42494->your_server_ip:80
请注意,出于保护隐私的考虑,原始源 IP 地址和目标 IP 地址已被隐藏。
此类查询可帮助您找到向服务器发送流量的顶级带宽用户。
看了上面的输出,你可能会认为源 IP 地址后面的数字代表端口。但事实并非如此。这些数字表示 sysdig 记录的事件编号。
第 3 步 - 分析特定 IP 与 Apache 之间交换的数据
现在,我们将更详细地检查特定 IP 地址与 Apache 之间的连接。
通过 echo_fds
箭头,我们可以显示进程读写的数据。当与特定进程名和客户端 IP(如本例中的 "proc.name=httpd and fd.cip=111.111.111.111")结合使用时,该凿子将显示 LAMP 服务器与该客户端 IP 之间交换的数据。
此外,使用以下开关有助于我们更友好、更准确地显示结果:
-s 4096
:对于每个事件,从其缓冲区中读取最多 4096 字节的数据(当将实时数据保存到跟踪文件中进行离线分析时,也可使用该标志指定每个数据缓冲区中应保存到磁盘的字节数)-A
: 只打印数据缓冲区的文本部分,并回显行尾(我们希望只显示人类可读的数据)
命令如下。请务必将 111.111.111.111
替换为之前输出的客户端 IP 地址。
1sudo sysdig -r act1.scap.gz -s 4096 -A -c echo_fds fd.cip=111.111.111.111 and proc.name=httpd
根据该 IP 地址的连接数,您会看到大量输出。下面是一个显示 404 错误的示例:
1GET /hi HTTP/1.1
2Host: your_server_ip
3Connection: keep-alive
4Cache-Control: m
5
6------ Write 426B to 111.111.111.111:39003->your_server_ip:80
7
8HTTP/1.1 404 Not Found
9Date: Tue, 02 Dec 2014 19:38:16 GMT
10Server: Apache/2.4.6 (CentOS) PHP/5.4.16
11Content-Length: 200
12Keep-Alive: timeout=5, max=99
13Connection: Keep-Alive
14Content-Type: text/html; charset=iso-8859-1
15
16<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">
17<html><head>
18<title>404 Not Found</title>
19</head><body>
20<h1>Not Found</h1>
21<p>The requested URL /hi was not found on this server.</p>
22</body></html>
这种类型的查询可以帮助你准确找出使用带宽最多的 IP 地址进行了哪些类型的连接。例如,如果发现该 IP 地址频繁访问某个页面,就可以尽可能减少该页面的资产,以减少带宽使用。或者,如果流量似乎不合法,可以创建新的防火墙规则来阻止占用带宽的 IP。
第 4 步 - 按关键字检查与 IP 地址交换的数据
根据捕获时间间隔内的服务器活动,跟踪文件可能包含大量事件和信息。因此,手工查看上一节命令的结果可能会耗费大量时间,这是不现实的。因此,我们可以在事件缓冲区中查找特定字词。
假设我们的网络服务器上运行着一组网络应用程序,我们希望确保登录凭据不会通过表单以纯文本形式传递。
让我们为上一个示例中使用的命令添加几个标记:
1sudo sysdig -r act1.scap.gz -A -c echo_fds fd.ip=111.111.111.111 and proc.name=httpd and evt.is_io_read=true and evt.buffer contains form
在这里,类 evt
和字段 is_io_read
允许我们只检查读取的事件(从服务器的角度看)。此外,"evt.buffer "还允许我们在事件缓冲区内搜索特定的单词(本例中的单词是 "form")。您可以根据自己的应用程序更改搜索关键字。
下面的输出显示,用户名和密码正以纯文本形式从客户端传递到服务器(因此有足够专业知识的人都能读懂):
1------ Read 551B from 111.111.111.111:41135->your_server_ip:80
2
3POST /login.php HTTP/1.1
4Host: your_server_ip
5Connection: keep-alive
6Content-Length: 35
7Cache-Control: max-age=0
8Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
9Origin: http://104.236.40.111
10User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36
11Content-Type: application/x-www-form-urlencoded
12Referer: http://104.236.40.111/
13Accept-Encoding: gzip,deflate
14Accept-Language: en-US,en;q=0.8
15
16login=sammy&pass=password&Submit=Login
如果您发现类似的安全漏洞,请立即通知您的开发团队。
结论
使用 sysdig 对 LAMP 服务器上的网络流量进行审计所能达到的效果,主要受限于个人的想象力和应用程序请求。我们已经了解了如何查找带宽最高的用户、检查来自特定 IP 的流量,以及如何根据应用程序的请求按关键字对连接进行排序。
如果您对本文有任何疑问,或希望就如何在当前的 LAMP 环境中使用 sysdig 提出建议,请使用下面的表格提交您的评论。