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

Вступление

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

Кроме того, вместе с установкой предоставляется обширная библиотека сценариев (называемая chisels), чтобы помочь вам решить распространенные проблемы или удовлетворить потребности в мониторинге, от отображения неудачных операций ввода-вывода на диске до поиска файлов, на которые данный процесс потратил больше всего. время и все что между Вы также можете написать свои собственные сценарии для дальнейшего улучшения sysdig в соответствии с вашими потребностями.

В этой статье мы сначала познакомимся с базовым использованием sysdig, а затем исследуем анализ сети с помощью sysdig, включая пример аудита сетевого трафика на сервере CentOS 7 LAMP. Обратите внимание, что используемый в примерах VPS не подвергался значительной нагрузке, но этого достаточно для демонстрации основ текущих задач аудита.

Предпосылки

Прежде чем начать, пожалуйста, убедитесь, что у вас есть эти предпосылки.

  • CentOS 7 Капли

  • Настройте сервер LAMP на вашем CentOS 7 VPS. Пожалуйста, обратитесь к th article для получения инструкций

  • Кроме того, у вас должна быть учетная запись пользователя без полномочий root с sudo доступ, который будет использоваться для запуска sysdig

Установка sysdig

Войдите на свой сервер и выполните следующие действия:

Шаг 1 - Доверьтесь ключу Draios GPG

Draios - это фирма, которая стоит за sysdig.

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

Чтобы вручную добавить ключ Draios в вашу связку ключей RPM, используйте инструмент + rpm + с флагом + - import +:

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% совместимо с его дополнительными продуктами, такими как Red Hat Enterprise Linux и CentOS. Этот репозиторий необходим для загрузки пакета поддержки динамического модуля ядра (DKMS), который необходим sysdig, и для загрузки других зависимостей.

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 - Запустите sysdig от имени пользователя без полномочий root

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

sudo groupadd sysdig

Добавьте одного или нескольких пользователей в группу. В нашем примере мы добавим пользователя * sammy *.

sudo usermod -aG sysdig

Найдите двоичный файл для sysdig:

which sysdig

Вы можете получить ответ как

Дайте всем членам группы * sysdig * привилегии для запуска исполняемого файла + sysdig + (и только для этого двоичного файла). Отредактируйте + / etc / sudoers + с помощью:

sudo visudo

Добавьте следующие строки для группы * sysdig * в разделе групп. Добавление новых строк после раздела +% wheel + - это нормально. Замените путь с расположением sysdig в вашей системе:

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

## sysdig
%sysdig ALL=

Если вам нужны дополнительные разъяснения по редактированию файла + / etc / sudoers +, рекомендуется взглянуть на https://www.digitalocean.com/community/tutorials/how-to-add-and-delete- Пользователи на сервере Centos 7 [эта статья].

Запуск sysdig

Вы можете запустить sysdig в двух режимах.

Вы можете в реальном времени просматривать поток активности сервера или сохранять записи системных операций в файл для последующего анализа в автономном режиме.

Поскольку вы, скорее всего, захотите использовать второй вариант, мы рассмотрим его здесь. Обратите внимание, что при сохранении активности системы в файл sysdig делает полный снимок операционной системы, поэтому все, что происходит на вашем сервере в течение этого интервала времени, будет доступно для автономного анализа.

_ * Примечание: * Когда вы запускаете команды sysdig, убедитесь, что перед каждым параметром стоит один короткий дефис. Копирование и вставка могут вызвать проблему, при которой один штрих вставляется как длинный штрих и поэтому не распознается программой. _

Давайте запустим простую команду sysdig для захвата 1000 строк активности сервера.

Чтобы записать системную активность в файл с именем + act1.scap + и ограничить вывод до 1000 событий, выполните следующую команду (пропустите часть + -n 1000 +, если вы хотите запустить sysdig в течение неопределенного периода времени ). Ключ + -z + используется для включения сжатия файла трассировки.

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

_ * Примечание: * Если вы пропустили переключатель на последнем шаге, вы можете прервать выполнение sysdig, нажав комбинацию клавиш CTRL + C. _

Стамески - Обзор скриптов sysdig

Chisels - это скрипты sysdig. Чтобы отобразить список доступных долот, нам нужно выполнить следующую команду:

sudo sysdig -cl

Для аудита сетевого трафика на нашем сервере CentOS 7 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

Например:

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 +: выводить только текстовую часть буферов данных и выводить конец строки (мы хотим отображать только данные, читаемые человеком)

Вот команда. Обязательно замените ++ на IP-адрес клиента из предыдущего вывода.

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

Вы должны увидеть довольно много выходных данных, в зависимости от количества соединений, сделанных этим IP-адресом. Вот пример, показывающий ошибку 404:

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

------ Write 426B to :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-адрес очень часто достигает определенной страницы, вы можете сделать ресурсы этой страницы как можно меньше, чтобы уменьшить использование полосы пропускания. Или, если трафик не выглядит законным, вы можете создать новое firewall rule, чтобы заблокировать пропускную способность IP-адрес.

Шаг 4 - Изучение данных, которыми обмениваются с IP-адресом по ключевому слову

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

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

Давайте добавим несколько флагов к команде, использованной в предыдущем примере:

sudo sysdig -r act1.scap.gz -A -c echo_fds fd.ip= and proc.name=httpd and evt.is_io_read=true and evt.buffer contains

Здесь класс + evt + вместе с полем + is_io_read + позволяют нам проверять только события чтения (с точки зрения сервера). Кроме того, + evt.buffer + позволяет нам искать определенное слово в буфере событий (слово «++» в данном случае). Вы можете изменить ключевое слово поиска на то, которое имеет смысл для ваших собственных приложений.

Следующий вывод показывает, что имя пользователя и пароль передаются от клиента к серверу в виде простого текста (таким образом, становится доступным для чтения любому, кто обладает достаточным опытом):

------ Read 551B from :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=&pass=&Submit=Login

Если вы обнаружите похожую дыру в безопасности, немедленно сообщите об этом вашей команде разработчиков.

Заключение

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

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

Related