如何在 CentOS 7 上使用 sysdig 审计 LAMP 服务器中的网络流量

简介

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>&nbsp;</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 提出建议,请使用下面的表格提交您的评论。

Published At
Categories with 技术
comments powered by Disqus