Борьба с ботами-взломщиками средствами rsyslogd
Скажи «Нет!» взломщику, часть третья
В предыдущих частях статей цикла «Скажи «Нет!» взломщику» со взломщиками мы боролись при помощи связки swatch + iptables: swatch проводил анализ системного журнала сообщений, iptables использовался для блокировки непрошеных гостей.
Тем не менее, используя swatch на нескольких серверах, я не могу сказать, что я полностью им доволен: слишком уж он хрупок. Завершение дочернего tail приводит к тихой гибели самого swatch, в системе могут оставаться зомби и т.п.
Одна из альтернатив — использование rsyslogd.
Одной из хороших возможностей rsyslogd является возможность выполнения программы при соответствии сообщения в системном журнале заданному образцу. То есть фактически того, для чего мы использовали swatch, с той разницей, что данная функциональность уже встроена в демон и нет необходимости изобретать велосипед
Например:
if $msg contains ': no such user found from ' and $programname == 'proftpd' then ^/opt/rsyslogd/ftp_ban;Message
if $msg contains ': Relay access denied;' and $programname contains 'postfix' then ^/opt/rsyslogd/relay_ban;Message
if ($msg contains 'Failed password for invalid user' or $msg contains 'Failed password for root') and $programname == 'sshd' then ^/opt/rsyslogd/ssh_ban;Message
В зависимости от условий запускается тот или иной скрипт.
Примеры скриптов (реальные скрипты сложнее, но в иллюстративных целях самое то):
ftp_ban:
IP=`echo "$1" | grep -o -E '\[([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\]' | sed 's/\[//g; s/\]//g'`
sudo /opt/rsyslogd/ban.sh "$IP" swatch_proftpd
echo "Blocked $IP for unauthorized FTP access; $1" | mail -s ALERT alert@example.com
exit 0
ssh_ban:
IP=`echo "$1" | grep -o -E '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'`
sudo /opt/rsyslogd/ban.sh "$IP" swatch_ssh
echo "Blocked $IP for unauthorized SSH access; $1" | mail -s ALERT alert@example.com
exit 0
relay_ban:
IP=`echo "$1" | grep -o -E '\[([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\]:' | sed 's/\[//g; s/\]//g; s/://g'`
sudo /opt/rsyslogd/ban.sh "$IP" swatch_postfix
echo "Blocked $IP for unauthorized relaying; $1" | mail -s ALERT alert@example.com
exit 0
Принцип работы у скриптов один и тот же: на вход поступает строка вида Failed password for root from 58.59.176.234 port 53754 ssh2, скрипт извлекает из строки IP-адрес и вызывает специальный скрипт ban.sh, который блокирует заданный адрес.
Тонкость здесь в том, что rsyslogd работает под непривилегированным пользователем (у меня в системе это пользователь syslog); использование iptables требует административных привилегий. Поэтому создаётся специальный скрипт, который пользователю syslog разрешается исполнять от имени root и без пароля. Для этого в /etc/sudoers есть такая запись:
Естественно, что за файлом /opt/rsyslogd/ban.sh нужно следить в оба, так как это хорошая цель для злоумышленника.
Сам по себе скрипт простой:
echo +"$1" > /proc/net/xt_recent/$2
Он добавляет IP-адрес (первый аргумент) в заданную цепочку (второй аргумент). Это мы уже проходили.
Скрипты, вызываемые из rsyslogd, должны выполняться очень быстро. Работа скрипта блокирует демона. Так что если скрипту может потребоваться длительное время, имеет смысл создать вокруг него обёртку, которая будет вызывать его в фоне, а сама завершаться.
Апр
2010
Комментарии к статье «Борьба с ботами-взломщиками средствами rsyslogd» (7) »
Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.
Оставить комментарий к записи «Борьба с ботами-взломщиками средствами rsyslogd»
गते गते पारगते पारसंगते बोधि स्वाहा
Меня зовут Владимир, я программист-фрилансер, специализирующийся на Web-программировании и програмировании под Linux.
По совместительству занимаюсь администрированием LAMP/LNMP-серверов и техническим переводом.


[...] This post was mentioned on Twitter by Интернет заработок. Интернет заработок said: V.Kolesnikov: Борьба с ботами-взломщиками средствами rsyslogd
http://bit.ly/aVBGnQ[...]Кое что не совсем понятно, но буду разбираться. А вообще, спасибо!
Очень познавательная и интересная статья. Мне понравилось, побольше таких статей.
Этот вариант мне куда больше нравится, чем первых 2… спасибо:)
Спасибо за статью. Но для того чтобы понять что как работает мне надо прочитать ее еще пару раз. но все равно спасибо.
А есть еще такая штука, как fail2ban, ее не пробовали использовать?
В заметке отсутствует самый главный файл ban.sh )
Пробовал. Просто стояла цель обойтись минимальным числом подручных средств — идея в том, чтобы на все вспомогательные средства затратить минимум оперативной памяти.
Присутствует — самый последний скрипт.
На практике он может быть сложнее; мы используем что-то вида
if [ "0" -ne `id -u` ]; then
echo "Must be root to do this"
exit 1
fi
echo "$1" | grep -E '^(127\.|IP\.AD\.DR\.ESS)' && exit 0
echo +"$1" > /proc/net/xt_recent/$2
И даже защитили этот скрипт профилем AppArmor:
/opt/rsyslogd/ban.sh {
#include <abstractions/base>
/bin/dash ix,
/bin/grep rix,
/opt/rsyslogd/ban.sh r,
owner /proc/*/net/xt_recent/* w,
/proc/filesystems r,
/usr/bin/id rix,
}