от Vladsun(12-09-2006)
рейтинг (22)
[ добре ]
[ зле ]
Вариант за отпечатване
Повечето администратори виждат огромни логове за неуспешни
(дай боже;) ) опити за SSH логин чрез използване на слаби
пароли и често срещани потребителски имена. С увеличаването
на броя на потребителите, които се нуждаят от SSH достъп до
конзолата се увеличава и вероятността от пробив.
Съществуват много начини за защита от подобен вид атаки
(bruteforce или dictionary). Нека споменем някой от тях:
- смяна на порта на SSH услугата;
Често срещана практика, но при нарочна атака срещу самия
сървер лесно ще се открие на кой порт слуша sshd deamon-a.
Веднага ще се появят предложения за ползване на PSD (port
scan detection), но по същество PSD техниката
"опазва" всички портове, а не само определен. С
използването на подходящи опции на nmap, тази защита би
могла да се прекочи. Следващ проблем е man-in-the-middle
атаките, при които лесно се открива кой порт е за sshd. След
откриването на SSH порта започва втора атака насочена срещу
самите пароли;
- блокиране на определени ИП-та за определено време чрез
следене на системните логове;
Има много проекти базирани на този метод. На мен лично не
ми харесва идеята за периодичността на проверка на логовете.
- забрана за използване на user/pass, разрешаване само на
key-authorization;
Чудесна защита, стига обстоятелствата да ви позволяват
такова решение.
Предлаганото от мен решение се характеризира със следните
свойства:
- защита само на порт 22;
- защита при атаки от типа bruteforce и dictionary;
- липса на периодичност на проверка за невалидни опит за
логин;
- липса на зависимост от системните логове;
- простота на изпълнението;
- лесна промяна на параметрите на защитата;
Като нужен софтуер използвам само iptables + recent
patch-a. Не забравяйте да компилирате recent match-a като
модул за да можете да променяте дължината на таблиците от
ИП-та.
В защитната стена добавяме:
Защитна
стена |
iptables -N SSH
iptables -A INPUT -p tcp --dport 22 --syn -j SSH
iptables -A SSH -p tcp -s 127.0.0.1 -j RETURN
iptables -A SSH -p tcp --syn --dport 22 -m recent --name
bad_ssh --update --seconds 60 -j DROP
iptables -A SSH -p tcp --syn --dport 22 -m recent --name
bad_ssh --set -j RETURN |
Какво правят тези правила?
Първо се прихващат само опитите за инициализация на SSH
сесия. След това се проверява дали IP адреса от който се
получава този опит не е вече в списъка (bad_ssh) със следени
ИП-та и ако е се проверява дали интервала от времето на
последния му опит за инициализиране на SSH сесия към
текущото време е по-малък от 60 сек. Ако не, то syn-пакетa
се отхвърля и едновременно с това се обновява времето на
последния опит за връзка на това ИП. Ако ли да, то пакета
продължава по веригата надолу, като в същото време се прави
запис за времето на опит за достъп и ИП-то в списъка.
Ефектът от обновяването на времето при повторен опит е, че
се изисква поне 60 сек. следеното ИП да не прави повторен
опит за достъп.
С тези защитни правила би могло да се счита, че защитата е
изградена. Но съществува едно явно неудобство - дори при
валиден опит за достъп до SSH услугата, трябва да се изчакат
60 сек. за създаване на втора SSH сесия (лично аз отварям по
няколко конзоли). За преодоляването на това неудобство е
нужно да се следи кое ИП има валиден достъп до SSH сесия и
за него горните правила да не важат. Проверката за валидност
на сесията я правя чрез .bash_profile - изпълнява се при
всеки валиден логин на потребителя.
Създаваме (ако не съществува) .bash_profile във всяка home
директория на всеки потребител, който искаме да защитим. В
тези файлове трябва да има реда:
Код |
sudo
/usr/local/sbin/ssh_user_allow |
Забележете, че се използва sudo, така че групата
(или потребителите) трябва да са описани в /etc/sudoers
файла с root права за пускане на
/usr/local/sbin/ssh_user_allow. Това се налага заради 0644
разрешенията на /proc/net/ipt_recent/* файловете.
Самият файл /usr/local/sbin/ssh_user_allow е със следното
съдържание:
ssh_user_allow |
user_ip=`echo $SSH_CLIENT |
awk '{print $1}'`
echo "-$user_ip" >
/proc/net/ipt_recent/bad_ssh |
Какво прави той?
Първо намира ИП-адреса на логнатия потребител и второ
премахва ИП адреса му от списъка със следените ИП-та.
По този начин iptables правилата описани по-горе няма да
задействат защитата по ИП/време.
Възможно е вместо описания начин за разрешаване на вече
логнати потребители, към iptables правилата да се добави и
--hitcount параметъра. По този начин се указва колко опита
(валидни или не) за определен период от време (в случая 60
сек.) ще се допускат. Проверка за валидност на логин-а не се
прави.
<< Полезни съвети за Firefox | Блокиране на автоматизирани атаки под Линукс и *BSD >>
|