Скажи «Нет!» взломщику: часть 2
Еще один способ защиты
Продолжение статьи Скажи «Нет!» взломщику.
Прошлый раз мы использовали swatch и iptables для защиты от нехороших ботов, пытающихся сделать наш компьютер частью ботнета. У приведённого способа был существенный недостаток: IP-адреса блокировались навсегда. Это плохо, так как IP-адреса можно подделывать.
Tamdiu discendum est, quamdiu vivas, поэтому сегодня рассмотрим вариант с блокированием атакующего на заданный промежуток времени.
Допустим, что у нас имеются такие файлы конфигурации swatch:
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"
watchfor /: Relay access denied;/
exec "/usr/bin/relay_attempt $10"
В ignore задаём свой IP-адрес (ситуации бывают всякие, и будет не очень смешно, если по ошибке вы заблокируете сами себя).
В watchfor задаются правила, по которым бы определяем нарушителя. Здесь ничего нового.
Изменится скрипт для предварительной настройки iptables:
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:
echo +$1 > /proc/net/xt_recent/swatch_ssh
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
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:
[ -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.*, в которых и находится исполняемый код сгенерированных скриптов.
Связанные записи
Автор: Vladimir; опубликовано в: Linux, Безопасность; метки: iptables, Linux, swatch, безопасностьДек
2009


Меня зовут Владимир, я программист-фрилансер, специализирующийся на Web-программировании и програмировании под Linux.
По совместительству занимаюсь администрированием LAMP/LNMP-серверов и техническим переводом.






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