Аудит сетевого трафика LAMP с помощью sysdig в CentOS 7

sysdig – это новый инструмент для отслеживания и устранения неполадок, который сочетает в себе преимущества таких утилит, как strace, tcpdump и lsof. Кроме того, sysdig предоставляет возможность сохранять активность системы в трассировочные файлы для дальнейшего анализа.

Также вместе с установкой sysdig поставляется большая библиотека сценариев chisels, которая поможет устранить общие неполадки или настроить мониторинг. Вы можете создавать свои собственные сценарии для sysdig.

Данная статья поможет провести анализ сети с sysdig на примере стека LAMP на сервере CentOS 7.

Примечание: В данном руководстве использован сервер VPS с низкой нагрузкой.

Требования

  • Сервер CentOS 7
  • Предварительно установленный стек LAMP (инструкции можно найти по этой ссылке).
  • Пользователь с доступом к sudo.

Установка sysdig

1: Получение GPG-ключа Draios

Пакетный менеджер yum сможет использовать этот ключ для подтверждения подлинности пакета.

Чтобы добавить ключ Draios вручную, используйте:

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

EPEL (или Extra Packages for Enterprise Linux) – это поддерживаемый компанией Fedora репозиторий качественных дополнительных пакетов и открытого ПО для Red Hat Enterprise Linux и CentOS. В этом репозитории хранится пакет Dynamic Kernel Module Support (DKMS) и некоторые другие зависимости текущей установки.

sudo yum -y install epel-release

3: Установка заголовков ядра

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

4: Установка sysdig

Примечание: Из соображений безопасности рекомендуется использовать для установки и запуска инструмента sysdig учётную запись не-root пользователя.

Создайте группу для sysdig:

sudo groupadd sysdig

Добавьте в группу пользователей:

sudo usermod -aG sysdig 8host

Запросите полный путь к бинарному файлу инструмента:

which sysdig

Команда вернёт:

/usr/bin/sysdig

Передайте всем членам группы sysdig право на запуск исполняемого файла sysdig. Откройте /etc/sudoers:

sudo visudo

Добавьте в раздел groups настойки для группы sysdig (после %wheel).

## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL
## sysdig
%sysdig ALL= /usr/bin/sysdig

Укажите правильный путь к sysdig.

Примечание: Подробнее о файле /etc/sudoers – в этой статье.

Использование sysdig

Инструмент sysdig работает в двух режимах.

Он позволяет просматривать стрим активности сервера в режиме реального времени или сохранять записи системных операций для дальнейшего анализа.

Вторая опция пользуется большой популярностью. Обратите внимание: сохраняя активность сервера в файл, sysdig создаёт полную моментальную копию операционной системы.

Примечание: В командах sysdig все опции нужно начинать с одного короткого тире. Во время операций копирования и вставки короткие тире могут быть автоматически заменены на длинные.

Попробуйте запустить стандартную команду sysdig, чтобы сохранить 1000 строк активности сервера.

Следующая команда сохранит данные об активности системы в act1.scap и ограничит вывод до 1000 событий:

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

Чтобы убрать ограничение количества событий, удалите флаг -n 1000. Опция –z включает сжатие файла трассировки.

Примечание: Чтобы остановить sysdig, используйте клавиши CTRL + C.

Библиотека Chisels: обзор скриптов sysdig

Библиотека Chisels хранит скрипты для sysdig. Чтобы открыть список доступных скриптов, запустите команду:

sudo sysdig -cl

Для аудита сетевого трафика LAMP при помощи файла трассировки sysdig понадобятся сценарии категории 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 может анализировать использование пропускной способности и предоставлять подробные данные о сетевом трафике.

Чтобы тест дал наилучший результат, поместите на сайте фиктивную форму, при помощи которой будет генерироваться необходимый трафик. На сервере 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.

Посетите домен или 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-адреса в выводе указывает не номер порта, а количество событий, сохранённых sysdig.

3: Анализ обмена данными между определённым IP-адресом и Apache

Теперь нужно подробно изучить связи между определённым IP-адресом и веб-сервером Apache.

Сценарий echo_fds позволяет отображать данные, прочитанные и записанные процессами. Указав имя процесса и клиентский IP (например, proc.name=httpd и fd.cip=111.111.111.111), вы можете получить данные, которыми обменялись сервер LAMP и указанный IP.

Кроме того, при помощи следующих флагов можно получить удобочитаемый вывод:

  • -s 4096: читать из буфера до 4096 байт для каждого события; также этот флаг позволяет задать количество байт из каждого буфера, которое нужно сохранить на диск при сборе данных в трассировочный файл.
  • -A: отображать только текст из буфера (чтобы получить удобочитаемый вывод).

Команда будет выглядеть так:

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

Примечание: Замените условный IP-адрес IP-адресом клиента.

Объём вывода зависит от количества соединений, созданных указанным 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: Анализ обмена данными по ключевым словам

В зависимости от активности сервера в период сбора данных, трассировочный файл может содержать огромное количество событий и данных. Потому анализ результатов предыдущей команды может занять слишком много времени. В таком случае рекомендуется искать в буфере событий определённые слова.

Предположим, у вас есть набор приложений, работающих на веб-сервере, и вы хотите убедиться, что учётные данные, введённые в форму, передаются не простым текстом, а в зашифрованном виде.

Для этого в предыдущую команду нужно добавить несколько флагов:

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).

Примечание: Замените условное ключевое слово 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=8host&pass=password&Submit=Login

Обнаружив подобную уязвимость в безопасности приложения, следует немедленно принять соответствующие меры.

Заключение

Итак, вы выполнили аудит сетевого трафика сервера LAMP при помощи инструмента sysdig. Теперь вы умеете определять процессы, использующие основную часть пропускной способности, изучать трафик от конкретного IPадреса, сортировать соединения по ключевым словам.

Tags: , , ,

Добавить комментарий