| сохранено
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(<f>/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(<f>/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(<f>/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(<f>/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 <NA> (10607) < chdir res=0 path=/etc
53 22:34:03.659617658 0 <NA> (10609) > chdir
54 22:34:03.659619065 0 <NA> (10609) < chdir res=0 path=/etc/./..
55 22:34:03.659788879 0 <NA> (10609) > chdir
56 22:34:03.659789575 0 <NA> (10609) < chdir res=0 path=/
57 22:34:06.614860400 1 <NA> (10574) > chdir
58 22:34:06.614862341 1 <NA> (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
комментарии (2)