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

来自菜鸟教程
跳转至:导航、​搜索

介绍

sysdig 是一种全新的系统级探索和故障排除工具,它将 strace、tcpdump 和 lsof 等知名实用程序的优点结合到一个应用程序中。 而且,好像这还不够,sysdig 还提供了将系统活动保存到跟踪文件以供以后分析的功能。

此外,安装时提供了丰富的脚本库(称为 chisels),以帮助您解决常见问题或满足监控需求,从显示失败的磁盘 I/O 操作到查找文件所在的位置一个给定的进程花费了大部分时间,以及介于两者之间的所有时间。 您还可以根据需要编写自己的脚本来进一步增强 sysdig。

在本文中,我们将首先介绍 sysdig 的基本用法,然后探讨使用 sysdig 进行网络分析,包括在 CentOS 7 LAMP 服务器上审计网络流量的示例。 请注意,示例中使用的 VPS 并未承受很大的负载,但足以显示当前审计任务的基础知识。

先决条件

在开始之前,请确保您具备这些先决条件。

  • CentOS 7 水滴
  • 在您的 CentOS 7 VPS 上设置 LAMP 服务器。 说明请参考这篇文章
  • 此外,您应该有一个具有 sudo 访问权限 的非 root 用户帐户,该帐户将用于运行 sysdig

安装 sysdig

登录到您的服务器并按照以下步骤操作:

第 1 步 — 信任 Draios GPG 密钥

Draios 是 sysdig 背后的公司。

在继续安装之前,yum 将使用此密钥来验证您将要下载的软件包的真实性。

要手动将 Draios 密钥添加到您的 RPM 密钥环,请使用带有 --import 标志的 rpm 工具:

sudo rpm --import https://s3.amazonaws.com/download.draios.com/DRAIOS-GPG-KEY.public  

然后,下载 Draios 存储库并配置 yum 以使用它:

sudo 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 项目维护的高质量免费和开源软件的存储库,并且 100% c 兼容其衍生产品,例如 Red Hat Enterprise Linux 和 CentOS。 需要此存储库才能下载 sysdig 所需的动态内核模块支持 (DKMS) 包,并下载其他依赖项。

sudo yum -y install epel-release

第 3 步 — 安装内核头文件

这是必需的,因为 sysdig 将需要构建一个定制的内核模块(名为 sysdig-probe)并使用它来操作。

sudo yum -y install kernel-devel-$(uname -r)

第 4 步 — 安装 sysdig 包

现在我们可以安装 sysdig。

sudo yum -y install sysdig

第 5 步 — 以非 root 用户身份运行 sysdig

为了安全起见,最好让非 root 用户运行 sysdig。 为 sysdig 创建一个自定义组:

sudo groupadd sysdig

将一个或多个用户添加到组。 在我们的示例中,我们将添加用户 sammy

sudo usermod -aG sysdig sammy

找到 sysdig 的二进制文件:

which sysdig  

您可能会收到类似的回复

/usr/bin/sysdig

授予 sysdig 组的所有成员权限以运行 sysdig 可执行文件(仅限该二进制文件)。 编辑 /etc/sudoers

sudo visudo

在组部分中为 sysdig 组添加以下行。 在 %wheel 部分之后添加新行就可以了。 将路径替换为系统上 sysdig 的位置:

## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL

## sysdig
%sysdig ALL= /usr/bin/sysdig 

如果您在编辑 /etc/sudoers 文件时需要进一步说明,建议您查看 这篇文章

运行 sysdig

您可以在两种模式下运行 sysdig。

您可以实时查看服务器活动的实时流,也可以将系统操作记录保存到文件以供以后离线分析。

由于您很可能希望使用第二个选项,这就是我们将在此处介绍的内容。 请注意,将系统活动保存到文件时,sysdig 会拍摄操作系统的完整快照,以便在此时间间隔内服务器上发生的所有事情都可用于离线分析。

注意: 运行 sysdig 命令时,请确保每个选项前面都有一个短破折号。 复制和粘贴可能会导致单个破折号被粘贴为长破折号,因此程序无法识别的问题。

让我们运行一个基本的 sysdig 命令来捕获 1000 行服务器活动。

要将系统活动捕获到名为 act1.scap 的文件中,并将输出限制为 1000 个事件,请运行以下命令(如果要在未指定的时间段内运行 sysdig,请省略 -n 1000 部分) . -z 开关用于启用跟踪文件的压缩。

sudo sysdig -w act1.scap.gz -n 1000 -z

注意:如果上一步省略了-n开关,可以通过CTRL+C组合键中断sysdig的执行。

Chisels — sysdig 脚本概述

Chisels 是 sysdig 脚本。 要显示可用凿子的列表,我们需要运行以下命令:

sudo sysdig -cl

为了使用 sysdig 创建的跟踪文件审计我们的 CentOS 7 LAMP 服务器上的网络流量,我们将使用 Net 类别下可用的凿子:

Category: Net
-------------
iobytes_net         Show total network I/O bytes
spy_ip              Show the data exchanged with the given IP address
spy_port            Show the data exchanged using the given IP port number
topconns            top network connections by total bytes
topports_server     Top TCP/UDP server ports by R+W bytes
topprocs_net        Top processes by network I/O

可以通过以下方式查看特定凿子的进一步描述及其使用说明:

sudo sysdig -i chisel name

例如:

sudo sysdig -i spy_ip

这输出:

Category: Net
-------------
spy_ip              Show the data exchanged with the given IP address
shows 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
Args:
[ipv4] host_ip - the remote host IP address
[string] disable_color - Set to 'disable_colors' if you want to disable color output

Args 部分指示您是否需要将参数传递给凿子。 在 spy_ip 的情况下,您需要将 IP 地址作为参数传递给凿子。

审计网络流量(实际示例)

让我们通过一个实际示例来了解如何使用 sysdig 分析带宽使用情况并查看有关网络流量的详细信息。

要从该测试中获得最佳结果,您需要在服务器上设置一个虚拟 Web 表单,以便生成适当的流量。 如果这是一台全新安装 LAMP 的服务器,您可以在 /var/www/html/index.php 处制作此表格。

<body>
<form id="loginForm" name="loginForm" method="post" action="login.php">
  <table width="300" border="0" align="center" cellpadding="2" cellspacing="0">
    <tr>
      <td width="112"><b>Username:</b></td>
      <td width="188"><input name="login" type="text" class="textfield" id="login" /></td>
    </tr>
    <tr>
      <td><b>Password:</b></td>
      <td><input name="pass" type="password" class="textfield" id="pass" /></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><br />
      <input type="submit" name="Submit" value="Login" /></td></tr>
  </table>
</form>
</body>

这不是必需的,但为了使一切都整洁,您还可以创建 /var/www/html/login.php 页面:

<body>
    <p>Form submitted.</p>
</body>

警告: 测试完成后请删除此表单!

第 1 步 — 保存实时数据以供离线分析

我们将通过发出以下命令开始捕获我们的日志数据集合:

sudo sysdig -w act1.scap.gz -z -s 4096

让 sysdig 运行一段合理的时间。 您的命令提示符将在 sysdig 运行时挂起。

现在,在 Web 浏览器中访问服务器的域或 IP 地址。 您可以访问现有和不存在的页面以产生一些流量。 如果你想让这个特定的例子工作,你应该访问主页,用你喜欢的任何东西填写登录信息,然后提交登录表单几次。 此外,您也可以随意对您的 MySQL/MariaDB 数据库运行查询。

生成一些流量后,按 CTRL + C 停止 sysdig。 然后,您将准备好运行我们将在本教程后面讨论的分析查询。

在生产环境中,您可以在服务器繁忙时间启动 sysdig 数据收集。

了解过滤器:类和字段

在我们开始对 sysdig 数据进行排序之前,让我们解释一些基本的 sysdig 命令元素。

Sysdig 提供类和字段作为过滤器。 根据面向对象编程理论的类比,您可以将类视为对象,将字段视为属性。

您可以显示类和字段的完整列表:

sudo sysdig -l

在分析跟踪文件时,我们将使用类和字段来过滤输出。

第 2 步 — 使用跟踪文件执行离线分析

由于我们要审核进出 LAMP 服务器的网络流量,我们将加载跟踪文件 act1.scap.gz 并使用 sysdig 执行以下测试:

显示使用网络带宽的顶级进程列表

sudo sysdig -r act1.scap.gz -c topprocs_net

您应该会看到类似这样的输出:

Bytes     Process
------------------------------
331.68KB  httpd
24.14KB   sshd
4.48KB    mysqld

在这里您可以看到 Apache 使用的带宽最多(httpd 进程)。

根据此输出,您可以做出明智且受支持的判断调用,以决定是否需要增加可用带宽来满足您当前和未来的估计请求。 否则,您可能希望对进程可以使用的已可用带宽的最大速率设置适当的限制。

按进程显示网络使用情况

我们可能还想知道哪些 IP 正在使用 httpd 消耗的网络带宽,如前面的示例所示。

为此,我们将使用 topconns 凿子(按总字节数显示顶级网络连接)并添加一个由类 proc 和字段 name 形成的过滤器来过滤结果仅显示 http 连接。 换句话说,以下命令:

sudo sysdig -r act1.scap.gz -c topconns proc.name=httpd

这将返回到您的服务器的顶级网络连接,包括源,其中处理请求的进程是 httpd

Bytes     Proto     Conn      
------------------------------
56.24KB   tcp       111.111.111.111:12574->your_server_ip:80
51.94KB   tcp       111.111.111.111:15249->your_server_ip:80
51.57KB   tcp       111.111.111.111:27832->your_server_ip:80
51.26KB   tcp       111.111.222.222:42487->your_server_ip:80
48.20KB   tcp       111.111.222.222:42483->your_server_ip:80
48.20KB   tcp       111.111.222.222:42493->your_server_ip:80
4.17KB    tcp       111.111.111.111:13879->your_server_ip:80
3.14KB    tcp       111.111.111.111:27873->your_server_ip:80
3.06KB    tcp       111.111.222.222:42484->your_server_ip:80
3.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 地址。

sudo sysdig -r act1.scap.gz -s 4096 -A -c echo_fds fd.cip=111.111.111.111 and proc.name=httpd

您应该会看到相当多的输出,具体取决于该 IP 地址建立的连接数。 这是一个显示 404 错误的示例:

GET /hi HTTP/1.1
Host: your_server_ip
Connection: keep-alive
Cache-Control: m

------ Write 426B to 111.111.111.111:39003->your_server_ip:80

HTTP/1.1 404 Not Found
Date: Tue, 02 Dec 2014 19:38:16 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
Content-Length: 200
Keep-Alive: timeout=5, max=99
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /hi was not found on this server.</p>
</body></html>

这种类型的查询可以帮助您准确了解使用带宽最高的 IP 地址建立了哪些类型的连接。 例如,如果您发现 IP 地址非常频繁地到达某个页面,您可以使该页面的资产尽可能小,以减少带宽使用。 或者,如果流量似乎不合法,您可以创建一个新的 防火墙规则 来阻止占用带宽的 IP。

第 4 步 — 通过关键字检查与 IP 地址交换的数据

根据捕获间隔期间的服务器活动,跟踪文件可能包含相当多的事件和信息。 因此,手动查看上一节中的命令结果可能会花费不切实际的时间。 出于这个原因,我们可以在事件缓冲区中查找特定的单词。

假设我们的 Web 服务器上运行了一组 Web 应用程序,并且我们希望确保登录凭据不会以纯文本形式通过表单传递。

让我们在前面示例中使用的命令中添加一些标志:

sudo 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)。 您可以将搜索关键字更改为对您自己的应用程序有意义的关键字。

以下输出显示用户名和密码以纯文本形式从客户端传递到服务器(因此任何有足够专业知识的人都可以阅读):

------ Read 551B from 111.111.111.111:41135->your_server_ip:80

POST /login.php HTTP/1.1
Host: your_server_ip
Connection: keep-alive
Content-Length: 35
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: http://104.236.40.111
User-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
Content-Type: application/x-www-form-urlencoded
Referer: http://104.236.40.111/
Accept-Encoding: gzip,deflate
Accept-Language: en-US,en;q=0.8

login=sammy&pass=password&Submit=Login

如果您发现类似的安全漏洞,请立即通知您的开发团队。

结论

使用 sysdig 在 LAMP 服务器上审计网络流量时所能完成的工作主要受个人想象力和应用程序请求的限制。 我们已经了解了如何查找带宽最高的用户、检查来自特定 IP 的流量以及根据应用程序的请求按关键字对连接进行排序。

如果您对本文有任何其他问题,或者想了解如何在您当前的 LAMP 环境中使用 sysdig 的建议,请随时使用下面的表格提交您的评论。