Сотни неудачных логинов SSH

81

Каждую ночь я получаю сотни, а иногда и тысячи неудачных логинов ssh на моем сервере RedHat 4. По причинам брандмауэра с удаленных сайтов мне нужно работать на стандартном порту. Есть ли что-то, что я должен сделать, чтобы заблокировать это. Я заметил, что многие приходят с одного IP-адреса. Разве это не должно остановить их через некоторое время?

MattMcKnight
источник

Ответы:

67

Вы можете использовать iptables для ограничения скорости новых входящих подключений к порту SSH. Мне нужно было бы увидеть всю вашу конфигурацию iptables, чтобы дать вам готовое решение, но вы в основном говорите о добавлении правил, таких как:

iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 5 --name SSH --rsource -j DROP 
iptables -A INPUT -p tcp --dport 22 -m recent --set --name SSH --rsource -j ACCEPT 

Эти правила предполагают, что вы принимаете УСТАНОВЛЕННЫЕ соединения ранее в таблице (так что только новые соединения будут попадать в эти правила). Новые соединения SSH будут соответствовать этим правилам и будут отмечены. Через 60 секунд 5 попыток с одного IP-адреса приведут к тому, что новые входящие соединения с этого IP будут сброшены.

Это хорошо сработало для меня.

Редактировать: я предпочитаю этот метод "fail2ban", потому что не нужно устанавливать дополнительное программное обеспечение, и происходит полностью в режиме ядра. Он не обрабатывает файлы журнала анализа, как "fail2ban", но если ваша проблема связана только с SSH, я бы не использовал что-то в пользовательском режиме, которое требует установки программного обеспечения и является более сложным.

Эван Андерсон
источник
1
Мне нравится это решение, и я планирую установить его сегодня вечером, как только я потушу сегодняшние пожары.
MattMcKnight
2
Это замедляет атаки, и я действительно рекомендую это, но, поскольку там есть сканированные ботнеты, это не панацея. Все еще будут недействительные входы в систему из ботнетов, выполняющих распределенное сканирование против вас. На самом деле вы не можете ничего с этим поделать, если не считать какой-то схемы «стука портов» для удаленного включения порта SSH, когда вы захотите войти.
Эван Андерсон,
1
+1 за предложение Эвана "стучать в порт". Некоторая информация: linux.die.net/man/1/knockd . Но не делайте этого вручную (например, добавляя / удаляя правила iptables), а вместо этого используйте -m conditioniptables match.
pepoluan
2
Вам не нужен --dport 22 в этих правилах, чтобы они применялись только для трафика ssh?
Клим
2
@clime - Да. Трудно поверить, что это было здесь 2 1/2 года, и никто не заметил! Хороший улов.
Эван Андерсон
39

fail2ban может помочь с этим, блокируя IP-адреса при слишком большом количестве неудачных попыток входа в систему.

Кайл Брандт
источник
11
мне не нравятся инструменты / скрипты для чтения логов и выдачи команд от имени пользователя sysadmin
asdmin
2
@asdmin, да, особенно когда у них такой хороший послужной список ...
maxschlepzig
25

Я бы порекомендовал использовать нестандартный порт для SSH, если вы можете (например, порт 10222), но так как вы упомянули, что вы не можете сделать это, я бы порекомендовал использовать что-то вроде DenyHosts.

http://denyhosts.sourceforge.net/

Отличный пакет, прост в установке и настройке.

KPWINC
источник
6
Я не знаю, почему люди голосуют за это; SSH подключен к стандартному порту 22. Это означает, что когда вы находитесь в чужой сети, вы не полагаетесь на то, что они открывают нестандартный порт через исходящий брандмауэр. Реальное решение этой проблемы описано выше: либо ограничьте количество повторных подключений через входящий межсетевой экран, либо отключите пароли для входа.
Эндрю Тейлор
1
OpenSSH 6.7 отказывается от поддержки tcpwrappers , что и используется denyhosts.
Зоредаче
15

Хотя было бы неплохо иметь возможность подключаться к вашей системе через ssh из любого места в Интернете, существуют автоматизированные системы парольной атаки, которые блокируют открытый порт ssh и применяют различные атаки на учетную запись joe и словарь против вашей системы. Это может усугубить чтение в вашем ночном отчете и является пустой тратой пропускной способности.

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

Вот как вы это делаете:

запретить все ssh-соединения в /etc/hosts.deny:

# /etc/hosts.deny fragment
sshd:  all

Разрешите известные системы по IP в /etc/hosts.allow, а также добавьте файл для временного доступа:

# /etc/hosts.allow fragment
sshd:  10.0.10.2     # some system
sshd:  172.99.99.99  # some other system
sshd:  /etc/hosts.allow.temporary-sshd-access

Создайте php-файл на вашем веб-сервере и дайте ему неочевидное имя, например my-sshd-access.php:

<?php
function get_ip()
{
    return getenv("REMOTE_ADDR"); 
}

?>

<?php
$out='/etc/hosts.allow.temporary-sshd-access';
$log='/var/log/sshd-access-addition-log';

print "Was:";
readfile($out);
print "<br>";
$ip=get_ip();
$fp=fopen($out,"w");
fputs($fp,$ip);
fclose($fp);

$lfp=fopen($log,"a");
fputs($lfp,$ip);
fputs($lfp,"n");
fclose($lfp);

print "Wrote: ";
readfile($out);
?>

Простите код php - я провёл его откуда-то еще, так что он, вероятно, мог бы вытереть целую кучу. Все, что он делает, это добавляет IP-адрес системы, обращающейся к нему, в файл /etc/hosts.allow.teilitary-sshd-access, который читается sshd (из-за его включения /etc/hosts.allow) во время соединения ,

Теперь, когда вы находитесь в какой-либо произвольной системе в Интернете и хотите использовать ssh для этой системы, сначала используйте веб-браузер и нажмите этот файл (или используйте wget или эквивалентный):

$ wget http://your.system.name/my-sshd-access.php

Теперь вы должны быть в состоянии подключиться к вашей системе. Если это то место, от которого вы, вероятно, будете часто пользоваться ssh'ом, было бы тривиально прочитать содержимое файла /etc/hosts.allow.tetims-sshd-access и добавить IP-адрес в / etc / hosts без возможности восстановления. разрешать.

Дэвид Макинтош
источник
Чтобы сделать это более безопасным, запустите эту страницу на https.
Роберт Мунтяну
Если вы измените сценарий, чтобы он не выводил содержимое файла «разрешенного временного IP-адреса», потенциальному анализатору ничего не удастся прослушать. Затем вы можете запустить его по http вместо https.
Барри Браун
«Разрешенный временный IP-адрес» всегда принадлежит запрашивающему (т. Е. Вашему). Я не думаю, что это так или иначе имеет значение. Https означает, что запрошенный URL-адрес зашифрован, что означает, что перехватить его с провода не просто.
Дэвид Макинтош
Это не будет работать, если вы находитесь в сети с прокси-соединениями HTTP, но ваш прямой путь к Интернету через другой выход.
Эндрю Тейлор
OpenSSH 6.7 отказывается от поддержки tcpwrappers , что и используется в вашем ответе.
Зоредаче
8

Сделайте себе одолжение и отключите пароль для входа. Используйте исключительно ключи аутентификации (например, google ssh-keygen - пример: http://www.puddingonline.com/~dave/publications/SSH-with-Keys-HOWTO/document/html/SSH-with-Keys-HOWTO-4 .html ) Ваш сервер будет более безопасным, вы будете более комфортно подключаться к нему (проверьте ssh-agent, ssh-add, keychain), и вы больше не будете жертвой атак ssh brute force.

Manu
источник
2

другое решение - просто перенести ssh на другой порт. эти черви довольно глупы.

disserman
источник
3
В оригинальном плакате говорилось, что он должен работать на стандартном порту.
kbyrd
1
извините, я должен прочитать вопросы более внимательно :)
disserman
1
Я должен согласиться ... У меня SSH работает на "альтернативных" портах, и это делает МИР различий в журналах. Черви примерно такие же умные, как кирпичи, поэтому они хорошо работают против тупых сценариев автоматизации; не так хорошо против нападавших на людей. Тем не менее, в бревнах есть благословенный звук тишины ...
Эйвери Пейн
... дело не в том, что боты "тупые", а в том, что они предназначены для поиска низко висящих фруктов. Таким образом, перемещение порта SSH выполнено в стиле ... уберите свои плоды с земли.
Элробис
2

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

Я использую Denyhosts, но обнаружил, что регулярно подключаюсь удаленно только из нескольких мест, поэтому я заблокировал все подключения к порту 22, кроме как из любого другого места, и использую стук портов, чтобы я мог подключиться к ноутбуку из любого места, если мне нужно ,

Evan
источник
1

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

Если вы ограничите пользователей / группы только теми, кому в первую очередь следует разрешить вход в ssh, и отключите вход в систему как root, вы должны быть более чем достаточно защищены. И, если этого недостаточно, всегда есть аутентификация на основе ключей.

goldPseudo
источник
1

Честно говоря, если вам нужно запустить SSH (и на порту 22), вы не можете избежать этого. Если вы должны принять пароли, вы в еще худшей форме.

Лучше всего настроить программное обеспечение для анализа логов, чтобы исключить логи SSH. Затем запустите отдельный экземпляр, чтобы просмотреть только журналы SSH, и используйте procmail, чтобы отфильтровать неудачные попытки. Вы могли бы даже написать сценарии для отслеживания успешных входов с IP-адресов с несколькими неудачными попытками.

Там нет никакого способа, чтобы помешать людям исследовать ваш сервер SSH. Denyhosts, fail2ban и пример iptables будут работать до определенного момента, но с дополнительной опасностью случайной блокировки законных пользователей. Лучший способ - это смириться с этим и попытаться автоматизировать процесс анализа журналов, чтобы сократить количество времени, которое вы должны обдумать.


источник
0

Когда вы говорите, что получаете неудачные попытки входа в систему на своем сервере Red Hat, какого рода брандмауэр он сидит и сколько людей должно войти в него. Я полагаю, что, если вы можете, вы хотите ограничить попытки брандмауэра, прежде чем они приблизятся к вашему серверу.

Если вы можете ограничить диапазон IP-адресов, которые законно нуждаются в доступе, вы сможете настроить список доступа на брандмауэре. Если вы можете ограничить трафик в брандмауэре, я бы посоветовал вам взглянуть на системы сетевого вторжения, так как кажется, что ваш сервер чем-то нацелен.


источник
0

Большинство веб-хостов используют APF + BFD для ip-блокировки неудачных входов SSH. В настоящее время существует CSF (межсетевой экран Configserver), который включает в себя инструмент под названием LFD, который делает то же самое и многое другое, включая блокировку IP-адресов из определенных стран, которым вы не хотите получать доступ к вашему серверу (например, Корея, Китай и т. Д., Где 99% моих SSH-зондов кажется, происходят из).

gbjbaanb
источник
0

Если вам нужно решить эту проблему на нескольких хостах, вы можете проверить OSSEC: http://www.ossec.net/main/ossec-architecture

Это позволит вам настроить несколько агентов из централизованного местоположения для автоматического реагирования на атаки методом перебора (вместе с любым другим шаблоном, который вы можете извлечь из журналов).

Очень хороший кусок программного обеспечения :)


источник