Устав от того, что ко мне на компьютер ломятся всякие придурки юные кулхацкеры, я решил принять меры.

Товарищи кулхацкеры лезут в систему с трёх сторон:

  1. Путем подбора пароля на SSH.
  2. Путем подбора пароля на FTP.
  3. Пытаясь использовать компьютер в качестве релея (это уже спамеры).

Есть и другие поползновения (например, попытки достучаться до MySQL, к которому снаружи добраться в принципе невозможно; или пытаясь навести "злобные пинги"), но три вышеописанных метода меня раздражают больше всего.

Стратегия защиты:

  1. SSH: после трех неудачных паролей в течение минуты — в бан.
  2. FTP: после трех неудачных паролей в течение минуты — в бан.
  3. Mail: после первой же попытки использовать компьютер в качестве релея — в бан (и в блэклист, в идеале).

Итак, приступим. Сразу оговорюсь, что все действия нужно выполнять из-под root

Прежде всего нам понадобится замечательный пакет swatch:

[-]
View Code Bash
apt-get install swatch

Теперь некоторые предположения о системе:

  1. sshd записывает неудачные попытки входа в систему в файл /var/log/auth.log
  2. vsftpd записывает неудачные попытки входа в систему в файл /var/log/vsftpd.log
  3. courier записывает неудачные попытки релея в файл /var/log/mail.err
  4. postfix записывает неудачные попытки релея в файл /var/log/mail.log

У меня до вчерашнего вечера стоял courier, потом я поставил postfix, поэтому привожу варианты и для одного агента, и для другого.

Блокировку нехороших товарищей будем осуществлять при помощи iptables.
Начнём с предварительной настройки iptables:

[-]
View Code Bash
touch /etc/hosts.badssh
touch /etc/hosts.badftp
touch /etc/hosts.badrelay

iptables -N swatch_ssh_rejects

for ip in `cat /etc/hosts.badssh`; do
    iptables -I INPUT -p tcp --dport 22 -s $ip -j DROP
done

iptables -N swatch_ftp_rejects

for ip in `cat /etc/hosts.badftp`; do
    iptables -I INPUT -p tcp --dport 21:22 -s $ip -j REJECT --reject-with tcp-reset
done

iptables -N swatch_relay_rejects

for ip in `cat /etc/hosts.badrelay`; do
    iptables -I INPUT -p tcp --dport 25 -s $ip -j REJECT --reject-with tcp-reset
done

iptables -I INPUT -j swatch_ssh_rejects
iptables -I INPUT -j swatch_ftp_rejects
iptables -I INPUT -j swatch_relay_rejects

Данные о нарушителях будут помещаться в один из следующих файлов: /etc/hosts.badssh, /etc/hosts.badftp, /etc/hosts.badrelay. Можно было запросто обойтись только одним файлом, но я веду свою статистику. В принципе, банить можно жестче:

[-]
View Code Bash
iptables -I INPUT -s $ip -j DROP

Но я добрый :-) Пока.

Теперь создаём конфигурационные файлы для swatch.
/etc/swatch_ssh.conf:

[-]
View Code Text
watchfor /: Invalid user /
threshold track_by=$1,type=both,count=3,seconds=60
mail addresses=security\@example.org,subject="SSH:\ Invalid\ User\ Access-Banned"
exec "/sbin/iptables -A swatch_ssh_rejects -p tcp --dport 22 -s $10 -j DROP"
exec "echo $10 >> /etc/hosts.badssh"
continue

/etc/swatch_vsftpd.conf:

[-]
View Code Text
watchfor / FAIL LOGIN: Client /
threshold track_by=$1,type=both,count=3,seconds=60
mail addresses=security\@example.org,subject="FTP:\ Invalid\ User\ Access-Banned"
exec "/usr/local/sbin/ban_ftp.sh '$_'"
continue

/etc/swatch_smtp.conf для Courier:

[-]
View Code Text
watchfor /: error,relay=/
mail addresses=security\@example.org,subject="Mail:\ Relaying\ Attempt-Banned"
exec "/usr/local/sbin/ban_relay_courier.sh $6"
continue

/etc/swatch_smtp.conf для Postfix:

[-]
View Code Text
watchfor /: Relay access denied;/
mail addresses=security\@example.org,subject="Mail:\ Relaying\ Attempt-Banned"
exec "/usr/local/sbin/ban_relay_postfix.sh $10"
continue

Теперь дополнительные файлы (у меня не получилось интегрировать их непосредственно в конфиги swatch).

/usr/local/sbin/ban_ftp.sh:

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

IP=`echo $1 | grep -E -o 'FAIL LOGIN: Client "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+"' | awk '{ print $4 }' | sed 's/"//g'`
/sbin/iptables -A swatch_ftp_rejects -p tcp --dport 21:22 -s $IP -j REJECT --reject-with tcp-reset
echo $IP >> /etc/hosts.badftp

/usr/local/sbin/ban_relay_courier.sh:

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

IP=`echo $1 | sed s/error,relay=::ffff:// | sed "s/,.*//"`
/sbin/iptables -A swatch_relay_rejects -p tcp --dport 25 -s $IP -j REJECT --reject-with tcp-reset
echo $IP >> /etc/hosts.badrelay

/usr/local/sbin/ban_relay_postfix.sh:

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

IP=`echo $1 | grep -o -E '\[[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\]:' | grep -o -E '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'`
/sbin/iptables -A swatch_relay_rejects -p tcp --dport 25 -s $IP -j REJECT --reject-with tcp-reset
echo $IP >> /etc/hosts.badrelay

Теперь файл для запуска swatch (/etc/init.d/swatchrc):

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

kill -9 `cat /var/run/swatch_ssh.pid`
kill -9 `cat /var/run/swatch_smtp.pid`
kill -9 `cat /var/run/swatch_vsftpd.pid`
rm -f /var/run/swatch*.pid

swatch --tail-file=/var/log/auth.log --config-file=/etc/swatch_ssh.conf --awk-field-syntax --pid-file=/var/run/swatch_ssh.pid --tail-args='--follow=name -n 0' --daemon

# Для Courier
swatch --tail-file=/var/log/mail.err --config-file=/etc/swatch_smtp.conf --awk-field-syntax --pid-file=/var/run/swatch_smtp.pid --tail-args='--follow=name -n 0' --daemon

# Для Postfix
swatch --tail-file=/var/log/mail.log --config-file=/etc/swatch_smtp.conf --awk-field-syntax --pid-file=/var/run/swatch_smtp.pid --tail-args='--follow=name -n 0' --daemon

swatch --tail-file=/var/log/vsftpd.log --config-file=/etc/swatch_vsftpd.conf --awk-field-syntax --pid-file=/var/run/swatch_vsftpd.pid --tail-args='--follow=name -n 0' --daemon

Делаем файлы исполняемыми:

[-]
View Code Bash
chmod a+x /etc/init.d/swatchrc
chmod a+x /usr/local/sbin/ban_ftp.sh
chmod a+x /usr/local/sbin/ban_relay*.sh

И запускаем swatch:

[-]
View Code Bash
/etc/init.d/swatchrc

Ждём гостей :-)

Добавить в закладки
  • del.ici.ous
  • Digg
  • Furl
  • Google
  • Simpy
  • Spurl
  • Y! MyWeb
  • БобрДобр
  • Мистер Вонг
  • Яндекс.Закладки
  • Текст 2.0
  • News2
  • AddScoop
  • RuSpace
  • RUmarkz
  • Memori
  • Закладки Google
  • Писали
  • СМИ 2
  • Моё Место
  • Сто Закладок
  • Ваау!
  • Technorati
  • RuCity
  • LinkStore
  • NewsLand
  • Lopas
  • Закладки - I.UA
  • Connotea
  • Bibsonomy
  • Trucking Bookmarks
  • Communizm
  • UCA

Связанные записи

14
Июнь
2008

Комментарии к статье «Скажи “Нет!” взломщику» (5)  »

  1. Vladimir says:

    Бонус: парочка скриптов для анализа логов.

    1. Кто лез к нам по SSH:
      [-]
      View Code Bash
      #! /bin/sh

      if [ x$1 = x ]; then
          FILE=/var/log/auth.log
      else
          FILE=$1
      fi

      cat $FILE | grep " sshd\[" > /tmp/sshd.log
      # Левые пользователи
      cat /tmp/sshd.log | grep "Invalid user " | awk '{ print $10 }' | sort | uniq > /tmp/sshd_user
      # Неверные пароли для существующих пользователей
      cat /tmp/sshd.log | grep -E "Failed password for [a-zA-Z0-9_-]+ from " | awk '{ print $11 }' | sort | uniq > /tmp/sshd_pass
      # Кто нас проверял на наличие SSH
      cat /tmp/sshd.log | grep "Did not receive" | awk '{ print $12 }' | sort | uniq > /tmp/sshd_noident
      [ -s /tmp/sshd_user ] && echo "Intruders" && cat /tmp/sshd_user
      [ -s /tmp/sshd_pass ] && echo "Wrong password" && cat /tmp/sshd_pass
      [ -s /tmp/sshd_noident ] && echo "No identification string" && cat /tmp/sshd_noident
      rm -f /tmp/sshd.log /tmp/sshd_user /tmp/sshd_pass /tmp/sshd_name /tmp/sshd_noident
      exit 0
    2. Кто лез к нам по FTP (для vsftpd):
      [-]
      View Code Bash
      #! /bin/sh

      if [ x$1 = x ]; then
          FILE=/var/log/vsftpd.log
      else
          FILE=$1
      fi

      # cat $FILE | grep "FAIL LOGIN: Client" | awk '{ print $12 }' | sed s/\"//g | sort | uniq
      cat $FILE | grep -E -o 'FAIL LOGIN: Client "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+"' | awk '{ print $4 }' | sed 's/"//g' | sort | uniq
      exit 0
    3. Здесь вам не релеи (для Courier):
      [-]
      View Code Bash
      #! /bin/sh

      if [ x$1 = x ]; then
          FILE=/var/log/mail.err
      else
          FILE=$1
      fi

      cat $FILE | grep relay | awk '{ print $6 }' | sed s/error,relay=::ffff:// | sed s/,.*// | sort | uniq
      exit 0
    4. Здесь вам не релеи (для Postfix):
      [-]
      View Code Bash
      #! /bin/sh

      if [ x$1 = x ]; then
          FILE=/var/log/mail.log
      else
          FILE=$1
      fi

      cat $FILE | grep -o -E '\[[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\]:' | grep -o -E '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | sort | uniq
      exit 0

    Надеюсь, кому-нибудь пригодится.

    scripts.tar.bz2

  2. Аким says:

    как вариант против кул-хацкеров из рецептов от одного знакомого админа: запускаем sshd на каком-то другом порту 1234, а за коннект в 22му сразу в blacklist. очень помагает :)

  3. Vladimir says:

    Это да, главное самому номер порта помнить :-)

    А вообще — аутентификация по ключу, а за попытку логина по паролю в бан.

  4. Vladimir says:

    Еще один красивый способ:

    [-]
    View Code Bash
    iptables -A INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --set
    iptables -A INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --update --seconds 600 --hitcount 5 -j DROP
    iptables -A INPUT -p tcp --dport 22 -i eth0 -j ACCEPT

Подписаться на RSS-ленту комментариев к статье «Скажи “Нет!” взломщику» Trackback URL: http://blog.sjinks.org.ua/security/194-say-no-to-intruder/trackback/

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

Вы можете использовать данные тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

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

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