LINUX.ORG.RU

Нужна помощь в написании простенького bash скрипта

 ,


0

2

Всем привет!

Имеется FreeBSD, Apache и Nginx.

есть файл /etc/nginx/имя_сайта.site.conf
есть лог /var/log/имя_сайта.access_log

в логе есть строчки такого вида:

178.204.35.111 - - [27/Mar/2016:12:47:41 +0300] "POST / HTTP/1.0" 403 1480 "-" "ApacheBench/2.3"
178.204.35.111 - - [27/Mar/2016:12:47:41 +0300] "POST / HTTP/1.0" 403 1480 "-" "ApacheBench/2.3"
178.204.35.111 - - [27/Mar/2016:12:47:41 +0300] "POST / HTTP/1.0" 403 1480 "-" "ApacheBench/2.3"
178.204.35.111 - - [27/Mar/2016:12:47:41 +0300] "POST / HTTP/1.0" 403 1480 "-" "ApacheBench/2.3"
178.204.35.111 - - [27/Mar/2016:12:47:41 +0300] "POST / HTTP/1.0" 403 1480 "-" "ApacheBench/2.3"

нужно отслеживать в логе появление новых строк, содержащих строку «ApacheBench» (или код возврата 403) и банить ip из этой строки путем добавления его к команде deny в файл /etc/nginx/имя_сайта.site.conf:

server {
    deny 178.204.35.111;
...
}

После каждого изменения файла /etc/nginx/имя_сайта.site.conf требуется перегружать nginx командой /etc/rc.d/nginx restart.

вот и все, что должен делать скриптик... Поможете? :)

P.S. Цель скрипта - отражение пианэрских ddos атак))

Почему бы не взять fail2ban для такой задачи и вообще не пропускать досящих пользователей к nginx?

alozovskoy ★★★★★ ()
Ответ на: комментарий от anonymous

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

alozovskoy ★★★★★ ()

или код возврата 403

Кстати, а че это ты решил банить по IP всех кто получил 403? А что твой сервак отдает 403 только в случае этой дос атаки, и больше никогда? А если обычный юзер ошибется адресом, и получит 403, ты его тоже банишь?

filequest ()
Ответ на: комментарий от alozovskoy

про fail2ban знаю, но речь идёт о виртуальном хостинге провайдера, где установка дополнительного ПО невозможна. Поэтому и нужен скрипт.

volodlebedev ()
Ответ на: комментарий от Deleted

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

volodlebedev ()
Ответ на: комментарий от volodlebedev

То есть какие-то свои левые скрипты можно притаскивать, а fail2ban вам не поставят? Ну и зачем тогда нужны такие грабли, почему не взять vps (тем более что nginx вы сами конфигурируете)? Но вообще раз права на рестарт nginx вам дали, то может и на управление файрволом права дадут? А собрать fail2ban можно хоть в домашнем каталоге, тут особо рут не нужен.

Ладно, про скрипт - используете include - подключайте список из блокируемых адресов, а основной конфиг не правьте. Для сборка списка пойдет однострочник вида (только уточните как там в основной конфиг nginx инклюдятся клиентские конфиги чтоб не получилось что по маске *.conf вам это deny-список два раза заинклюдит)

grep "ApacheBench\|\"POST / HTTP/1.0\" 403" /var/log/имя_сайта.access_log  | awk '{print "deny "$1}' > /etc/nginx/имя_сайта.deny.conf

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

alozovskoy ★★★★★ ()

Есть готовые решения в портах. +1 к fail2ban.

IPR ★★★★★ ()

ТС, какие ddos-атаки, ты тему называть не можешь правильно! Тебе в интернете не место.

На, держи: «Блокирование ip после попадания строки в лог nginx»

JANB ()

Используй fail2ban. Если хостер не дает - меняй хостера. К черту костыли, используй готовые и проверенные решения.

JANB ()
Ответ на: Пионерским админам от Deleted

reload — перезагрузка конфигурационного файла

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

да, конечно reload. В контексте задачи по написанию скрипта это не суть важно. В скрипте я бы конечно же написал reload, а не restart. Но, спасибо за замечание.

volodlebedev ()
Ответ на: комментарий от filequest

ну ни фига себе. Не слишком ли жирно перезапускать сервер на каждый плохой запрос?

жирно. ответил выше))

volodlebedev ()
Ответ на: комментарий от filequest

Кстати, а че это ты решил банить по IP всех кто получил 403? А что твой сервак отдает 403 только в случае этой дос атаки, и больше никогда? А если обычный юзер ошибется адресом, и получит 403, ты его тоже банишь?

в конфиге nginx у меня просто правило стояло:

    if ($http_user_agent ~ apachebench ) {
        return 403;
    }
поэтому 403 это просто временный костыль был... потом 403 можно поменять на что угодно

volodlebedev ()
Ответ на: комментарий от alozovskoy
grep "ApacheBench\|\"POST / HTTP/1.0\" 403" /var/log/имя_сайта.access_log  | awk '{print "deny "$1}' > /etc/nginx/имя_сайта.deny.conf

за помощь со скриптом огромное большое спасибо! )
сделал, вроде работает, терь вот самое время про fail2ban подумать.
вы вот писали, что fail2ban можно в домашнем каталоге собрать, не поделитесь ссылкой где можно об этом подробнее почитать.
хотя, думаю, без рута не получится, т.к. рут для управления файрволом нужен.

volodlebedev ()
Ответ на: комментарий от JANB

Используй fail2ban. Если хостер не дает - меняй хостера. К черту костыли, используй готовые и проверенные решения.

не получится поменять, предоплату за год вперед сделали, возврата денег нет, сумма большая

volodlebedev ()
Ответ на: комментарий от volodlebedev

Да, без доступа к файрволлу толку от него не будет.

Не знаю как это правильно делать во фряхе. «Классический» вариант это скачать пакет и вот типа такой команды запустить внутри ./configure --prefix=/home/myusername/system/ && make && make install. Потом запускается с учетом указанного префикса, то есть в приведенном случае будет /home/myusername/system/usr/bin/fail2ban-server (в Debian при установке средствами пакетного менеджера бинарник кладется в /usr/bin/fail2ban-server, в FreeBSD опять же это может отличаться).

alozovskoy ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.