LinuxForum.Fans
Тема

Подскажите, как закрыть брутфорс с помощью правил iptables

Автор: waldi 23 сообщений 6425 просмотров
#107342

Администрирую удаленно сервер, хочу настроить iptables от брутфорс атак, подбирают логин и пароль юзера ssh каждые несколько секунд. Я логинюсь не как рут,
Так вот, чтобы при отладке фильтров iptables не заблокировать себя по ошибке, настроил крон, чтобы он эти самые правила iptables каждые 10 мин удалял пока я не буду уверен, что фильтры работают правильно.
#crontab -u root -e
*/10 * * * * /sbin/iptables -F
Не подскажете ли код файла правил /etc/iptables.up.rules, чтобы был открыт порт 22 для ssh через eth0, максим. количество подключений к ssh, например, не более 8 в мин, и еще, как запретить для подключения перечень ip, пытающихся ломать?

И еще, стоит ли перевешивать ssh на другой порт? В нете по этому поводу разные мнения, много написано,
Если да, то значит ли это откорректировать в файле /etc/ssh/sshd_config директиву Port 'другой_порт'? И какое значение 'другой_порт' указывать?
И последнее, я новичок. Cмотрю на сервере логи и вижу,что при подключении по ssh на сервере генерируются значения порта пятизначные, если не ошибаюсь, каждый раз новые, ну никак не со значением 22 как в конфиге прописано,
Что это может значить?

#107352
waldi написал:
И еще, стоит ли перевешивать ssh на другой порт?

да.

waldi написал:
В нете по этому поводу разные мнения, много написано,

где написано что "не нужно"?

waldi написал:
И какое значение 'другой_порт' указывать?

[console]echo $RANDOM[/console]
только не забудьте.

waldi написал:
И последнее, я новичок. Cмотрю на сервере логи и вижу,что при подключении по ssh на сервере генерируются значения порта пятизначные, если не ошибаюсь, каждый раз новые, ну никак не со значением 22 как в конфиге прописано,
Что это может значить?

так ведь 2 канала открываются: входящий и исходящий. Если вы логинитесь на сервер, и отправляете пакеты на 22й порт, то к вам они идут на какой-то случайный >1024. Ваша система и выбирает этот порт во время "рукопожатия" (кавычки зря, это официальный термин из RFC). Кстати, так для любого TCP соединения - в первом пакете (на сервер) указан IP и порт того, кто отправил (обратный адрес, дом и номер квартиры).

waldi написал:
Я логинюсь не как рут,

очень плохо. Дело в том, что враг знает, что есть юзер root, и может подобрать его пароль. Вот если-бы вы логинились как zx7523, то врагу было-бы куда как сложнее. (чёрт, НЕ не заметил. Тогда всё нормально)

И ещё: для того, что-бы не забивать себе голову, создайте пару ключей, и публичный поместите на сервер. Тогда он может отличить вас без всякого пароля, а брутефорс будет невозможен в принципе. Вам будет грозить только кража вашего секретного ключа, который вам никуда передавать не нужно (а потому перехватить его невозможно).

ЗЫЖ Да, а блочить через iptables не нужно. Если так уж хочется, то есть специальные программки для этого. Но толку от них ИМХО нет никакого, если порт иной, и авторизация по ключу (а root'у просто запрещено в конфиге sshd).

#107375

Большое спасибо, уважаемый drBatty, за ответ!
Но я не все понял, извините, если мои дополнительные вопросы покажутся туповатыми

Во-первых, для изменения значения порта ssh на сервере необходимо в директиве Port номер_порта в файле /etc/ssh/sshd_config в качестве номера_порта указать случайное 4-значное целое число >1024, например 1234,
потом на сервере /etc/init.d/sshd restart. правильно?

Во-вторых, нужно ли на клиентских машинах, с которых хожу по ssh на удаленный сервер,точно так же менять значение порта на то же самое, что и установил на сервере?

В-третьих, я хожу по ssh на удаленный сервер с разных систем: putty из-под windows XP, suse, debian lenny. Если поменяю значение порта ssh на сервере, то должен буду также поменять значение порта ssh в настройках систем, с которых хожу, правильно?

В-четвертых, если я установлю аутентификацию пароля ssh, то значит ли это, что аутентификацию надо делать отдельно в каждой из систем?
Приватный ключ один и тот же будет лежать в каждой системе, а публичный один на удаленном сервере, правильно?
Будет ли при этом корректно работать putty из-под windows XP?

#107390
waldi написал:
Во-первых, для изменения значения порта ssh на сервере необходимо в директиве Port номер_порта в файле /etc/ssh/sshd_config в качестве номера_порта указать случайное 4-значное целое число >1024, например 1234,
потом на сервере /etc/init.d/sshd restart. правильно?

ага.

waldi написал:
Во-вторых, нужно ли на клиентских машинах, с которых хожу по ssh на удаленный сервер,точно так же менять значение порта на то же самое, что и установил на сервере?

конечно.

waldi написал:
В-третьих, я хожу по ssh на удаленный сервер с разных систем: putty из-под windows XP, suse, debian lenny. Если поменяю значение порта ssh на сервере, то должен буду также поменять значение порта ssh в настройках систем, с которых хожу, правильно?

да, на всех машинах. иначе будет не зайти.
в путти есть для этого настройка.

waldi написал:
В-четвертых, если я установлю аутентификацию пароля ssh, то значит ли это, что аутентификацию надо делать отдельно в каждой из систем?

не обязательно, но желательно. На сервере таким образом будет свой ключ на каждый клиент.

waldi написал:
Приватный ключ один и тот же будет лежать в каждой системе, а публичный один на удаленном сервере, правильно?

желательно разные ключи. Вдруг один из них будет скоррумпирован? Или вам просто захочется отключить одну из машин?

waldi написал:
Будет ли при этом корректно работать putty из-под windows XP?

вроде-бы она такое умеет. я предпочитаю заходить со своей системы (например с USB диска загружаюсь).

#107397

Большое спасибо за исчерпывающий ответ и удачи Вам!

#107639

смысла перевешивать с 22 порта на какой то другой не вижу.
это спасет только от самых тупых ботов, но от них же спасает хороший пароль, поэтому зачем перевешивать?

#107850

В продолжение темы
Сегодня экспериментировал с заменой порта ssh, на машине debian lenny сделал
/etc/ssh/sshd_config
#PORT 22
PORT 1289
/etc/init.d/ssh reload
Команда nmap localhost новый порт видит, но называет его не ssh, а что-то типа hotline
Прежде. чем менять порт ssh на удаленном сервере, проэкспериментировал на машине suse, которая у меня в локальной сети с машиной debian, debian шлюз, порт 22 ssh между ними работает
Так вот на suse делаю
/etc/ssh/sshd_config
PORT 1289
/etc/ssh/sshd restart

При попытке подсоединиться с suse на debian по ssh и наоборот с debian на suse выдает сообщение "connection refused on Port 22" , подскажите, пожалуйста, что делаю не так?

#107947
antaeus написал:
смысла перевешивать с 22 порта на какой то другой не вижу.

про это есть старый еврейский анекдот...
ваше дело, не хотите закрывать на цепочку - не надо.

#107950
waldi написал:
При попытке подсоединиться с suse на debian по ssh и наоборот с debian на suse выдает сообщение "connection refused on Port 22" , подскажите, пожалуйста, что делаю не так?

на клиенте настраивается ~/.ssh/config
на сервере настраивается /etc/ssh/sshd_config

одна машина == сервер, другая == клиент. Клиент подсоединяется к серверу.

#108120

Да, действительно suse у меня клиент, а debian - сервер и заодно шлюз из локалки наружу, ssh между ними по 22 порту работает исправно, но с конфигами ssh тут вот какая особенность.
И на сервере debian, и на клиенте suse лежат по два конфига(оба) /etc/ssh/ssh_config и /etc/ssh/sshd_config. В обоих конфигах /etc/ssh/ssh_config директива Port 22 ранее была закомментирована, когда ssh работал по 22 порту.
Но у меня, в отличие от того что Вы сказали, бинарник sshd на клиенте, а на сервере лежит бинарник ssh.
Это так должно быть? Я в администрировании новичок, раньше только программировал.

Короче, путем экспериментов дошел до следующего. Новый порт ssh 1289 заработал в обе стороны (с сервера на клиент и обратно) только после того, как исправил во всех четырех вышеперечисленных конфигах ssh порт 22 на порт 1289 , а потом рестартовал апач и на сервере, и на клиенте. Рестарта ssh было недостаточно.
Как должно быть у опытных- не знаю, но у меня вышло только так.

#108173
waldi написал:
Новый порт ssh 1289 заработал в обе стороны

Браво, и теперь все знают ваш порт smile , хотя бы написали бы так: Новый порт ssh заработал в обе стороны Хотя ни кто вам не мешает перевесить на другой порт smile

#108203

спасибо за комплимент, но ясно, что порт я указал наугад, реальный другой, просто хотелось знать мнение профессионалов, почему без рестарта апача у меня не обошлось, может, есть еще какая- то хитрость, подскажите

#108215
waldi написал:
просто хотелось знать мнение профессионалов, почему без рестарта апача у меня не обошлось,

причем здесь apache? oO Вроде бы речь идет об ssh, или я что то упустил?

#108520

да ни причем, просто опыта было мало, дошел, что работает и без рестарта апача


Но вот на первый мой вопрос так никто из спецов и не ответил

Господа профи, подскажите, какую строчку вставить в код файла правил /etc/iptables.up.rules, чтобы количество подключений к ssh было, например, не более 8 в мин, а также, какую еще одну строчку в файл правил вставить, чтобы запретить для подключения перечень ip, пытающихся ломать?
И еще, достаточно ли будет только этих двух строчек в файле правил, не заблокирую ли я свой удаленный сервер, если не буду указывать ничего более, кроме этих двух строчек, я себя конечно кроном буду страховать, чтобы затирал эти правила раз в 5-10 мин на время отладки, но все равно впервые это делать страшновато

#108527
text
$IPT -A INPUT -p tcp -m state --state NEW --dport 22 -m recent --update --seconds 20 -j DROP
$IPT -A INPUT -p tcp -m state --state NEW --dport 22 -m recent --set -j ACCEPT

Вот это может поможет. Разрешает логиниться не более одно раза в 20 секунд.

#108707
xlin написал:
text
$IPT -A INPUT -p tcp -m state --state NEW --dport 22 -m recent --update --seconds 20 -j DROP
$IPT -A INPUT -p tcp -m state --state NEW --dport 22 -m recent --set -j ACCEPT

Вот это может поможет. Разрешает логиниться не более одно раза в 20 секунд.

Много читал умных мыслей на эту тему. В сухом остатке вынес следующее: сам sshd умеет делать это не хуже, а даже и лучше, чем iptables. А именно - в sshd.conf можно беспроблемно выставить нужный таймаут "на длинные ногти операционистки". Что есть для данной попытки соединения полный аналог блокирования соединения по iptables. Однако (что лучше) это блокирование совершенно не блокирует иные легальные соединения, которые возможны в это время. А вот блокировка по iptables такие легальные соединения будет пропускать с интервалом в 20 секунд. Когда ты один - это не имеет значения. А если на сервер ходит много народу (например, по ремутному доступу через NX сколько времени потребуется для регистрации 20-30 душ юзеров? Да они полдня будут в ремутную сессию заходить). Единственный недостаток блокирования брутфорса в sshd.conf, что я вижу - забивание регистрационных журналов регистрацией этой хрени.

#108714
waldi написал:
Господа профи, подскажите, какую строчку вставить в код файла правил /etc/iptables.up.rules, чтобы количество подключений к ssh было, например, не более 8 в мин, а также, какую еще одну строчку в файл правил вставить, чтобы запретить для подключения перечень ip, пытающихся ломать?

что вы так к iptables привязались, одного iptables будет мало.
далее man sshd_config
так же смотрим
/etc/host.alloe
/etc/host.deny
на наличие sshd

еще один вариант:

в /etc/inetd.conf ищем ssh и привидем к такому виду:

text
ssh stream tcp nowait/0/3 root /usr/sbin/sshd sshd -i -4

это означает лимит 3 соединения в минуту с одного IP-адреса, и не забудем перезапустить inetd:

text
killall -HUP inetd 

еще вариант, это прикрутить sshdguard .

Вам уже дали массу примеров как это реализовать. вы хоть что нибудь сделали ???

#109180
Cruiser78 написал:
[quote=xlin]
text
$IPT -A INPUT -p tcp -m state --state NEW --dport 22 -m recent --update --seconds 20 -j DROP
$IPT -A INPUT -p tcp -m state --state NEW --dport 22 -m recent --set -j ACCEPT

Вот это может поможет. Разрешает логиниться не более одно раза в 20 секунд.

Много читал умных мыслей на эту тему. В сухом остатке вынес следующее: сам sshd умеет делать это не хуже, а даже и лучше, чем iptables. А именно - в sshd.conf можно беспроблемно выставить нужный таймаут "на длинные ногти операционистки". Что есть для данной попытки соединения полный аналог блокирования соединения по iptables. Однако (что лучше) это блокирование совершенно не блокирует иные легальные соединения, которые возможны в это время. А вот блокировка по iptables такие легальные соединения будет пропускать с интервалом в 20 секунд. Когда ты один - это не имеет значения. А если на сервер ходит много народу (например, по ремутному доступу через NX сколько времени потребуется для регистрации 20-30 душ юзеров? Да они полдня будут в ремутную сессию заходить). Единственный недостаток блокирования брутфорса в sshd.conf, что я вижу - забивание регистрационных журналов регистрацией этой хрени.[/quote]

Извините за глупый вопрос, но какой директивой в sshd_config нужно задавать этот timeout.
Я перелопатил маны по по ssh_config sshd_config
Какие из этих директив или их пары Вы имели в виду, когда говорили о возможности установить timeout?
ClientAliveInterval
ClientAliveCount
ClientAliveInterval
ServerAliveCount
ConnectTimeout

#109581

разобраться и настроить fail2ban

Войдите или зарегистрируйтесь, чтобы ответить.