|
|
|
Съвети>Сигурност
|
Блокиране на автоматизирани атаки под Линукс и *BSD
|
|
|
|
|
|
от valqk(21-07-2006)
рейтинг (7)
[ добре ]
[ зле ]
Вариант за отпечатване Източник: 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 >>
|
|
|
|
|
re: От: DarkAvenger <dark_av80__at__abv __точка__ bg> На: 20-07-2006@11:41 GMT+2 Оценка: 1/НеутраленГотино но мисля 4е и по долното е достатъчно да откажеш някой .
iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -s $IP -j ACCEPT
iptables -A INPUT -p tcp --syn --dport 22 -m recent --name bad_ssh --update --seconds 60
iptables -A INPUT -p tcp --syn --dport 22 -m recent --name bad_ssh --set -j ACCEPT
[Отговори на този коментар]
Към: re: От: Vladsun <vsmin __@__ mail __точка__ bg> На: 21-07-2006@9:45 GMT+2 Оценка: 1/Неутрален;) малък пропуск :P
iptables -A INPUT -p tcp --syn --dport 22 -m recent --name bad_ssh --update --seconds 60 -j REJECT
[Отговори на този коментар]
ъъъ От: Симо На: 20-07-2006@14:29 GMT+2 Оценка: 1/Неутралензащо, толкова много правила ??
не е ли още по лесно :
iptables -P INPUT DROP
iptables -A INPUT -p tcp -m multiport -s $IP -d $IP2 --dport 22 -j ACCEPT
[Отговори на този коментар] И защо толкова писане? От: IID_Iunknown На: 21-07-2006@8:36 GMT+2 Оценка: 1/Неутраленtable <sshspammer> persist
pass in quick on $ext_if proto tcp to port ssh keep state (max-src-conn 10, max-src-conn-rate 6/15, overload <sshspammer> flush global)
[Отговори на този коментар] Поради 100 милиона причини ;) От: valqk <valqk< at >lozenetz __точка__ org> На: 21-07-2006@8:37 GMT+2 Оценка: 1/Неутрален@DarkAvenger
Ами много е просто.
1. Това е скрипт, който можеш да нагласиш както си искаш, докато иптаблес и пф не можеш.
2. Ако си зъл гейний, направи ми това на FreeBSD 5.5, поправка - 6.1 е с pf 3.7 sorry! Има вариант за нещо подобно с пф, но още не е имплементирано в fbsd 5.5.
3. има си и още причини, но ме мързи да пиша, тези са достъчни за сега.
---------
@Симо
Явно не ползваш машината си от много места и нямаш сложен сетъп.
Редактиран на: 21-07-2006@13:13
[Отговори на този коментар]
Към: Поради 100 милиона причини ;) От: big На: 21-07-2006@9:30 GMT+2 Оценка: 1/НеутраленНе разбирам защо трябва да се меси pf и iptables. Pf произхожда от OpenBSD и проблема за защита от bruteforce атаки се решава с един ред в pf.conf:
pass quick proto { tcp, udp } from any to any port ssh \
flags S/SA keep state \
(max-src-conn 15, max-src-conn-rate 5/3, \
overload <bruteforce> flush global)
което е достатъчно подробно описано в главата "Turning away the brutes" на:
http://www.bgnett.no/~peter/pf/en/pf-fi...
[Отговори на този коментар]
Към: Към: Поради 100 милиона причини ;) От: valqk <valqk __@__ lozenetz< dot >org> На: 21-07-2006@12:56 GMT+2 Оценка: 1/НеутраленТочно за това решение говорех, опитай се да го ползваш с FreeBSD 5.5.
Ако успееш кажи как :)
Редактиран на: 21-07-2006@13:08
[Отговори на този коментар]
ТУК?!?! От: Stash На: 21-07-2006@9:05 GMT+2 Оценка: 1/Неутраленмного хубаво ама да беше оправил линка към проекта :) тоест там където пише ТУК http://sourceforge.net/projects/blockss...
[Отговори на този коментар] благодаря. От: valqk <valqk (a) lozenetz __точка__ org> На: 21-07-2006@9:11 GMT+2 Оценка: 1/НеутраленБлагодаря за корекцията за линка!
Бях го пропуснал.
[Отговори на този коментар] Защо???? От: foxb На: 21-07-2006@18:27 GMT+2 Оценка: 1/НеутраленИнтересно решение, но най простото е да се смени порта на SSH на нещо различно от 22....
[Отговори на този коментар]
Към: Защо???? От: valqk <valqk< at >lozenetz< dot >org> На: 22-07-2006@21:55 GMT+2 Оценка: 1/НеутраленПонякога нямаш такава възможност за смяна на порт, иначе и на мен това ми е решението което правя почити всеки път.
[Отговори на този коментар]
малко помощ От: Блум На: 21-07-2006@19:50 GMT+2 Оценка: 1/НеутраленИзглежда имам някакъв проблем, показва в лога че работи правилно:
Jul 21 22:56:02 zigmund blocksshd[12746]: IP 70.86.80.130 reached the maximum number of failed attempts!
Jul 21 22:56:02 zigmund blocksshd[12746]: Blocking 70.86.80.130 in iptables table blocksshd.
Jul 21 22:56:02 zigmund blocksshd[12746]: Sending notification email to root
Обаче в следващия момент пак приема логин:
Jul 21 22:58:26 zigmund sshd[12861]: Accepted password for root from 70.86.80.130 port 57834 ssh2
В смисъл засича повече от необходимите опити за логин, но въпреки това не реджектва IP-то.
(това не е моето, на host.bg е, не си правете труда :)
iptables май си работят.. какво може да не е наред?
[Отговори на този коментар]
Към: малко помощ От: DarkAvenger На: 25-07-2006@7:18 GMT+2 Оценка: 1/НеутраленНе съм казал че твоето решение не е добро, просто давам алтернатива за някой на които му трябва по просто решение на проблема съответно и за по елементарна конфигурация.
[Отговори на този коментар]
Към: Към: малко помощ От: valqk <valqk (a) lozenetz< dot >org> На: 25-07-2006@8:08 GMT+2 Оценка: 1/НеутраленПрав си, хубаво е да има алтернативи :)
Просто за мен това беше най доброто решение, другия вариант е да мърджвам pf.
[Отговори на този коментар]
Към: малко помощ От: valqk <valqk (a) lozenetz__dot__org> На: 22-07-2006@21:58 GMT+2 Оценка: 1/НеутраленБи ли ми изпратил конфига и скрипта на пощата да тествам, тъй като при мен съм с леко модифицирана версия, не съм сигурен какво е пуснато официално :)
Мерси за отговора и тестинга :)
Сетих се и още нещо.
Да ми изпратиш състоянието на таблиците във файъруола при теб преди и сле блокиране - ако не е проблем и общите правила и chain-а.
мерси.
Редактиран на: 22-07-2006@21:59
[Отговори на този коментар] bruteforce глупости?? От: sphynx На: 26-07-2006@13:43 GMT+2 Оценка: 1/Неутралензащо просто не ползвате publickey auth вместо пароли? елементарно е на 1 usb stick да се съхраняват keys и всякакви brute force грижи отпадат!
[Отговори на този коментар]
Към: bruteforce глупости?? От: Vladsun <vsmin (a) mail__dot__bg> На: 26-07-2006@21:18 GMT+2 Оценка: 1/НеутраленЕ, тогава защо изобщо SSH се имплементира още с достъп по user/pass?!?!
Айде, стига с крайни изказвания.
Редактиран на: 26-07-2006@21:18
[Отговори на този коментар]
Към: Към: bruteforce глупости?? От: sphynx На: 27-07-2006@10:39 GMT+2 Оценка: 1/Неутраленти ме развесели :)
и telnet се имплементира още, но нали се сещаш и сам какви хора го ползват за отдалечено логване от wan...
[Отговори на този коментар] Към: Към: Към: bruteforce глупости?? От: Vladsun <vsmin< at >mail[ точка ]bg> На: 27-07-2006@14:56 GMT+2 Оценка: 1/НеутраленЧовек ... за всяко нещо си има приложение - колко "dedicated" устройства работят само и единствено през telnet, колко още работят само и единствено прес ssh с user/pass. Пример - MikroTik RouterOS 2.9.6 и по-ниска версия.
Не съм казал, че предложения от теб вариант не е по-добър - напротив, от гледна точка на сигурност е. Но, винаги могат да се появят неудобства (1 usb stick в тоалетната ;) ). Ако машината ти е "радио-релейка" на някоя 120 метрова мачта, искрено се надявам да не ти се случва.
[Отговори на този коментар] block in on $ext_if proto tcp from to me От: Боби На: 27-07-2006@19:35 GMT+2 Оценка: 1/НеутраленЯ вижте този ред за freebsd:
block in on $ext_if proto tcp from to me port { 21,22 }
Нещо изобщо не ми се струва правилен, а и pf не го приема (заменям $ext_if с rl0 при мен, разбира се).
[Отговори на този коментар] Към: block in on $ext_if proto tcp from От: valqk <valqk< at >lozenetz[ точка ]org> На: 28-07-2006@9:26 GMT+2 Оценка: 1/НеутраленИзпуснато е <blocktable> т.е. става:
block in on $ext_if proto tcp from <blocktable> to me port { 21,22 }
където <blocktable> е името на chain-a в който ти се добавят забранените адреси.
[Отговори на този коментар]
Алтернативно решение (добре развито) От: Topper <topper< at >abv__dot__bg> На: 8-08-2006@7:23 GMT+2 Оценка: 1/НеутраленАз ползвам нещо аналогично, проверено и добре развито. Последното, което въведоха е централизиран списък с бруталните юзъри (RBL ssh?).Има и FreeBSD поддръжка
http://denyhosts.sourceforge.net/
Ето и способностите на скрипта:
Parses /var/log/secure to find all login attempts and filters failed and successful attempts.
- Synchronization mode (new in 2.0) allows DenyHosts daemons the ability to share data via a centralized server to proactively thwart attacks.
- Can be run from the command line, cron or as a daemon (new in 0.9)
- Records all failed login attempts for the user and offending host
- For each host that exceeds a threshold count, records the evil host
- Keeps track of each non-existent user (eg. sdadasd) when a login attempt failed.
- Keeps track of each existing user (eg. root) when a login attempt failed.
- Keeps track of each offending host (with 0.8+ these hosts can be purged if the associated entry in /etc/hosts.deny is expired)
- Keeps track of suspicious logins (that is, logins that were successful for a host that had many login failures)
Keeps track of the file offset, so that you can reparse the same file (/var/log/secure) continuously (until it is rotated).
- Appends /etc/hosts.deny and adds the newly banned hosts
- Optionally sends an email of newly banned hosts and suspicious logins.
- Keeps a history of all user, host, user/host combo and suspicious logins encountered which includes the data and number of corresponding failed login attempts.
- Maintains failed valid and invalid user login attempts in separate files, such that it is easy to see which valid user is under attack (which would give you the opportunity to remove the account, change the password or change it's default shell to something like /sbin/nologin
- Upon each run, the script will load the previously saved data and re-use it to append new failures.
- Resolves IP addresses to hostnames, if available (new in v0.6.0).
- /etc/hosts.deny entries can be expired (purge) at a user specified time (new in 0.8)
[Отговори на този коментар]
Към: Алтернативно решение (добре развито) От: Josiff На: 11-08-2006@23:37 GMT+2 Оценка: 1/НеутраленАбе що не си пускате sshd на различен малоумен порт като 14356 примерно, ами се занимавате с глупости, че скриптове че незнам си какво.. Освен това слагаме PSD от P-O-M и блокираме с един ред по ламерските nmap сканирания - това е. Както е казал авторите целта на статията е да се покаже метод за борба със скрипт атаките - е защо толкова сложно за бога ..
[Отговори на този коментар]
Към: Към: Алтернативно решение (добре разв От: growchie <growchie__at__yahoo[ точка ]com> На: 24-08-2006@13:05 GMT+2 Оценка: 1/Неутраленабе по - гъзарско е така. Някои ISP-та шушумиги блокират всичко над 1024 порт за клинетие си, така че да имаш опция и 22 не е лоша идея.
[Отговори на този коментар]
|
|
|
|
|
|
|
|