Мониторинг сервера Ubuntu 16.04 с помощью Sysdig

Sysdig – это открытый комплексный инструмент для мониторинга активности системы, сбора и анализа данных. Приложение Sysdig предоставляет базовые функции мониторинга (которые можно расширить с помощью сценариев Lua) и производительный язык фильтрации с настраиваемым выводом.

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

Приложение Sysdig отслеживает только сервер, на котором оно установлено. Однако разработчики предлагают виртуализированную версию приложения, Sysdig Cloud, которая может мониторить любое количество удалённых серверов.

Приложение Sysdig доступно на большинстве дистрибутивов Linux, на также на Windows и MacOS (с ограниченной функциональностью). Кроме инструмента командной строки sysdig, приложение Sysdig также предлагает интерактивный интерфейс csysdig (с аналогичными опциями).

Данное руководство поможет установить Sysdig и настроить мониторинг сервера Ubuntu 16.04, научит сохранять события в файлы и фильтровать результат, а также ознакомит вас с интерактивным пользовательским интерфейсом csysdig.

Требования

  • Сервер Ubuntu 16.04.
  • Доступ к sudo.

Все инструкции можно найти в руководстве по начальной настройке сервера.

1: Установка Sysdig

В репозитории Ubuntu можно найти пакет Sysdig, но он содержит устаревшую версию; на данный момент репозиторий предлагает версию 0.8.0. Чтобы получить более новую версию приложения, используйте официальный сценарий, который можно найти на сайте проекта.

Обновите индекс пакетов:

sudo apt-get update

Теперь загрузите установочный сценарий Sysdig:

curl https://s3.amazonaws.com/download.draios.com/stable/install-sysdig -o install-sysdig

Эта команда загрузит сценарий в текущий каталог, в файл install-sysdig. Прежде чем запустить любой сценарий, загруженный из интернета, просмотрите его содержимое с помощью команды less:

less ./install-sysdig

Убедившись, что сценарий не причинит вреда системе, запустите его с расширенными привилегиями.

cat ./install-sysdig | sudo bash

Команда установит все зависимости, включая заголовки ядра и модули. На экране появится вывод:

* Detecting operating system
* Installing Sysdig public key
OK
* Installing sysdig repository
* Installing kernel headers
* Installing sysdig
...
sysdig-probe:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/4.4.0-59-generic/updates/dkms/
depmod....
DKMS: install completed.
Processing triggers for libc-bin (2.23-0ubuntu5) ...

2: Мониторинг системы в реальном времени

Теперь нужно настроить мониторинг сервера Ubuntu 16.04 с помощью команды sysdig.

Для запуска команды sysdig необходимы права root. Запущенная без аргументов команда выдаст состояние системы в режиме реального времени. Данные будут обновляться каждые две секунды.

sudo sysdig

Однако такие данные сложно проанализировать, поскольку приложение постоянно обновляет их, а на сервере происходит много событий. Чтобы остановить sysdig, нажмите CTRL + C.

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

253566 11:16:42.808339958 0 sshd (12392) > rt_sigprocmask
253567 11:16:42.808340777 0 sshd (12392) < rt_sigprocmask
253568 11:16:42.808341072 0 sshd (12392) > rt_sigprocmask
253569 11:16:42.808341377 0 sshd (12392) < rt_sigprocmask
253570 11:16:42.808342432 0 sshd (12392) > clock_gettime
253571 11:16:42.808343127 0 sshd (12392) < clock_gettime
253572 11:16:42.808344269 0 sshd (12392) > read fd=10(<f>/dev/ptmx) size=16384
253573 11:16:42.808346955 0 sshd (12392) < read res=2 data=..

Вывод состоит из таких столбцов:

%evt.num %evt.outputtime %evt.cpu %proc.name (%thread.tid) %evt.dir %evt.type %evt.info

Рассмотрим каждый столбец:

  • evt.num: порядковый номер события (по возрастанию).
  • evt.outputtime: метка времени события (можно настраивать).
  • evt.cpu: количество CPU, на котором было зафиксировано событие (в приведённом выше примере evt.cpu содержит 0, что указывает на первое событие сервера).
  • proc.name: имя процесса, который сгенерировал событие.
  • thread.tid: ID потока, сгенерировавшего событие (совпадает с PID в случае однопоточных процессов).
  • evt.dir: направление событий (> – события входа, < – событие выхода).
  • evt.type: название события (open, read, write и т.п.).
  • evt.info: список аргументов события. Аргументы системных вызовов, как правило, указываются полностью, но в отдельных случаях некоторые аргументы исключаются для простоты.

Команда sysdig без аргументов не очень производительна: она собирает слишком мало информации. Аргументы команды указываются в таком порядке:

sudo sysdig [option] [filter]

Чтобы просмотреть список доступных фильтров, введите:

sysdig -l

Команда выведет обширный список фильтров, включающий несколько классов, или категорий. Вот некоторые из классов:

  • fd: фильтрует информацию дескрипторов.
  • process: фильтрует данные процессов (например, id и имя процесса, сгенерировавшего событие).
  • evt: фильтрует данные событий (например, по номеру и времени).
  • user: фильтрует данные пользователей (id, имя пользователя, домашний каталог).
  • group: фильтрует информацию групп.
  • syslog: фильтрует системные логи.
  • fdlist: фильтрует опросы (poll event)

Для примера попробуем использовать пару фильтров. Можно начать с фильтра syslog.severity.str из класса syslog, который позволяет просматривать сообщения, отправленные в лог, фильтруя их по уровню приоритетности. Эта команда выведет сообщения лога уровня information:

sudo sysdig syslog.severity.str=info

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

Чтобы остановить команду, нажмите CTRL+C.

Вывод команды довольно просто интерпретировать. Он выглядит примерно так:

10716 03:15:37.111266382 0 sudo (26322) < sendto syslog sev=info msg=Jan 24 03:15:37 sudo: pam_unix(sudo:session): session opened for user root b
618099 03:15:57.643458223 0 sudo (26322) < sendto syslog sev=info msg=Jan 24 03:15:57 sudo: pam_unix(sudo:session): session closed for user root
627648 03:16:23.212054906 0 sudo (27039) < sendto syslog sev=info msg=Jan 24 03:16:23 sudo: pam_unix(sudo:session): session opened for user root b
629992 03:16:23.248012987 0 sudo (27039) < sendto syslog sev=info msg=Jan 24 03:16:23 sudo: pam_unix(sudo:session): session closed for user root
639224 03:17:01.614343568 0 cron (27042) < sendto syslog sev=info msg=Jan 24 03:17:01 CRON[27042]: pam_unix(cron:session): session opened for user
639530 03:17:01.615731821 0 cron (27043) < sendto syslog sev=info msg=Jan 24 03:17:01 CRON[27043]: (root) CMD (   cd / && run-parts --report /etc/
640031 03:17:01.619412864 0 cron (27042) < sendto syslog sev=info msg=Jan 24 03:17:01 CRON[27042]: pam_unix(cron:session): session closed for user

Также вы можете отфильтровать один процесс. К примеру, чтобы просмотреть события, сгенерированные редактором nano, можно запустить:

sudo sysdig proc.name=nano

Если раньше вы не использовали nano, откройте ещё один терминал, а затем откройте в нём файл с помощью редактора nano. Добавьте в него несколько символов, сохраните и закройте файл. Затем вернитесь в первый терминал, чтобы просмотреть вывод команды.

21840 11:26:33.390634648 0 nano (27291) < mmap res=7F517150A000 vm_size=8884 vm_rss=436 vm_swap=0
21841 11:26:33.390654669 0 nano (27291) > close fd=3(<f>/lib/x86_64-linux-gnu/libc.so.6)
21842 11:26:33.390657136 0 nano (27291) < close res=0
21843 11:26:33.390682336 0 nano (27291) > access mode=0(F_OK)
21844 11:26:33.390690897 0 nano (27291) < access res=-2(ENOENT) name=/etc/ld.so.nohwcap
21845 11:26:33.390695494 0 nano (27291) > open
21846 11:26:33.390708360 0 nano (27291) < open fd=3(<f>/lib/x86_64-linux-gnu/libdl.so.2) name=/lib/x86_64-linux-gnu/libdl.so.2 flags=4097(O_RDONLY|O_CLOEXEC) mode=0
21847 11:26:33.390710510 0 nano (27291) > read fd=3(<f>/lib/x86_64-linux-gnu/libdl.so.2) size=832

Чтобы остановить команду, нажмите CTRL+C.

Просмотр событий в режиме реального времени – не всегда продуктивный метод работы с sysdig. Ознакомимся с другими методами.

3: Сбор информации о работе системы в файл

Собирая события системы в файл с помощью sysdig, вы получаете возможность в дальнейшем проанализировать их. Чтобы инструмент sysdig регистрировал события в файле, добавьте опцию –w и укажите имя целевого файла.

sudo sysdig -w sysdig-trace-file.scap

Sysdig будет сохранять события в этом файле, пока вы не нажмете CTRL+C. Со временем файл может стать довольно большим. С помощью опции -n, вы можете ограничить количество событий, которое может храниться в этом файле. После того как Sysdig поместит в него указанное количество событий, команда остановится. Например, чтобы сохранить 300 событий, нужно ввести:

sudo sysdig -n 300 -w sysdig-file.scap

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

К примеру, чтобы собрать события в файлы с максимальным объемом в 1Мб и сохранить только последние пять файлов это настраивается с помощью опции –W), нужно ввести команду:

sudo sysdig -C 1 -W 5 -w sysdig-trace.scap

Запросите список файлов с помощью команды ls -l sysdig-trace*, и вы увидите такой вывод:

-rw-r--r-- 1 root root 985K Nov 23 04:13 sysdig-trace.scap0
-rw-r--r-- 1 root root 952K Nov 23 04:14 sysdig-trace.scap1
-rw-r--r-- 1 root root 985K Nov 23 04:13 sysdig-trace.scap2
-rw-r--r-- 1 root root 985K Nov 23 04:13 sysdig-trace.scap3
-rw-r--r-- 1 root root 985K Nov 23 04:13 sysdig-trace.scap4

Как и в случае с данными в реальном времени, вы можете применять к собранным данным фильтры. К примеру, чтобы сохранить 200 событий процесса nano, нужно ввести:

sudo sysdig -n 200 -w sysdig-trace-nano.scap proc.name=nano

Перейдите в другой терминал, откройте в nano файл и сгенерируйте какие-нибудь события, сохраните и закройте файл. События будут регистрироваться в sysdig-trace-nano.scap, пока sysdig не соберёт 200 событий.

Также вы можете собирать только определённые события; например, события write:

sudo sysdig -w sysdig-write-events.scap evt.type=write

Чтобы остановить команду, нажмите CTRL+C.

4: Анализ собранных данных

Чтобы отобразить собранные данные на экране, используйте опцию –r:

sudo sysdig -r sysdig-trace-file.scap

Эта команда выведен на экран всё содержимое файла, а это не лучший вариант, если данных в файле очень много. К счастью, тут вы тоже можете использовать фильтры.

К примеру, чтобы выбрать из файла только события определённого типа (например, write), нужно ввести:

sysdig -r sysdig-trace-nano.scap evt.type=write
21340 13:32:14.577121096 0 nano (27590) < write res=1 data=.
21736 13:32:17.378737309 0 nano (27590) > write fd=1 size=23
21737 13:32:17.378748803 0 nano (27590) < write res=23 data=#This is a test file..#
21752 13:32:17.611797048 0 nano (27590) > write fd=1 size=24
21753 13:32:17.611808865 0 nano (27590) < write res=24 data= This is a test file..#
21768 13:32:17.992495582 0 nano (27590) > write fd=1 size=25
21769 13:32:17.992504622 0 nano (27590) < write res=25 data=TThis is a test file..# T
21848 13:32:18.338497906 0 nano (27590) > write fd=1 size=25
21849 13:32:18.338506469 0 nano (27590) < write res=25 data=hThis is a test file..[5G
21864 13:32:18.500692107 0 nano (27590) > write fd=1 size=25
21865 13:32:18.500714395 0 nano (27590) < write res=25 data=iThis is a test file..[6G
21880 13:32:18.529249448 0 nano (27590) > write fd=1 size=25
21881 13:32:18.529258664 0 nano (27590) < write res=25 data=sThis is a test file..[7G
21896 13:32:18.620305802 0 nano (27590) > write fd=1 size=25

Теперь давайте рассмотрим содержимое файла sysdig-write-events.scap, который хранит только события write.

sudo sysdig -r sysdig-write-events.scap evt.type=write

Если во время сбора данных на сервере была замечена активность SSH, вывод будет примерно таким:

42585 19:58:03.040970004 0 gmain (14818) < write res=8 data=........
42650 19:58:04.279052747 0 sshd (22863) > write fd=3(<4t>11.11.11.11:43566->22.22.22.22:ssh) size=28
42651 19:58:04.279128102 0 sshd (22863) < write res=28 data=.8c..jp...P........s.E<...s.
42780 19:58:06.046898181 0 sshd (12392) > write fd=3(<4t>11.11.11.11:51282->22.22.22.22:ssh) size=28
42781 19:58:06.046969936 0 sshd (12392) < write res=28 data=M~......V.....Z...\..o...N..
42974 19:58:09.338168745 0 sshd (22863) > write fd=3(<4t>11.11.11.11:43566->22.22.22.22:ssh) size=28
42975 19:58:09.338221272 0 sshd (22863) < write res=28 data=66..J.._s&U.UL8..A....U.qV.*
43104 19:58:11.101315981 0 sshd (12392) > write fd=3(<4t>11.11.11.11:51282->22.22.22.22:ssh) size=28
43105 19:58:11.101366417 0 sshd (12392) < write res=28 data=d).(...e....l..D.*_e...}..!e
43298 19:58:14.395655322 0 sshd (22863) > write fd=3(<4t>11.11.11.11:43566->22.22.22.22:ssh) size=28
43299 19:58:14.395701578 0 sshd (22863) < write res=28 data=.|.o....\...V...2.$_...{3.3|
43428 19:58:16.160703443 0 sshd (12392) > write fd=3(<4t>11.11.11.11:51282->22.22.22.22:ssh) size=28
43429 19:58:16.160788675 0 sshd (12392) < write res=28 data=..Hf.%.Y.,.s...q...=..(.1De.
43622 19:58:19.451623249 0 sshd (22863) > write fd=3(<4t>11.11.11.11:43566->22.22.22.22:ssh) size=28
43623 19:58:19.451689929 0 sshd (22863) < write res=28 data=.ZT^U.pN....Q.z.!.i-Kp.o.y..
43752 19:58:21.216882561 0 sshd (12392) > write fd=3(<4t>11.11.11.11:51282->22.22.22.22:ssh) size=28

Обратите внимание: все строки в этом выводе содержат 11.11.11.11:51282->22.22.22.22:ssh. Это события, поступающие с внешнего IP (11.11.11.11) на IP-адрес сервера (22.22.22.22). Они происходили по соединению SSH, потому это ожидаемый результат. А есть ли на сервере другие события write, поступившие по SSH от другого IP-адреса? Это можно узнать.

Sysdig предоставляет множество операторов сравнения: !=, >, >=, < и <=.

Следующая команда фильтрует удалённые IP-адреса с помощью fd.rip. Оператор != будет искать события, которые поступили не от IP-адреса 11.11.11.11.

sysdig -r sysdig-write-events.scap fd.rip!=11.11.11.11

Команда сообщит о других клиентских IP-адресах, сгенерировавших события write.

294479 21:47:47.812314954 0 sshd (28766) > read fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) size=1
294480 21:47:47.812315804 0 sshd (28766) < read res=1 data=T
294481 21:47:47.812316247 0 sshd (28766) > read fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) size=1
294482 21:47:47.812317094 0 sshd (28766) < read res=1 data=Y
294483 21:47:47.812317547 0 sshd (28766) > read fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) size=1
294484 21:47:47.812318401 0 sshd (28766) < read res=1 data=.
294485 21:47:47.812318901 0 sshd (28766) > read fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) size=1
294486 21:47:47.812320884 0 sshd (28766) < read res=1 data=.
294487 21:47:47.812349108 0 sshd (28766) > fcntl fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) cmd=4(F_GETFL)
294488 21:47:47.812350355 0 sshd (28766) < fcntl res=2(<f>/dev/null)
294489 21:47:47.812351048 0 sshd (28766) > fcntl fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) cmd=5(F_SETFL)
294490 21:47:47.812351918 0 sshd (28766) < fcntl res=0(<f>/dev/null)
294554 21:47:47.813383844 0 sshd (28767) > write fd=3(<4t>33.33.33.33:49802->22.22.22.22:ssh) size=976
294555 21:47:47.813395154 0 sshd (28767) < write res=976 data=........zt.....L.....}....curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-s
294691 21:47:48.039025654 0 sshd (28767) > read fd=3(<4t>221.229.172.117:49802->45.55.71.190:ssh) size=8192

Теперь давайте посмотрим, как анализировать данные с помощью дополнительных сценариев.

5: Дополнительные сценарии для мониторинга и анализа

Sysdig использует сценарии Lua (так называемые chisels) для анализа потока событий и расширения функционала. Вместе с Sysdig поставляется около 50 сценариев. Чтобы просмотреть список доступных сценариев, введите:

sysdig -cl

Наиболее полезными являются:

  • netstat:создает список сетевых подключений (и при необходимости фильтрует его).
  • shellshock_detect: выводит атаки Shellshock.
  • spy_users: отображает интерактивные действия пользователей.
  • listloginshells: собирает ID оболочек.
  • spy_ip: отображает данные, переданные определённому IP.
  • spy_port: отображает данные, переданные по определённому порту.
  • spy_file: отслеживает события read и write в файлах (опционально можно указать имя файла, который нужно отслеживать).
  • httptop: отображает запросы HTTP.

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

sysdig -i name

К примеру, чтобы получить справку о netstat:

sysdig -i netstat

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

sudo sysdig -c netstat

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

Proto Server Address           Client Address           State          TID/PID/Program Name
tcp   22.22.22.22:22           11.11.11.11:60422        ESTABLISHED    15567/15567/sshd
tcp   0.0.0.0:22               0.0.0.0:*                LISTEN         1613/1613/sshd

Если в выводе есть соединения с пометкой ESTABLISHED от IP-адресов, которые не входят в Client Address, вам следует рассматривать такое подключение как потенциально опасное и исследовать его подробнее.

Сценарий spy_users позволяет отследить интерактивные действия пользователей.

sudo sysdig -c spy_users

Затем откройте второй терминал и подключитесь к серверу. Выполните несколько команд, а затем вернитесь в первый терминал. В нём вы увидите все выполненные только что команды.

6: Использование csysdig

Csysdig – это ещё одна утилита, которая поставляется с Sysdig. Она предоставляет интерактивный пользовательский интерфейс, который предлагает те же функции, что и утилита sysdig. Утилита csysdig похожа на top, htop и strace, но она предлагает больше функций.

Как и sysdig, команда csysdig может отслеживать данные в режиме реального времени и собирать события в файлы. Но csysdig предоставляет более удобную визуализацию данных в реальном времени (данные обновляются каждые 2 секунды).

sudo csysdig

Команда без аргументов откроет интерфейс, который показывает события, генерируемые всеми пользователями и приложениями на отслеживаемом хосте.

В нижней части интерфейса можно найти несколько кнопок. Кнопка Views управляет отображением метрик, собранных csysdig. Всего доступно 29 видов (Processes, System Calls, Threads, Containers, Processes CPU, Page Faults, Files, Directories и т.д.).

Без аргументов команда использует вид Processes.

Чтобы просмотреть список доступных видов, нажмите Views или F2. Чтоб просмотреть описание столбцов, нажмите Legend или F7. Чтобы получить справку, нажмите Help или F1.

Примечание: Для каждой кнопки есть соответствующая горячая клавиша или комбинация клавиш на клавиатуре (в интерфейсе они указываются слева от кнопки). Чтобы вернуться к предыдущему окну, нажмите ESC или дважды нажмите горячую клавишу.

Общий синтаксис csysdig:

sudo csysdig [option]...  [filter]

Опция –d настраивает интервал между обновлениями в миллисекундах. Например, чтобы вывод csysdig обновлялся каждые 10 секунд (а не через 2 секунды, как по умолчанию), нужно ввести следующую команду:

sudo csysdig -d 10000

Чтобы исключить из вывода информацию о пользователе и группе, используйте опцию –Е.

sudo csysdig -E

Так csysdig будет работать немного быстрее.

Чтобы ограничить количество собираемых событий, используйте опцию –n. Приложение остановится, как только предел будет достигнут. Число собранных событий должно быть пятизначным; иначе вы даже не сможете увидеть UI:

sudo csysdig -n 100000

Чтобы проанализировать файл, используйте опцию –r:

sudo csysdig -r sysdig-trace-file.scap

Утилиты sysdig и csysdig используют одни и те же фильтры. К примеру, вы можете отфильтровать вывод по пользователям и запросить события только пользователя root.

sudo csysdig user.name=root

Чтобы просмотреть вывод исполняемого файла, генерирующего события, передайте фильтру имя бинарного файла (без пути). Например:

sudo csysdig proc.name=nano

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

sudo csysdig -l

Как видите, это та же опция, что используется в sysdig.

Утилиты sysdig и csysdig очень похожи. Главное их различие в том, что csysdig предоставляет удобный и дружественный интерфейс.

Чтобы остановить csysdig, нажмите на клавиатуре Q.

Заключение

Приложение Sysdig позволяет отслеживать события и устранять неполадки на сервере. Кроме того, приложение может отслеживать активность контейнеров (данный вопрос не рассматривается в этом руководстве). Больше информации о Sysdig можно найти на сайте проекта.

Сценарии Sysdig позволяют расширить стандартный функционал приложения. Они написаны ан языке Lua, потому вы можете в любой момент отредактировать сценарий или написать свой собственный. Больше о сценариях можно узнать здесь.

Tags: , ,

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