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