Re: Как лучше всего сделать защиту от denial of service при исчерпании свободного места на диске большими по объему лог-файлами nginx?

2024-02-12 Thread Evgeniy Berdnikov
On Mon, Feb 12, 2024 at 01:15:53AM +0200, Gena Makhomed wrote:
> Ротация логов делается с помощью программы logrotate, которая делает
> ротацию только по времени и никак не смотрит на количество свободного места
> на диске и на размер лог-файла.

 Насчёт размера файла утверждение неверное: в конфиге logrotate можно
 указать директиву "size", которая будет означать предельный размер
 лог-файла, по достижении которого запускается ротация. Другое дело, что
 риалтаймовского триггера на достижение предельного размера файла нет.
 А он мог бы быть в nginx-е, среди опций access_log и error_log.

> # logrotate --force /etc/logrotate.d/nginx
> 
> можно будет запускать как угодно часто, например, раз в час или даже раз в
> минуту, проверяя предварительно количество свободного места на диске или
> размер файла или по каким-то другим условиям.

 Проверять занятое место на партиции можно хоть раз в секунду и даже чаще.
 Но нет смысла чаще, чем интервал сброса файловых кэшей ядром.
 
> Это может быть полезно в случае DDoS-атак, чтобы не не было
> таких неожиданных ситуаций, что место на сервере внезапно закончилось,

 Для DoS-атак как раз и полезно разделение обязанностей между рабочим
 процессом сервиса и процессом-писателем логов. Я уже упоминал здесь
 сквидовский logfile-daemon, это один из вариантов, как можно обезопасить
 рабочий процесс от ступора. Но не самый эффективный, поскольку запись
 через пайп -- это значительное количество сисколов с обеих сторон,
 с копированием данных в ядро из писателя и обратно читателю.
 Гораздо эффективней сделать циклический буфер в разделяемой памяти,
 к которой подключаются два процесса/треда -- рабочий и писатель логов.
 Запись в такой буфер и чтение из него никаких сисколов не требует.
 Останется лишь минимизировать расходы на взаимные блокировки, которые,
 вероятно, также можно сделать без сисколов, если поискать специальные
 алгоритмы на этот счёт... В итоге получится быстрая запись и быстрое
 независимое чтение, причём если второе сдохнет или начнёт захлёбываться,
 писателя это не убьёт.

 Конечно, программирование всего этого -- немаленькая работа. 
 
 А костыли в виде логов в оперативной памяти, logrotate и питоновских
 скриптов можно, конечно, нагородить. Но в современной ситуации, я думаю,
 проще сделать триггер, который по обнаружении катастрофической нехватки
 места для логов просто отключит логгирование в nginx-e.

> 3) не делать автоматической защиты от DDoS через исчерпание свободного
> места на диске - потому что идеологически правильно чтобы эту проблему
> вручную устранял системный администратор, потому что старые логи важны
> и нужны.

 Работоспособность web-сервиса, как правило, намного важнее логгирования.
-- 
 Eugene Berdnikov
___
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru


Re: Тест nginx -- сколько сообщений в log syslog без потерь?

2024-02-12 Thread Anatoliy Melnik via nginx-ru




И снова здравствуйте. 
Тут прям уже прям целое расследование: Что я сказал, что хотел сказать, где и 
сколько соврал... 

"Без меня меня женили"... 
Читается как детективная история :) 

Коль пошла такая дискуссия: 

" [ https://forum.nginx.org/read.php?21,298858,299091#msg-299091 | Как лучше 
всего сделать защиту от denial of service при исчерпании свободного места на 
диске большими по объему лог-файлами nginx? ] 
" 
Насколько понимаю, вы решили, что это одна из решаемых проблем. 
Итак 
Цитата: 
Из его собщения от 5 февраля однозначно следует, что он 
уже пытался настроить запись логов напрямую в файл но не смог 
получить рабочего решения при 200-250 тысячах подключений в секунду 
и необходимости делать ротацию лога каждые 30 секунд. И даже предлагает 
мне самому попробовать и убедиться, что это не работает и что таким 
образом запись и ротацию логов в файл самим nginx при такой большой 
нагрузке и при таком интервале ротации - настроить невозможно, 

Я предлагал попробовать и поделиться, лично я попробовал, получил результат -- 
пишет, работает, возможно. И сделал это ДО того, как сюда обратился... 
НО меня сей результат не удовлетворил. 
Да, да (понимаю) -- чем он меня "не удовлетворил"?? 
--- можете фантазировать сколько угодно. 
Единственное пожелание -- при озвучивании фантазий оставаться в рамках 
корректного изложения. 
Возможно и оттуда я почерпну что-то для себя новое и полезное. 

Цитата: 
Ротация логов делается с помощью программы logrotate, которая делает 
ротацию только по времени и никак не смотрит на количество свободного 
места на диске и на размер лог-файла. С помощью той программы logrotate, 
которая идет в составе дистрибутива - неочевидно, как настроить более 
быструю ротацию логов nginx, если они начинают занимать слишком много 
места на диске и когда свободного места на диске остается слишком мало. 

Отлично, 
1. logrotate - не единственный вариант. 
2. logrotate -- УМЕЕТ смотреть на размер. 
3. настроить более быструю ротацию вообще штука очевидная, скорее всего, для 
большинства 
man logrotate 
Description 
Normally, logrotate is run as a daily cron job. 
т.е. работает через cron... Т.е. все, что умеет крон достижимо в ротации через 
logrotate  
(или я слишком оптимистичен в разрезе "для большинства"??) 

Задача по предотвращению исчерпания места на диске так же была решена задолго 
ДО обращения сюда. 


Следуем дальше: 
мне чисто по человечески любопытно, допустим, нашелся такой человек. ну ок, 
у него работает, у меня нет. и в чем профит того факта, что такой человек 
нашелся 

Знание о том, что проблема разрешима, дает довольно много. 
"Дайте мне точку опоры, и я переверну Землю" (кажется Архимед) 
Вот эту "точку опоры" я в некотором роде и искал :) 
Собственно, как и в большинстве случаев, нашел не то, что искал. 
Но найденное НЕ разочаровало. 
Со знающими людьми пообщался как минимум. 

Что у нас еще обнаружилось: 
Снисходительность, ирония, сарказм... 
(возможно я самонадеян и не так понял некоторые моменты в комментариях? буду 
рад, если это действительно так) 

Возникает впечатление, что кому-то из вас принципиально важно доказать 
незыблемую правоту своего мнения и ошибочность моих действий. 
Вопрос - зачем? 
Это не конкурс или состязание, я сюда обратился за советом. 
Не за поддержкой или осуждением, сочувствием, порицанием или одобрением и т.д. 
Помощь я получил. 
Не в том виде, в котором ожидал. Но поверьте - оценил и благодарен ЗА ПОМОЩЬ. 

Конкретный ответ на поставленный в самом начале вопрос, как правильно заметили 
выше, потерял актуальность. 

Какая разница насколько глубокое ущелье на моем пути, если я уже построил через 
него мост? 
Может он не самый красивый, вечный, грузоподъемный и уникальный... 
Для моих целей его достаточно :) 
Возможно, по мнению кого-то, я вообще иду "не туда"! 
И? Вы свои аргументы привели, мое мнение они не изменили... 
Или для некоторых "есть только два мнения: моё и неправильное"? 

Всем дочитавшим - благодарность за терпение. 
Предлагаю на сем финишировать. 

Или я чего-то не понимаю? 



___
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru


Re: Как лучше всего сделать защиту от denial of service при исчерпании свободного места на диске большими по объему лог-файлами nginx?

2024-02-12 Thread Gena Makhomed

On 12.02.2024 11:53, Evgeniy Berdnikov wrote:


Ротация логов делается с помощью программы logrotate, которая делает
ротацию только по времени и никак не смотрит на количество свободного
места на диске и на размер лог-файла.


  Насчёт размера файла утверждение неверное: в конфиге logrotate можно
  указать директиву "size", которая будет означать предельный размер
  лог-файла, по достижении которого запускается ротация. Другое дело, что
  риалтаймовского триггера на достижение предельного размера файла нет.
  А он мог бы быть в nginx-е, среди опций access_log и error_log.


Я немного не точно выразился. Интересует запуск ротации логов
не по размеру одного какого-то лог-файла, а по суммарному
размеру всего каталога /var/log/nginx/

Потому что даже если выставить лимит size 1G на один лог-файл -
не всегда понятно, сколько именно места на диске будет занимать
каталог /var/log/nginx/ rotate 52 задает количество ротаций
только одного одного файла. А размер каталога /var/log/nginx/
зависит от того, сколько там будет лог-файлов - всего два,
access.log и error.log или несколько сотен, или несколько тысяч.

Вообще, в идеале - хотелось бы иметь возможность и значение rotate
не статически задавать в конфиге, а делать динамически вычисляемым,
по определенной формуле, в зависимости от размера каталога
/var/log/nginx/ и/или количества свободного места на диске
и других параметров.

Наверное, самый оптимальный вариант решения всех этих проблем
- это сделать демона logrotated, который будет следить
за количеством занятого и/или свободного места на разделе /var
и в результате - если необходимо делать принудительную
ротацию логов, - будет сам генерировать временный файл
конфигурации, например, /run/logrotated/nginx-logrotate.conf
и потом уже запускать утилиту /usr/sbin/logrotate
для выполнения работы по ротации логов, примерно так:

/usr/sbin/logrotate --force /run/logrotated/nginx-logrotate.conf

то есть, когда DDoS-атак нет - тогда демон logrotated просто висит
в фоне, время от времени проверяя состояние и ничего не делает,
потому что ни один триггер не срабатывает. И тогда всю работу
по ротации логов nginx делает сама программа logrotate,
запускаемая по крону раз в сутки. А когда происходит DDoS-атака,
тогда logrotated обнаруживает чрезмерное использование места
на диске логами nginx и начинает делать принудительную ротацию
логов, не допуская исчерпания свободного места на диске
DDoS-атакой и наступления ситуации отказа в обслуживании.


Это может быть полезно в случае DDoS-атак, чтобы не не было
таких неожиданных ситуаций, что место на сервере внезапно закончилось



  Для DoS-атак как раз и полезно разделение обязанностей между рабочим
  процессом сервиса и процессом-писателем логов.


Та система, которая есть сейчас - она близка к идеальной,
когда каждая утилита делает только свою работу, но делает
ее очень хорошо - nginx только обрабатывает запосы клиентов,
а logrotate - занимается только задачей ротации логов.


  Я уже упоминал здесь
  сквидовский logfile-daemon, это один из вариантов, как можно обезопасить
  рабочий процесс от ступора.


У nginx нет ступора рабочих процессов том случае, когда закончилось 
свободное место на диске. Он даже дополнительно делает паузу в одну

секунду, чтобы на FreeBSD все не тормозило, когда нет свободного
места на диске. То есть, со стороны nginx - вообще никаких проблем.

https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_log_module.c#L288

Проблемы начинаются у остального софта, например, MySQL прекращает 
нормально работать, потому что ничего не может записать в базу данных,

когда на диске 0 байт свободного места и php-fpm начинает возвращать
5xx статус - то есть, в результате и получается denial of service.


  А костыли в виде логов в оперативной памяти, logrotate и питоновских
  скриптов можно, конечно, нагородить. Но в современной ситуации, я думаю,
  проще сделать триггер, который по обнаружении катастрофической нехватки
  места для логов просто отключит логгирование в nginx-e.


Когда свободного места на диске нет - то nginx туда, естественно,
ничего и не пишет, когда свободное место появляется - процесс записи
логов автоматически продолжается, тут ничего настраивать не нужно.

Единственная проблема которая есть в такой сиутации - перестают работать 
POST-запросы, если в каталоге client_body_temp_path ноль байт свободного

места, но все остальные типы запросов в такой ситуации nginx продолжает
нормально обрабатывать. И теряется возможность записи информации в логи.

Все остальное - вроде бы работает нормально, когда 0 байт
свободного места на диске - но я очень детально это не проверял.


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



  Работоспособность web-сервиса, как правило, намного важнее логгирования.


Тогда почему в операционной системе logrotate запускается по крону
только

Re: Тест nginx -- сколько сообщений в log syslog без потерь?

2024-02-12 Thread Gena Makhomed

On 12.02.2024 12:30, Anatoliy Melnik via nginx-ru wrote:


Из его собщения от 5 февраля однозначно следует, что он
уже пытался настроить запись логов напрямую в файл но не смог
получить рабочего решения при 200-250 тысячах подключений в секунду
и необходимости делать ротацию лога каждые 30 секунд. И даже предлагает
мне самому попробовать и убедиться, что это не работает и что таким
образом запись и ротацию логов в файл самим nginx при такой большой
нагрузке и при таком интервале ротации - настроить невозможно,



Я предлагал попробовать и поделиться, лично я попробовал, получил результат -- 
пишет, работает, возможно. И сделал это ДО того, как сюда обратился...
НО меня сей результат не удовлетворил.


Так и расскажите, почему не удовлетворил, поделитесь опытом
с участниками и читателями этого списка рассылки. Тем более,
что здесь присутствуют и разрабочики nginx, так что если проблема
в коде nginx действителько существует - эту проблему в коде исправят.

Насколько мне известно, переоткрытие лог-файлов по сигналу USR1
происходит практически мгновенно и не требует перезапуска
рабочих процессов nginx, поэтому - не может приводить ни к каким
проблемам на любом количестве соединений при ротации лог-файлов
nginx раз в 30 секунд.

Тем более, что директива access_log позволяет настроить
процесс записи логов наиболее оптимальным способом, ключив
буферизацию, и при необходимости - компрессию логов на лету.

access_log path [buffer=size] [gzip[=level] [flush=time]

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

кстати, и logrotate делает ротацию логов nginx таким же способом:

# cat /etc/logrotate.d/nginx

if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi



Да, да (понимаю) -- чем он меня "не удовлетворил"??
--- можете фантазировать сколько угодно.


Могу, но не хочу. Поэтому и прошу Вас чтобы Вы сами рассказали всем
здесь присутствующим о том, какие проблемы Вы обнаружили при ротации
логов с помощью сигнала USR1. Я здесь не вижу вообще никаких проблем.


Задача по предотвращению исчерпания места на диске так же была решена задолго 
ДО обращения сюда.


Поделитесь своим опытом решения этой задачи.
Потому что я пока что не смог найти решения.


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


Я уже отвечал на этот Ваш вопрос.

Этот список рассылки - он посвящен nginx, а не процессу самоутверждения.
И если кто-то начинает ради самоутверждения распространять ложную
информацию про nginx, например, что nginx не способен самостоятельно
писать логи в файлы при количестве подключений 200-250 тысяч в секунду
и ротации лог-файлов раз в 30 секунду и что решением этой проблемы
является набор костылей в виде syslog, unix socket, и десяти
одновременно запущеных копий скрипта на Python - то это FUD
и это вредит не только конкретно тому человеку, который это
делает, но и всему nginx community, то есть всем участниками
и читателям списка рассылки, потому что часть неопытных пользователей
nginx может в этот FUD поверить и считать эту Вашу информацию истинной.

FUD - это
https://en.wikipedia.org/wiki/Fear,_uncertainty,_and_doubt
https://ru.wikipedia.org/wiki/FUD


Это не конкурс или состязание, я сюда обратился за советом.


Так я тоже обратился к Вам за советом - пожалуйста, поделитесь опытом,
и расскажите, какие проблемы Вы обнаружили при ротации логов nginx
с помощью сигнала USR1 что были вынуждены отказаться от этого варианта
работы и логами и были вынуждены в результате соорудить то,
что Вы назвали решением этой проблемы - в виде syslog, unix socket и 
скрипта на Python запускемого в 10 экземплярах и пишущего логи в 10 
отдельных файлов.


Решением какой именно _проблемы_ является эта конструкция,
которую Вы называете в своих сообщениях решением проблемы?


Какая разница насколько глубокое ущелье на моем пути, если я уже построил через 
него мост?
Может он не самый красивый, вечный, грузоподъемный и уникальный...
Для моих целей его достаточно :)
Возможно, по мнению кого-то, я вообще иду "не туда"!


Дело тут не только и не столько в https://xkcd.ru/386/
потому что идя не туда, Вы еще этот способ идти не туда
и рекламируете как _решение проблемы_, чем делаете FUD,
хотя лично Вам этот веб-сервер ничего плохого не сделал.


И? Вы свои аргументы привели, мое мнение они не изменили...
Или для некоторых "есть только два мнения: моё и неправильное"?


Поделитесь своим опытом, расскажите, почему эта конструкция
из syslog, unix socket и десяти скриптов на python, пишущих
сообщения в десять лог-файлов оказалась для Вас лучше,
чем встроенные в nginx возможности для записи и ротации логов?


Или я чего-то не понимаю?


«Ничего личного, т

Re: Как лучше всего сделать защиту от denial of service при исчерпании свободного места на диске большими по объему лог-файлами nginx?

2024-02-12 Thread Gena Makhomed

On 13.02.2024 4:21, Gena Makhomed wrote:


Когда свободного места на диске нет - то nginx туда, естественно,
ничего и не пишет, когда свободное место появляется - процесс записи
логов автоматически продолжается, тут ничего настраивать не нужно.

Единственная проблема которая есть в такой сиутации - перестают работать 
POST-запросы, если в каталоге client_body_temp_path ноль байт свободного

места, но все остальные типы запросов в такой ситуации nginx продолжает
нормально обрабатывать. И теряется возможность записи информации в логи.

Все остальное - вроде бы работает нормально, когда 0 байт
свободного места на диске - но я очень детально это не проверял.


Не знаю, насколько часто встречается такая проблема в дикой природе,
но если возникает ошибка записи во время записи client_body в файл
в client_body_temp_path - теоретически - можно было бы прочитать,
то что успели уже записать в файл, отправить на backend
и на какое-то время - переключить режим работы директив

fastcgi_request_buffering
proxy_request_buffering
scgi_request_buffering
uwsgi_request_buffering

временно из текущего режима работы (on?) в режим работы off, например,
на 1 минуту, и если через 1 минуту на разделе куда указывает директива
client_body_temp_path появится достаточное количество свободного места,
например,  N * client_max_body_size при каком-то разумном значении N -
тогда вернуть обратное старое значение, какое было для этих директив
до момента переключения в такой режим работы.

Кстати, что интересно, для модуля grpc в коде установлено

r->request_body_no_buffering = 1;

поэтому проксирование grpc запросов всегда будет нормально работать,
даже в том случае, когда на диске будет 0 байт свободного места.

Или - не имеет смысл настолько усложнять код nginx? Потому что
в таком случае - если не настроен мониторинг свободного места
на сервере - тогда системный администратор узнает об этой проблеме
по жалобам, что POST запросы на сайте перестали нормально работать
и на backend приходит 0 байт вместо того, что отправлял клиент.

А если сделать так, чтобы nginx не терял тело запроса и корректно
отправлял бы запросы на backend - то в такой ситуации системный
администратор может еще очень долго ничего не знать о проблеме?

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

А если nginx сможет нормально функционировать и POST-запросы смогут 
нормально функционировать, не смотря на то. что на диске 0 байт

свободного места - это может быть расценено как признак высокой
надежности nginx и как признак высокого уровня качества кода.

Как будет лучше поступить в ситуации нехватки свободного места на диске?

--
Best regards,
 Gena

___
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru