от Vladsun(12-09-2006)

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

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

Повечето администратори виждат огромни логове за неуспешни (дай боже;) ) опити за 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
#!/bin/bash
  user_ip=`echo $SSH_CLIENT |
awk '{print $1}'`
  echo "-$user_ip" >
/proc/net/ipt_recent/bad_ssh
Какво прави той?
Първо намира ИП-адреса на логнатия потребител и второ премахва  ИП адреса му от списъка със следените ИП-та. По този начин iptables правилата описани по-горе няма да задействат защитата по ИП/време.
Възможно е вместо описания начин за разрешаване на вече логнати потребители, към iptables правилата да се добави и --hitcount параметъра. По този начин се указва колко опита (валидни или не) за определен период от време (в случая 60 сек.) ще се допускат. Проверка за валидност на логин-а не се прави.


<< Полезни съвети за Firefox | Блокиране на автоматизирани атаки под Линукс и *BSD >>