ProxyPass на Nginx не работает должным образом

Во-первых, создание процесса редко является полезным событием для регистрации, и это не имеет никакого значения для безопасности (за исключением ограничения ресурсов). Я думаю, вы имеете в виду подцепление выполнения программ, что делается с помощью execve, а не fork.

Во-вторых, для тех случаев использования, которые вы приводите, обычно лучше использовать существующие механизмы, созданные для этих целей, а не создавать свои собственные.

  • Для ведения журнала BSD process accounting предоставляет небольшое количество информации и доступен в большинстве вариантов Unix; в Linux установите GNU accounting utilities (установите пакет из вашего дистрибутива). Для более сложного протоколирования в Linux вы можете использовать подсистему аудита (на странице auditctl man есть примеры; как я объяснял выше, системный вызов, который вы хотите протоколировать, это execve).
  • Если вы хотите применить ограничения безопасности к определенным программам, используйте структуру безопасности, такую как SELinux или AppArmor.
  • Если вы хотите запустить определенную программу в контейнере или с определенными настройками, переместите исполняемый файл и поставьте на его место сценарий-обертку, который установит нужные вам настройки и вызовет исходный исполняемый файл.

Если вы хотите изменить то, как одна конкретная программа вызывает другие программы, не влияя на поведение других программ, есть два случая: либо программа потенциально враждебна, либо нет.

  • Если программа потенциально враждебна, запустите ее в специальной виртуальной машине.
  • Если программа кооперативна, наиболее очевидный угол атаки - запустить ее с другим PATH. Если программа использует абсолютные пути, которые нелегко настроить, в неантикварной системе Linux вы можете запустить ее в отдельном mount namespace (см. также kernel: Namespaces support). Если вам действительно нужен тонкий контроль, вы можете загрузить библиотеку, которая отменяет некоторые библиотечные вызовы, вызвав программу с помощью LD_PRELOAD=my_override_library.so theprogram. Пример см. в Перенаправление дескриптора файла перед выполнением. Обратите внимание, что в дополнение к execve, вам нужно будет переопределить все функции библиотеки C, которые вызывают execve внутри библиотеки, потому что LD_PRELOAD не влияет на внутренние вызовы библиотеки C. Вы можете получить более точный контроль, запустив программу под ptrace; это позволит вам отменить системный вызов, даже если он сделан функцией библиотеки C, но это сложнее настроить (я не знаю ни одного простого способа сделать это).

0
09.05.2019, 09:04
1 ответ

Итак, после дополнительного расследования и просмотра журналов 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
0
28.01.2020, 03:42

Теги

Похожие вопросы