от valqk(21-07-2006)

рейтинг (7)   [ добре ]  [ зле ]

Printer Friendly Вариант за отпечатване

Източник: http://webreality.org/content/view/18/3...

www.webreality.org

Както всяка система в интернет, напълно нормално е и вашия компютър - бил той сървър или настолната машина на която работите, да е подложена на постоянни опити за хакване от страна на всякакви навлеци в интернет.

Разбира се тези атаки могат да са от произволни script kiddies или от доста добри кракери.

Ако атакуващия вашата машина е от втория тип, или въобще няма да разберете, или ще е прекалено късно когато ви светне какво става или пък ще ви е трудно да го хванете. Както и да е, в тази статия не става дума за втория тип атакуващи.


Първия тип - скрипт юзърите, които свалят даден 'експлойт' (ако мога така да нарека brute force ssh скриптовете) и вкарването на речник с думи имат доста досаден ефект за всеки който наблюдава лог файловете си:

  1. Генерират доста излишен трафик
  2. Заемат ресурси на машината ви(дори и да са минимални в повечето случаи)
  3. Най досадното нещо - пълнят лог файловете с ненужна информация



Тази статия има за цел да ви запознае с техника която се използва за преждевременно блокиране на въпросните brute force атаки.

След доста ровене и проучване, в резултатите ми от търсенето се появи един доста интересно звучащ проект - blocksshd.

Може да бъде намерен на адрес: http://sourceforge.net/projects/blockss...

Проектът е стартиран от James Turnbull james@lovedthanlost_-_net и при първоначален поглед е нищо особенно - още един проект за блокиране на ssh атаките. След като го свалих и го разархивирах обаче, останах наистина очарован от кода на това малко и сладко програмче - написано на пърл, с малко зависимости и много красив код.

След бегъл поглед върху кода си казах 'Ееее... страхотно програмче, но защо няма поддръжка за BSD... жалко...'.
Секунда по късно ми хрумна мисълта... 'Защо пък не.....и започнах да дописвам кода за да може да се интегира с защитната стена pf'.

Избрах pf за интеграцията, защото това е стена, която има поддръжка във всички BSD системи и това пък значи, че може да се използва навсякъде.


И така започваме.

Както споменах по горе, програмката е писана на perl - т.е. ще е нужно той да е инсталиран, също така малко модули от cpan.org:
Sys::Syslog Sys::Hostname File::Tail Net::DNS::Resolver Proc::Daemon Proc::PID::File Getopt::Long

Това са нужните зависимости - моля ако операционната ви система е с пакетна система, да ги инсталирате през нея, ако не - на ръка.


След като осигурите необходимите зависимости, разархивирате програмката.
В пакета има стандартните README, CHANGES, INSTALL, CREDITS, blocksshd - самото програмче и blocksshd.conf - конфигурационния файл.
Също така, има директория init в която може да се открие rc стартиращ скрипт подходящ за повечето линукс дистрибуции.


Разположението на файловете е по желание, като за да сработи без да редактирате blocksshd файла, трябва да сложите blocksshd.conf в /usr/local/etc/ , ако искате, разбира се, може да пипнете самия пърл скрипт.

Нека да видим съдържанието на blocksshd.conf:

--------------------

# vim: syntax=perl

$cfg = {
   os              => 'linux', # Target OS - either linux or bsd
   chain           => 'blocksshd', # Name of iptables or pf chain
   logfile         => '/var/log/secure', # Log file to monitor
   logcheck        => '10', # How often to check the log file
   max_attempts    => '4', # Max number of failures
   timeout         => '360', # Reset IP count if no activity after time out in seconds
   unblock         => '1', # Enable unblocking
   unblock_timeout => '43200', # Time in seconds after which to unblock a blocked IP address
   restore_blocked => '0', # Turn on checking for previously blocked IPs
   log_ips         => '/usr/local/etc/blocksshd.list', # Log file for blocked IPs
   pid_file        => '/var/run/blocksshd.pid', # Location of PID file
   send_email      => '1', # Enable the sending of email notifications
   email           => 'root', # Email address to send notifications
   mail            => '/bin/mail', # Location of mail binary    
   iptables        => '/sbin/iptables', # Location of iptables binary - only for Linux
   pfctl           => '/sbin/pfctl', # Location of pfctl binary - only for BSD
   whitelist       => [qw{
                       127.0.0.1
                   }], # whitelist - list of IPs that will never be blocked
};

#leave 1; here!
1;

--------------------

Тук е представена конфигурацията, която ида по подразбиране с пакета.

Нека я разгледаме ред по ред.

На първия ред е указано ако отваряме файла с vim редактор, как той да оцвети кода. Не мисля, че е нужно да го променяте.

На следващия ред се създава хеш, който после програмката да може да чете директно. Ако искате да работи не пипайте(освен разбира се ако знаете какво правите).

По надолу започва същинската настройка.

Всяка стойност трябва да е във вида:

key => 'value',

Последния ред от стойностите трябва да е без ,

Нека да опиша и кое какво значи(въпреки, че опциите са разбираеми от пръв поглед).

   * os - тип на операционната система - linux или bsd.От тук програмката разбира коя стена да ползва.
   * chain - това е името на 'веригата' във вашата стена, дори и да го оставите по подразбиране, после само ще трябва да добавите DENY или block правило за пакетите от тази верига(описано по долу).
   * logfile - файла в който се записват заявките ви за аутентикация.
   * logcheck - интервала през който се проверява по горния файл.
   * max_attempts - максимален брой грешни аутентикаций от даден арес, преди да се блокира.
   * timeout - време след което се рестартира брояча за грешни опити за влизане.
   * unblock - флаг 1/0 който указва дали блокираните адрес да се разблокират.
   * unblock_timeout - период след който блокираните адреси биват разблокирани, ако е позволено автоматично разблокиране.
   * restore_blocked - флаг 1/0 който указва дали при стартиране на blocksshd да се възтанови блокажа на адреси от блокираните преди неговото спиране.
   * log_ips - указва пътя към файл в който, ще се пазят всички блокирани адрес и в последствие ако е пусната опцията restore_blocked, те ще бъдат четени от този файл.
   * pid_file - указва къде ще се пази файла в който е записан номера на процеса на blocksshd (PID file).
   * send_email - флаг 1/0 - пуска или спира изпращането на е.поща при добавяне на нов адрес в списъка с блокираните.
   * email - Е.поща на която да бъде изпратено уведомяването, ако е пуснато.
   * mail - Указване на пътя към стандартната mail програма на линукс/*BSD.
   * iptables - Указване на пътя към програмата iptables.
   * pfctl - Указване на пътя към програмата pfctl.
   * whitelist - Списък с адреси, които не трябва да се блокират.Адресите се вписват В къдравите скоби - един адрес на ред.




Това са всички опции, които blocksshd предлага (за сега - 19.07.2006).

В зависимост от ОС ви система, във вашите 'огнени стени'(firewalls) ще трябва да добавите по 1 ред.
Той ще служи да блокира връзките които са добавени в съответната верига(chain) от blocksshd.

За Линукс ОС в най общия случай и най просто изпълнение, ви трябва да изпълните този ред като супер потребител(root):

#> iptables -I INPUT -p tcp -m tcp --dport 22 -j




Където е името, което сте написали в конфигурационния файл - chain опцията.

ВНИМАНИЕ: Поради различните начини на зареждане на линукс системите, трябва да прочетете в страницата на вашата дистрибуция, как да накарате този ред да се зарежда при всеки старт на машината.

След като имате правило, което забранява връзката към вас от списъка с блокирани адрес, ще трябва да стартирате blocksshd да работи постоянно на вашата машина.

Тъй като за нормална работа blocksshd, трябва да работи като daemon(демон) в паметта, може да използвате скрипта от init директорията, на пакета и да го добавите в стартиращите скриптове на вашия Линукс.

Възможно е стартиране на ръка(за тестови цели или писане на собствени inir скриптове.

За да стартирате blocksshd в не резидентен режим просто извиквате изпълнимия файл: /usr/local/sbin/blocksshd или където сте го сложили. За да го пуснете да работи като демон blocksshd се вика с опция --start за пускане и --stop за спиране.

#>/usr/local/sbin/blocksshd --start

#>/usr/local/sbin/blocksshd --stop





За FreeBSD (може би и за другите *BSD системи - не съм тествал, моля за коментар) ще трябва да добавите това правило в /etc/pf.conf някъде преди последните редове:

block in on $ext_if proto tcp from  to me port { 21,22 }



Където chain е името на веригата от конфигурацията.
След като запазите промяната в /etc/pf.conf, ще трябва да презаредите правилата с командата:

#>pfctl -f /etc/pf.conf




След като я изпълните, ако разбира се ползвате pf защитната стена, вече ще имате правило което да блокира връзките от -а.

Ако не използвате pf защитна стена, ще трябва да я разрешите за използване от /etc/rc.conf (man rc.conf и търсите pf).
След като я разрешите, ако не искате да рестартирате и да разрешите pf изпълнете командата:

#>pfctl -e



За статистики на pf, може да пробвате:

#>pfctl -sa



или да си прочетете: pf manual.

Тъй като при *BSD (и конкретно при FreeBSD) стартиращите скриптове са организирани по съвсем различен начин от Линукс, ще се наложи да ползвате старт скрипта който ще дам по долу, докато направя порт за FreeBSD и го кача тук.

blocksshd.sh

#!/bin/sh
#
# $FreeBSD: ports/sysutils/blocksshd/files/blocksshd.in,v 1.2 2006/07/13 03:37:57 dougb Exp $
#

# PROVIDE: blocksshd
# REQUIRE: DAEMON
# KEYWORD: shutdown

#
# Add the following lines to /etc/rc.conf to enable blocksshd:
#
#blocksshd_enable="YES"
#
# See blocksshd.conf.
#

. /etc/rc.subr

name=blocksshd
rcvar=`set_rcvar`

blocksshd_pidfile="/var/run/blocksshd.pid"

command="/usr/local/sbin/blocksshd"
start_precmd="print_start"
start_cmd="${command} --start"
stop_precmd="print_stop"
stop_cmd="${command} --stop"

command_args=" "
# set defaults

blocksshd_enable=${blocksshd_enable:-"NO"}
blocksshd_conf=${blocksshd_conf:-"/usr/local/etc/blocksshd.conf"}
blocksshd_flags=${blocksshd_flags:-""}


load_rc_config ${name}

required_files=${blocksshd_conf}

print_stop() {
   echo "Stopping ${name}."
   return 0
}

print_start() {
   echo "Starting ${name}."
}

run_rc_command "$1"




Поставете този файл в /usr/local/etc/rc.d/.

Отворете /etc/rc.conf и добавете:

blocksshd_enable="YES"



след което изпълнете:

/usr/local/etc/rc.d/blocksshd.sh start



и сте готови, сега при всеки старт на системата ще се стартира и blocksshd.

Ако някой пусне програмката под други BSD системи и си направи стартиращи скриптове, моля да ги прати на  за да ги добавя в пакета.

Малко самореклама - pfctl интеграцията и възможността за записване на всички блокирани адрес и възтановяването им при старт са моя реализация.

Всякакви коментари и подобрения са добре дошли!

---------------------------------------
Anton Blajev - www.webreality.org team


<< Проста защита за SSH атаки (bruteforce, dictionary) | Понижаване на напрежението на Pentium M >>