Помогите написать скрипт обработки лога rinetd

Простые/общие вопросы по UNIX системам. Спросите здесь, если вы новичок

Модераторы: vadim64, terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Скорпион
проходил мимо
Сообщения: 7
Зарегистрирован: 2015-03-23 10:08:45

Помогите написать скрипт обработки лога rinetd

Непрочитанное сообщение Скорпион » 2015-03-23 10:38:59

Уважаемые Гуру.
Помогите написать скрипт, который обрабатывал бы лог rinetd и выполнял бы такие действия:
1. Берем строку лога и смотрим нет ли в 9-ом столбце слова "denied", если есть - переходим к следующей строке.
2. Если "denied" отсутствует, то берем из этой строчки IP из 2-го столбца и запоминаем его.
3. Берем следующую строчку и сравниваем IP из 2-го столбца с IP из п.2
4. Проверяем так еще 5 строчек после строчки из п.2 и если все IP совпадают переходим к п.5, в противном случаем берем строчку на которой прервалось совпадения и возвращаемся к п.1
5. Проверяем нет ли данного IP в массиве deny_ip и если нет, то заносим данный IP в массив deny_ip, а значение времени из 1 столбца в массив deny_time, с таким же ключем массива как и IP.
6.По окончанию лога данные массивов deny_ip и deny_time вставляем в конфигурационный файл rinetd

Код: Выделить всё

echo deny $deny_ip[key]    #$deny_time[key] >> /usr/local/etc/rinetd.conf
7. Перегружаем rinetd с применением нового конфига

Код: Выделить всё

cat /var/run/rinetd.pid | xargs kill -1


Запуск скрипта предполагается выполняться каждые 5 минут посредством крона.

Смысл назначения скрипта думаю понятен.
Занести IP адрес "переборщика доступа", после 5 попытки, в конфиг rinetd

Отправлено спустя 4 минуты 24 секунды:
Прочитал сообщение и думаю более оптимальным будет после п.2 сделать проверку на наличие IP в массиве deny_ip и если нету, то продолжать действия дальше. А данную проверку из 5 пункта убрать.

Отправлено спустя 1 минуту 19 секунд:
Ну и еще немного добавлю.
Все это интересует под FreeBSD 10.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Скорпион
проходил мимо
Сообщения: 7
Зарегистрирован: 2015-03-23 10:08:45

Помогите написать скрипт обработки лога rinetd

Непрочитанное сообщение Скорпион » 2015-03-29 7:37:05

Сам спросил - сам отвечаю. Вдруг кому-либо пригодиться.
(с) Скрипт написан при поддержки пользователя ASE_DAG с ru-board, за что ему спасибо.

Код: Выделить всё

#!/usr/bin/awk -f 
BEGIN { 
ATTEMPTS_ALLOWED = 5; 
TIME_PERIOD = 60; 
LOG = "/var/log/rinetd.log"; 
ARCH = "/var/log/rinetd.old"; 
CONF = "/usr/local/etc/rinetd.conf"; 
PIDFILE = "/var/run/rinetd.pid"; 
LOG_FIELD_TIME = 1; 
LOG_FIELD_IP = 2; 
LOG_FIELD_ACTION = 9; 
getline pid < PIDFILE; 
    if ( pid > 0 ) { 
        system("kill -1 " pid); 
        while ( getline < LOG ) { 
            if ($LOG_FIELD_ACTION != "denied" && $LOG_FIELD_IP == prev_ip) { 
                if (!ip_for_denying[$LOG_FIELD_IP]) { 
                    split($LOG_FIELD_TIME, next_time, ":"); 
                    if (next_time[2] < prev_time[2]) { next_time[2]=next_time[2]+24 ; } 
                    if ( next_time[2]*3600+next_time[3]*60+next_time[4]-priv_time[2]*3600-priv_time[3]*60-priv_time[4] < TIME_PERIOD ) { 
                        if (++attempts >= ATTEMPTS_ALLOWED) { 
                            ip_for_denying[key]++; 
                            ip_for_denying[$LOG_FIELD_IP]++; 
                            print "deny", $LOG_FIELD_IP, "\t\t#"$LOG_FIELD_TIME >> CONF; 
                        } 
                    } 
                } 
            } else { 
                prev_ip = $LOG_FIELD_IP; 
                attempts = 1; 
                split($LOG_FIELD_TIME, priv_time, ":"); 
            } 
        } 
        close(LOG); 
        if (ip_for_denying[key] != 0){ 
            system("cat " LOG " >> " ARCH); 
            system("rm  " LOG); 
        } 
    } 
}