Борьба с ботами-взломщиками средствами rsyslogd

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

В предыдущих частях статей цикла «Скажи «Нет!» взломщику» со взломщиками мы боролись при помощи связки swatch + : swatch проводил анализ системного журнала сообщений, iptables использовался для блокировки непрошеных гостей.

Тем не менее, используя swatch на нескольких серверах, я не могу сказать, что я полностью им доволен: слишком уж он хрупок. Завершение дочернего tail приводит к тихой гибели самого swatch, в системе могут оставаться зомби и т.п.

Одна из альтернатив — использование .

Одной из хороших возможностей rsyslogd является возможность выполнения программы при соответствии сообщения в системном журнале заданному образцу. То есть фактически того, для чего мы использовали swatch, с той разницей, что данная функциональность уже встроена в демон и нет необходимости изобретать велосипед :-)

Например:

[-]
View Code Text
$template Message,"%msg%"

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:

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

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:

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

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:

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

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 есть такая запись:

[-]
View Code Text
syslog ALL=NOPASSWD: /opt/rsyslogd/ban.sh

Естественно, что за файлом /opt/rsyslogd/ban.sh нужно следить в оба, так как это хорошая цель для злоумышленника.

Сам по себе скрипт простой:

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

echo +"$1" > /proc/net/xt_recent/$2

Он добавляет IP-адрес (первый аргумент) в заданную цепочку (второй аргумент). Это мы уже проходили.

Скрипты, вызываемые из rsyslogd, должны выполняться очень быстро. Работа скрипта блокирует демона. Так что если скрипту может потребоваться длительное время, имеет смысл создать вокруг него обёртку, которая будет вызывать его в фоне, а сама завершаться.

Автор: ; опубликовано в: Администрирование, Безопасность; метки: iptables, Linux, rsyslogd, безопасность
21
Апр
2010

RSS Комментарии к статье «Борьба с ботами-взломщиками средствами rsyslogd» (7)  »

  1. [...] This post was mentioned on Twitter by Интернет заработок. Интернет заработок said: V.Kolesnikov: Борьба с ботами-взломщиками средствами rsyslogd http://bit.ly/aVBGnQ [...]

  2. Кое что не совсем понятно, но буду разбираться. А вообще, спасибо! :)

  3. Очень познавательная и интересная статья. Мне понравилось, побольше таких статей.

  4. Иван Горденков

    Этот вариант мне куда больше нравится, чем первых 2… спасибо:)

  5. Laym

    Спасибо за статью. Но для того чтобы понять что как работает мне надо прочитать ее еще пару раз. но все равно спасибо.

  6. Alexander

    А есть еще такая штука, как fail2ban, ее не пробовали использовать?

    В заметке отсутствует самый главный файл ban.sh )

    • не пробовали использовать?

      Пробовал. Просто стояла цель обойтись минимальным числом подручных средств — идея в том, чтобы на все вспомогательные средства затратить минимум оперативной памяти.

      В заметке отсутствует самый главный файл ban.sh )

      Присутствует — самый последний скрипт.

      На практике он может быть сложнее; мы используем что-то вида

      [-]
      View Code Bash
      #! /bin/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:

      [-]
      View Code Text
      #include <tunables/global>

      /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,
      }

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

Оставить комментарий к записи «Борьба с ботами-взломщиками средствами rsyslogd»

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

*

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

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

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

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