Sysdig: когда strace уже не хватает

каловые массыОбоссы меня Господь! Что это за каловые массы, вылетающие из анального отверстия? Это sysdig — новый проект создателей WireShark.Что это такое? Sysdig — утилита для выявления и анализа неисправностей в системе. Она может использоваться для захвата, фильтрования и декодирования системных вызовов и других системных событий.Sysdig может использоваться как в live-режиме, так и для генерации trace-файлов, которые можно будет проанализировать позже. Программа предоставляет гибкие возможности фильтрования и вывода; ее возможности могут быть расширены скриптами на языке Lua, называемыми костылями (chisels).Да у меня же есть strace, зачем мне это? Sysdig, как и strace, может следить за системными вызовами и параметрами, переданными им, но, в отличие от strace, он может следить за всеми приложениями сразу, а не каким-то отдельным, да еще и фильтровать на лету! Погрязли в отладке большого модульного приложения, модули которого не зависят друг от друга, выполняются в разных процессах и общаются между собой по TCP, или какими-нибудь пайпами? Запустили strace с неправильными фильтрами и пропустили нужный вызов? Указали недостаточно большой максимальный размер строк, пропустили информацию, а перезапускать уже поздно? Запустили strace без фильтра через ssh? strace через sshВот так можно посмотреть все файлы, которые открывает firefox:

# sysdig evt.type=open and proc.name=firefox 1328 00:13:10.432358579 3 firefox (11722) > open 1329 00:13:10.432389375 3 firefox (11722) < open fd=56(/home/valdikss/.mozilla/firefox/h2q17jj1.default/lazarus.sqlite-journal) name=/home/valdikss/.mozilla/firefox/h2q17jj1.default/lazarus.sqlite-journal flags=7(O_CREAT|O_RDWR) mode=0 1426 00:13:10.438853347 2 firefox (11722) > open 1427 00:13:10.438878719 2 firefox (11722) < open fd=64(/home/valdikss/.mozilla/firefox/h2q17jj1.default) name=/home/valdikss/.mozilla/firefox/h2q17jj1.default flags=1(O_RDONLY) mode=0 1675 00:13:10.455271307 2 firefox (11722) > open 1676 00:13:10.455328030 2 firefox (11722) < open fd=56(/home/valdikss/.mozilla/firefox/h2q17jj1.default/lazarus.sqlite-journal) name=/home/valdikss/.mozilla/firefox/h2q17jj1.default/lazarus.sqlite-journal flags=7(O_CREAT|O_RDWR) mode=0 1809 00:13:10.465610140 2 firefox (11722) > open 1810 00:13:10.465630501 2 firefox (11722) < open fd=64(/home/valdikss/.mozilla/firefox/h2q17jj1.default) name=/home/valdikss/.mozilla/firefox/h2q17jj1.default flags=1(O_RDONLY) mode=0 … Какой-то процесс нагружает сеть, а вы понятия не имеете какой? С sysdig нет ничего проще! Используем костыли topprocs_net и topconns: # sysdig -c topprocs_net Bytes Process ------------------------------ 46.03M wget 1.25KB ssh

# sysdig -c topconns Bytes Tuple ------------------------------ 46.02M 192.168.0.101:49571→5.178.80.20:80 1.25KB 192.168.0.101:51911→92.42.31.58:2222 382B 192.168.0.101:38673→173.194.71.16:993 223B 192.168.0.101:54815→192.168.0.1:53 8B 192.168.0.101:39067→54.221.254.248:80 Хотите логгировать, куда ходит root? Да пожалуйста! # sysdig -w root_chdir -p»%evt.arg.path» «evt.type=chdir and user.name=root» Потом и воспроизвести можно: # sysdig -r root_chdir … 52 22:34:03.657875235 0 (10607) < chdir res=0 path=/etc 53 22:34:03.659617658 0 (10609) > chdir 54 22:34:03.659619065 0 (10609) < chdir res=0 path=/etc/./.. 55 22:34:03.659788879 0 (10609) > chdir 56 22:34:03.659789575 0 (10609) < chdir res=0 path=/ 57 22:34:06.614860400 1 (10574) > chdir 58 22:34:06.614862341 1 (10574) < chdir res=-2(ENOENT) path=/non-existent … Посмотреть SELECT-запросы от apache к mysql? Элементарно! # sysdig -A -c echo_fds fd.sip=192.168.30.5 and proc.name=apache2 and evt.buffer contains SELECT Больше примеров

Как оно работает? Strace основывается на ptrace — системном вызове, предназначенным, в основном, для отладки, который позволяет «слушать» системные вызовы приложения.Ptrace позволяет strace останавливаться каждый раз, как приложение совершает системный вызов. Strace записывает его, декодирует и продолжает выполнение запущенной под ним программы. Таким образом, каждый раз, когда приложение совершает какой-то вызов, оно должно быть остановлено, и информация о нем должна быть передана из уровня ядра в уровень пользователя (так называемое переключение контекста). Эта операция довольно-таки медленная.Sysdig же состоит из модуля ядра (sysdig-probe), userspace-утилиты (sysdig) и 2 библиотек (libscap и libsinsp). Модуль устанавливает свой обработчик на вход и на выход системного вызова и хранит всю информацию о событиях в shared-памяти. Больше модуль ничего не делает, такой вот он простой.Все остальное на себя берут библиотеки: чтение из shared-памяти (без копирования), декодирование события, превращение пути файла в файловый дескриптор, фильтрование, Lua JIT и некоторые другие функции.Userspace-утилита, фактически, является оберткой над библиотеками.

Sysdig не тормозит. Если библиотеки не успеют выгрести данные о событиях из памяти, то они просто пропадут. Вы их потеряете, но тормозов не будет.Это ключевая особенность архитектуры sysdig. Вы можете его совершенно спокойно, не боясь, использовать в продакшене, и все будет летать, как без sysdig.

Sysdig отлично подходит для наблюдением за honeypot.

А почему не SystemTap / Dtrace? Чтобы пользоваться этими инструментами, вам нужно писать какой-то код. Все-таки, SystemTap и Dtrace больше предназначены не просто для трассировки, а для совершения каких-то действий во время трассировки, в зависимости от параметров.Использовать sysdig может совершенно любой пользователь, для его использования не нужно писать скриптов.Ссылки Сайт проектаРепозиторий на github

© Habrahabr.ru