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

Evgeniy Berdnikov bgx на protva.ru
Пн Фев 12 09:53:52 UTC 2024


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