Скажи «Нет!» взломщику: часть 2

Еще один способ защиты

Продолжение статьи Скажи «Нет!» взломщику.

Прошлый раз мы использовали swatch и iptables для защиты от нехороших ботов, пытающихся сделать наш компьютер частью ботнета. У приведённого способа был существенный недостаток: IP-адреса блокировались навсегда. Это плохо, так как IP-адреса можно подделывать.

Tamdiu discendum est, quamdiu vivas, поэтому сегодня рассмотрим вариант с блокированием атакующего на заданный промежуток времени.

Допустим, что у нас имеются такие файлы конфигурации :

[-]
Download swatch-ssh.conf
ignore /^1\.2\.3\.4$/
watchfor /(: [iI]nvalid [uU]ser )(.*)( from )(.*)$/
    threshold track_by=$4,type=both,count=3,seconds=60
    exec "/usr/bin/bad_ssh_user $4"

watchfor /(: [fF]ailed password for )(.*)( from )(.*)( port )(.*)$/
    threshold track_by=$4,type=both,count=3,seconds=60
    exec "/usr/bin/bad_ssh_user $4"

watchfor /([aA]uthentication [fF]ailure for [iI]llegal [uU]ser )(.*)( from )(.*)$/
    threshold track_by=$4,type=both,count=3,seconds=60
    exec "/usr/bin/bad_ssh_user $4"
[-]
ignore /^1\.2\.3\.4$/
watchfor /: Relay access denied;/
    exec "/usr/bin/relay_attempt $10"

В ignore задаём свой IP-адрес (ситуации бывают всякие, и будет не очень смешно, если по ошибке вы заблокируете сами себя).
В watchfor задаются правила, по которым бы определяем нарушителя. Здесь ничего нового.

Изменится скрипт для предварительной настройки :

[-]
View Code Bash
iptables -N swatch_ssh_rejects
iptables -A swatch_ssh_rejects -m recent --name swatch_ssh --rcheck --seconds 3600 -j LOG --log-prefix "Swatch/SSH: "
iptables -A swatch_ssh_rejects -m recent --name swatch_ssh --update --seconds 3600 -j DROP
iptables -A swatch_ssh_rejects -m recent --name swatch_ssh --remove
iptables -A INPUT -p tcp --dport 22 -j swatch_ssh_rejects

iptables -N swatch_postfix_rejects
iptables -A swatch_postfix_rejects -m recent --name swatch_postfix --rcheck --seconds 3600 -j LOG --log-prefix "Swatch/Postfix: "
iptables -A swatch_postfix_rejects -m recent --name swatch_postfix --update --seconds 3600 -j DROP
iptables -A swatch_postfix_rejects -m recent --name swatch_postfix --remove
iptables -A INPUT -p tcp --dport 25 -j swatch_postfix_rejects

Данные правила создают две цепочки: swatch_ssh_rejects (используется для проверок SSH) и swatch_postfix_rejects (для отсеивания спамеров).

Правило iptables -A swatch_ssh_rejects -m recent --name swatch_ssh --rcheck --seconds 3600 -j LOG --log-prefix "Swatch/SSH: " проверяет, находится ли IP-адрес подключившегося к нам компьютера в списке недавних соединений swatch_ssh, и если последнее соединение с этого адреса было не позднее, чем час назад, записывает сообщение в лог.

Следующее правило iptables -A swatch_ssh_rejects -m recent --name swatch_ssh --update --seconds 3600 -j DROP проверяет, находится ли IP-адрес подключившегося к нам компьютера в списке недавних соединений swatch_ssh, и если последнее соединение с этого адреса было не позднее, чем час назад, обновляет время последнего соединения и отбрасывает соединение. Таким образом, каждая попытка соединения атакующего автоматические продлевает время блокировки.

Наконец, правило iptables -A swatch_ssh_rejects -m recent --name swatch_ssh --remove удаляет из списка недавних соединений swatch_ssh все записи часовой давности.

Правило iptables -A INPUT -p tcp --dport 22 -j swatch_ssh_rejects выполняет проверку доступа по цепочке swatch_ssh_rejects.

Аналогично для swatch_postfix_rejects.

Эти цепочки делают всё, кроме добавления новых адресов в списки недавних соединений. Это делают скрипты bad_ssh_user и relay_attempt:

[-]
Download bad_ssh_user
#! /bin/sh

echo +$1 > /proc/net/xt_recent/swatch_ssh
[-]
Download relay_attempt
#! /bin/sh

echo +`echo $1 | grep -o -E '\[[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\]:' | grep -o -E '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'` > /proc/net/xt_recent/swatch_postfix
[-]
View Code Bash
# Добавление IP-адреса ip в список недавних соединений имя_списка
echo +ip > /proc/net/xt_recent/имя_списка

# Удаление IP-адреса ip в список недавних соединений имя_списка
echo -ip > /proc/net/xt_recent/имя_списка

# Очистка списка имя_списка
echo / > /proc/net/xt_recent/имя_списка

# Просмотр списка имя_списка
cat /proc/net/xt_recent/имя_списка

Напоследок, усовершенствованная версия скрипта для запуска swatch:

[-]
View Code Bash
#! /bin/sh

[ -f /var/run/swatch_ssh.pid ] && kill -9 -`cat /var/run/swatch_ssh.pid`
[ -f /var/run/swatch_smtp.pid ] && kill -9 -`cat /var/run/swatch_smtp.pid`
rm -f /var/run/swatch*.pid
rm -f ~/.swatch_script.*

swatch --tail-file=/var/log/auth.log --config-file=/etc/swatch_ssh.conf --pid-file=/var/run/swatch_ssh.pid --tail-args='--follow=name -n 0' --daemon
swatch --tail-file=/var/log/mail.log --config-file=/etc/swatch_postfix.conf --pid-file=/var/run/swatch_smtp.pid --tail-args='--follow=name -n 0' --daemon

По сравнению с прошлой версией добавлена проверка на существование pid-файла; сигнал SIGKILL посылается теперь не только swatch, но и его дочерним процессам: если просто убить swatch, в памяти останется tail, если же убивать всю группу процессов, то лишних процессов в памяти не останется. Также добавлено удаление файлов .swatch_script.*, в которых и находится исполняемый код сгенерированных скриптов.

Автор: ; опубликовано в: Linux, Безопасность; метки: iptables, Linux, swatch, безопасность
8
Дек
2009

RSS Комментарии к статье «Скажи «Нет!» взломщику: часть 2» (2)  »

  1. [...] предыдущих частях статей цикла «Скажи «Нет!» взломщику» со взломщиками [...]

Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.

Оставить комментарий к записи «Скажи «Нет!» взломщику: часть 2»

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя

गते गते पारगते पारसंगते बोधि स्वाहा