Ars Longa, Vita Brevis

Защищаем компьютер от проникновения путём подбора пароля

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

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

  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:

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:

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:

watchfor /: error,relay=/
mail addresses=<a href="http://blog.sjinks.org.ua/tag/securi