Во-первых, создание процесса редко является полезным событием для регистрации, и это не имеет никакого значения для безопасности (за исключением ограничения ресурсов). Я думаю, вы имеете в виду подцепление выполнения программ, что делается с помощью execve
, а не fork
.
Во-вторых, для тех случаев использования, которые вы приводите, обычно лучше использовать существующие механизмы, созданные для этих целей, а не создавать свои собственные.
auditctl
man есть примеры; как я объяснял выше, системный вызов, который вы хотите протоколировать, это execve
). Если вы хотите изменить то, как одна конкретная программа вызывает другие программы, не влияя на поведение других программ, есть два случая: либо программа потенциально враждебна, либо нет.
PATH
. Если программа использует абсолютные пути, которые нелегко настроить, в неантикварной системе Linux вы можете запустить ее в отдельном mount namespace (см. также kernel: Namespaces support). Если вам действительно нужен тонкий контроль, вы можете загрузить библиотеку, которая отменяет некоторые библиотечные вызовы, вызвав программу с помощью LD_PRELOAD=my_override_library.so theprogram
. Пример см. в Перенаправление дескриптора файла перед выполнением. Обратите внимание, что в дополнение к execve
, вам нужно будет переопределить все функции библиотеки C, которые вызывают execve
внутри библиотеки, потому что LD_PRELOAD
не влияет на внутренние вызовы библиотеки C. Вы можете получить более точный контроль, запустив программу под ptrace
; это позволит вам отменить системный вызов, даже если он сделан функцией библиотеки C, но это сложнее настроить (я не знаю ни одного простого способа сделать это). Итак, после дополнительного расследования и просмотра журналов nginx выяснилось, что проблема была в SELinux. Выполнение шагов вhttp://alfredoroca.github.io/nginx/selinux/2017/03/13/Allowing-Nginx-to-use-a-Puma-Unicorn-UNIX-socket-with-SELinuxустранило проблему. Я опубликую их ниже для полноты.
$ sudo grep nginx /var/log/audit/audit.log | audit2allow -m nginx > nginx.te
$ cat nginx.te
# cat output
# require {
# type unconfined_t;
# type httpd_t;
# type httpd_sys_content_t;
# class sock_file write;
# class unix_stream_socket connectto;
# class capability2 block_suspend;
# }
#
# ============= httpd_t ==============
# allow httpd_t httpd_sys_content_t:sock_file write;
# allow httpd_t self:capability2 block_suspend;
# allow httpd_t unconfined_t:unix_stream_socket connectto;
$ checkmodule -M -m -o nginx.mod nginx.te
$ semodule_package -o nginx.pp -m nginx.mod
$ sudo semodule -i nginx.pp
$ sudo systemctl restart nginx