СоХабр закрыт.

С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.

| сохранено

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(<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)

0
evnuh ,   * (был изменён)

Ну зачем ты добавил «на картинке выше»? Так стало очевидно и не смешно :(

0
ValdikSS ,  

Вернул обратно ;)