Как лучше всего сделать защиту от 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