Pure-ftpd. Блокируем по ip фтп-роботов.

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
abanamat
сержант
Сообщения: 255
Зарегистрирован: 2007-03-15 11:24:26
Откуда: Питер
Контактная информация:

Pure-ftpd. Блокируем по ip фтп-роботов.

Непрочитанное сообщение abanamat » 2009-04-19 2:48:09

Ничего нового и необычного за тем, пожалуй исключением, что это awk скрипт.
Скрипт реагирует на строчки вида

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

Mar 28 16:29:15 mail pure-ftpd: (?@218.62.29.118) [ERROR] Too many authentication failures
В процессе участвуют:
pure-ftpd
syslogd
newsyslog
crontab
ipfw
awk

Теперь директивы для каждого из упомянутых бинарников.

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

grep Syslog /usr/local/etc/pure-ftpd.conf
SyslogFacility              ftp

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

cat /etc/syslog.conf
Обратите внимание. Добавляем ftp.none; в строчку:

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

*.notice;authpriv.none;ftp.none;kern.debug;lpr.info;mail.crit;news.err /var/log/messages
Комментируем строчку про ftp.info

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

#ftp.info                                       /var/log/xferlog
И добавляем в конец файла

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

!pure-ftpd
*.*                                             /var/log/ftp.log

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

grep ftp /etc/newsyslog.conf 
/var/log/ftp.log                        644  5     100  *     JC

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

grep block /etc/crontab 
*/10    *       *       *       *       root    /usr/local/service/blockftp.awk

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

ipfw show | grep 'dst-port 21'
00025        96         4305 reset tcp from table(3) to me dst-port 21 in

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

cat /usr/local/service/blockftp.awk 
#!/usr/bin/awk -f

BEGIN {
# Пользовательские переменные:
#
# ftp_log - полный путь к файлу лога ftp сервера pure-ftpd
# reject_count - число встречаемости строчки "...[ERROR] Too many authentication failures" для ip адреса.
# При превышении этого значения ip будет добавлен в таблицу, номер которой указан в переменной tbl_nr
#
#
ftp_log = ("/var/log/ftp.log")
reject_count = 2
tbl_nr = 3

patt_IPbe = ("^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$")
chkid_cmd = ("/usr/bin/id -u")
fwt_cmd = ("/sbin/ipfw -q table")
list_cmd = (fwt_cmd" "tbl_nr" list")
add_cmd = (fwt_cmd" "tbl_nr" add")

    # Проверяем id пользователя.
    while((chkid_cmd | getline id_is) > 0) {
        if (id_is != "0") {
            print "ABORTED: You are not root."
            break
        }
    }
    close (chkid_cmd)
exit

} END {

    # Если id пользователя не 0, заканчиваем работу.
    if (id_is != "0") {
        exit 1
    }

    # Читаем ftp лог.
    while ((getline line_in < ftp_log) > 0) {
        # Нужная строчка содержит 11 элементов
        if (split(line_in,TMPLINE) == 11) {
            # Если содержимое удовлетворяет условию
            if (TMPLINE[7] == "[ERROR]" && TMPLINE[8] == "Too" && TMPLINE[9] == "many") {
                if (split(TMPLINE[6],TMPIP,"@") == 2) {
                    gsub(/\)/,"",TMPIP[2])
                    # Если после чистки значение удовлетворяет паттерну ip адреса
                    if (TMPIP[2] ~ patt_IPbe) {
                        # Если количество срабатываний с участием этого ip превышает заданый лимит
                        if ((TMPLOGIP[TMPIP[2]]++) > reject_count) {
                            # Если в массиве ip адресов из лога есть элементы
                            if (logrejips_cn > 0) {
                                it_in_log = 0
                                for (i=1; i<=logrejips_cn; i++) {
                                    # Если этот ip уже есть в массиве ip адресов из лога, ничего не делаем
                                    if (TMPIP[2] == LOGREJ[i]) {
                                        it_in_log = 1
                                        break
                                    }
                                }
                                # Если этот ip не найден в массиве ip адресов из лога, добавляем его туда
                                if (it_in_log == 0) {
                                    LOGREJ[++logrejips_cn] = TMPIP[2]
                                }
                            # Если в массиве ip адресов из лога нет элементов, добавляем туда текущий ip
                            } else {
                                LOGREJ[++logrejips_cn] = TMPIP[2]
                            }
                        }
                    }
                }
                split("",TMPIP)
            }
        }
        split("",TMPLINE)
    }
    split("",TMPLOGIP)
    close (ftp_log)

    # Если у нас есть кандидаты из лога, продолжаем.
    if (logrejips_cn > 0) {

        # Получаем список ip адресов из таблицы фиревола в массив.
        # Индексация - по ip адреcу. Пригодится в дальнейшем для поиска в массиве.
        while ((list_cmd | getline line_in) > 0) {
            if (split(line_in,TMPIP,"/") == 2) {
                FWREJ[TMPIP[1]]
                fwrejips_cn++
            split("",TMPIP)
            }
        }
        close (list_cmd)

        # Если в таблице фиревола есть элементы
        if (fwrejips_cn > 0 ) {
            for (i=1; i<=logrejips_cn; i++) {
                # Вот тут нам пригодится индексация по ip.
                if ((LOGREJ[i] in FWREJ) == 0) {
                    # Добавляем кандидатов из лога в таблицу фиревола.
                    system(add_cmd" "LOGREJ[i])
                }
            }
        # Если в таблице фиревола нет элементов
        } else {
            for (i=1; i<=logrejips_cn; i++) {
                    # Добавляем кандидатов из лога в таблицу фиревола.
                    system(add_cmd" "LOGREJ[i])
            }
        }
    split("",FWREJ)
    }
split("",LOGREJ)
}

# Ver 0.3
#
Вложения
blockftp.txt
(3.01 КБ) 16 скачиваний
Последний раз редактировалось abanamat 2009-05-25 19:55:21, всего редактировалось 2 раза.

Хостинговая компания 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/

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Pure-ftpd. Блокируем по ip фтп-роботов.

Непрочитанное сообщение zg » 2009-04-19 7:26:03

abanamat писал(а):# Ver 0.1
гм... нафига такие извраты на авк... :unknown:

Аватара пользователя
abanamat
сержант
Сообщения: 255
Зарегистрирован: 2007-03-15 11:24:26
Откуда: Питер
Контактная информация:

Re: Pure-ftpd. Блокируем по ip фтп-роботов.

Непрочитанное сообщение abanamat » 2009-04-19 11:08:15

zg писал(а):
abanamat писал(а):# Ver 0.1
гм... нафига такие извраты на авк... :unknown:
:) вот в вопросе и ответ. Чтобы выжать максимум полезного из одного запуска бинарника. Awk - это такой маленький интерпретируемый Си. А в большинстве случаев его используют в цепочке чтобы вывести третью колонку.. из пушки по воробьям.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Pure-ftpd. Блокируем по ip фтп-роботов.

Непрочитанное сообщение zg » 2009-04-19 11:29:59

abanamat писал(а):Чтобы выжать максимум полезного из одного запуска бинарника
смысла в этом действе ровно 0. Авк строковый процессор, и использовать в нём только BEGIN и END это нарушение всех законов логики.

Аватара пользователя
abanamat
сержант
Сообщения: 255
Зарегистрирован: 2007-03-15 11:24:26
Откуда: Питер
Контактная информация:

Re: Pure-ftpd. Блокируем по ip фтп-роботов.

Непрочитанное сообщение abanamat » 2009-04-19 11:43:10

zg писал(а):
abanamat писал(а):Чтобы выжать максимум полезного из одного запуска бинарника
смысла в этом действе ровно 0. Авк строковый процессор, и использовать в нём только BEGIN и END это нарушение всех законов логики.
Это рудимент. Не сразу ведь нарисовал. Я не претендую на гениальную программу. Я в общем не программер совсем. Поэтому со мной пиписьками на эту тему меряться бесполезно. А смысел есть. Например массивы и достаточно развитая их функциональность. Отсюда отказ от использования временных файлов и лишних действий по подсчету совпадений; опять же часто замена результатов вызова внешней программы встроенными функциями awk дает возможность уйти от проблемы неоднозначного результата работы внешней программы в зависимости от локали.
Что еще.. он есть в базовой системе, он маленький и быстрый.
Кстате.
awk - pattern-directed scanning and processing language

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Pure-ftpd. Блокируем по ip фтп-роботов.

Непрочитанное сообщение zg » 2009-04-19 11:55:12

abanamat писал(а):Я не претендую на гениальную программу.
проблема в том, что потом в этом коде нифига не найти. Если вдруг там будет ошибка (а она будет с вероятностью 99%), то код сразу потреяет ценность.
abanamat писал(а):Поэтому со мной пиписьками на эту тему меряться бесполезно.
да никто и не собирается, просто, если ты перепишешь этот скрипт на перле или sh, то сделаешь великое дело и многие скажут спасибо.
abanamat писал(а): А смысел есть. Например массивы и достаточно развитая их функциональность.
массивы много где есть. Авк это текстовый процессор, а не среда управления приложениями.
abanamat писал(а):Что еще.. он есть в базовой системе, он маленький и быстрый.
перл или sh в данном случае более уместен.
abanamat писал(а):Кстате.
гм.. а ты знаешь, что это значит? :smile:

Аватара пользователя
abanamat
сержант
Сообщения: 255
Зарегистрирован: 2007-03-15 11:24:26
Откуда: Питер
Контактная информация:

Re: Pure-ftpd. Блокируем по ip фтп-роботов.

Непрочитанное сообщение abanamat » 2009-04-19 12:06:51

да никто и не собирается, просто, если ты перепишешь этот скрипт на перле или sh, то сделаешь великое дело и многие скажут спасибо.
я пока именно этот процесс и наблюдаю. Sh ничего не умеет.
sh -- command interpreter (shell)
Bash да. Умеет. Но мало и не очень хорошо.
Перл - это фантастическая просто гадость. Медленная, жрущая, в базовой системе отсутствует. Зачем? Зачем напрягать этого монстра на такую простую задачу?
гм.. а ты знаешь, что это значит? :smile:
Да.

Спасибо тебе, дорогой человек, что держишь топик в топе.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Pure-ftpd. Блокируем по ip фтп-роботов.

Непрочитанное сообщение zg » 2009-04-19 12:15:54

abanamat писал(а):я пока именно этот процесс и наблюдаю. Sh ничего не умеет.
-)) если бы шелл ничего не умел, то его бы не использовали
abanamat писал(а):Перл - это фантастическая просто гадость. Медленная, жрущая, в базовой системе отсутствует. Зачем? Зачем напрягать этого монстра на такую простую задачу?
-))) ты на перле много проектов сделал, чтобы так утверждать?
abanamat писал(а):Спасибо тебе, дорогой человек, что держишь топик в топе.
так что, перепишешь?

Аватара пользователя
abanamat
сержант
Сообщения: 255
Зарегистрирован: 2007-03-15 11:24:26
Откуда: Питер
Контактная информация:

Re: Pure-ftpd. Блокируем по ip фтп-роботов.

Непрочитанное сообщение abanamat » 2009-04-19 12:17:26

так что, перепишешь?
неа.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Pure-ftpd. Блокируем по ip фтп-роботов.

Непрочитанное сообщение zg » 2009-04-19 12:19:16

abanamat писал(а):неа.
гм... ну дело твоё конечно.

Аватара пользователя
abanamat
сержант
Сообщения: 255
Зарегистрирован: 2007-03-15 11:24:26
Откуда: Питер
Контактная информация:

Re: Pure-ftpd. Блокируем по ip фтп-роботов.

Непрочитанное сообщение abanamat » 2009-05-25 19:58:15

zg писал(а):Если вдруг там будет ошибка (а она будет с вероятностью 99%), то код сразу потреяет ценность.
:)) сегодня была найдена ошибка из разряда "утечка памяти". Скрипт делал пару тысяч лишних циклов, и это проявилось на стареньком пне который при этом был загружен какой-то полезной работой. Ошибка дезинтегрирована, версия скрипта №3.