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


81

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

Ответы:


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


25

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

http://denyhosts.sourceforge.net/

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


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.


2

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


3
В оригинальном плакате говорилось, что он должен работать на стандартном порту.
kbyrd

1
извините, я должен прочитать вопросы более внимательно :)
disserman

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

... дело не в том, что боты "тупые", а в том, что они предназначены для поиска низко висящих фруктов. Таким образом, перемещение порта SSH выполнено в стиле ... уберите свои плоды с земли.
Элробис

2

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

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


1

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

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


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-зондов кажется, происходят из).



0

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

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

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.