Каждую ночь я получаю сотни, а иногда и тысячи неудачных попыток входа в систему по ssh на моем сервере RedHat 4. По причинам брандмауэра с удаленных сайтов мне нужно работать на стандартном порту. Что я должен сделать, чтобы заблокировать это? Я заметил, что многие приходят с одного IP-адреса. Разве это не должно остановить их через некоторое время?
Вы можете использовать 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, я бы не стал использовать что-то более сложное в пользовательском режиме, требующее установки программного обеспечения.
fail2ban может помочь в этом, заблокировав IP-адреса при слишком большом количестве неудачных попыток входа в систему.
Я бы рекомендовал использовать нестандартный порт для SSH, если вы можете (например, порт 10222), но, поскольку вы упомянули, что не можете этого сделать, я бы рекомендовал использовать что-то вроде DenyHosts.
http://denyhosts.sourceforge.net/
Отличный пакет, простой в установке и настройке.
Хотя может быть неплохо иметь возможность подключаться по 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.porary-sshd-access, который читается sshd (из-за его включения /etc/hosts.allow) во время соединения. .
Теперь, когда вы находитесь в какой-то произвольной системе в Интернете и хотите подключиться к этой системе по ssh, сначала используйте веб-браузер и нажмите этот файл (или используйте wget или эквивалент):
$ wget http://your.system.name/my-sshd-access.php
Теперь у вас должна быть возможность подключиться к вашей системе по ssh. Если это место, откуда вы, вероятно, будете часто заходить по ssh, было бы тривиально прочитать содержимое файла /etc/hosts.allow. Contemporary-sshd-access и навсегда добавить IP-адрес в / etc / hosts. позволять.
Вы можете посмотреть на запретить также.
К вашему сведению: OpenSSH 6.7 падает поддержка tcpwrappers, что означает, что denyhosts, вероятно, не является решением для новых установок.
Сделайте себе одолжение и отключите пароль для входа. Используйте исключительно ключи аутентификации (например, 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.
другое решение - просто переместить ssh на другой порт. эти черви довольно тупые.
Другой вариант может заключаться в том, чтобы потребовать, чтобы все соединения ssh были проверены сертификатом, и полностью отказаться от паролей.
Я использую Denyhosts, но обнаружил, что регулярно подключаюсь удаленно только из нескольких мест, поэтому я заблокировал все подключения к порту 22, кроме как откуда-либо еще, и использую блокировку портов, чтобы при необходимости я мог подключиться к ноутбуку откуда угодно. .
Любое решение, которое включает автоматическую блокировку IP-адресов после нескольких сбоев, создает риск атак типа «отказ в обслуживании». Пока существует хорошая политика паролей, снижающая эффективность грубой силы или словарных атак, я бы не стал особо беспокоиться о них.
Если вы ограничите пользователей / группы только теми, кому разрешено использовать ssh в первую очередь, и отключите вход в систему как root, вы должны быть более чем достаточно защищены. А если этого недостаточно, всегда есть аутентификация на основе ключей.
Честно говоря, если вам нужно запустить SSH (и на порту 22), вы не сможете этого избежать. Если вы должны принимать пароли, вы в еще худшем положении.
Лучше всего настроить программное обеспечение для анализа журналов, чтобы исключить журналы SSH. Затем запустите отдельный экземпляр, чтобы просматривать только журналы SSH, и используйте procmail для фильтрации неудачных попыток. Вы даже можете написать сценарии для отслеживания успешных входов в систему с IP-адресов с несколькими неудачными попытками.
Невозможно помешать людям исследовать ваш SSH-сервер. Denyhosts, fail2ban и пример iptables будут работать до определенного момента, но с дополнительной опасностью случайной блокировки законных пользователей. Лучший способ - впитать это и попытаться автоматизировать процесс анализа журнала, чтобы сократить количество времени, которое вам нужно подумать.
Когда вы говорите, что получаете неудачные попытки входа в систему на вашем сервере Red Hat, какой за брандмауэр он сидит и сколько людей нужно, чтобы войти в него. Я предлагаю, если вы можете, ограничить попытки доступа к брандмауэру, прежде чем они приблизятся к вашему фактическому серверу.
Если вы можете ограничить диапазон IP-адресов, которым законно необходим доступ, вы сможете настроить список доступа на межсетевой стене. Если вы можете ограничить трафик на брандмауэре, я бы посоветовал вам взглянуть на системы сетевых вторжений, поскольку похоже, что ваш сервер чем-то нацелен.
Большинство веб-хостингов используют APF + BFD блокировать неудачные попытки входа по SSH. В настоящее время есть CSF (межсетевой экран Configserver) который включает в себя инструмент под названием LFD, который делает то же самое и многое другое, в том числе блокирует IP-адреса из определенных стран, которым вы не хотите получать доступ к вашему серверу (например, Корея, Китай и т. д., откуда, похоже, исходят 99% моих зондов SSH).
Я использовал fail2ban и это мне очень помогло.
Если вам нужно решить эту проблему на нескольких хостах, вы можете проверить OSSEC: http://www.ossec.net/main/ossec-architecture
Это позволит вам настроить несколько агентов из централизованного местоположения для автоматического реагирования на атаки методом перебора (наряду с любым другим шаблоном, который вы можете извлечь из журналов).
Очень хорошая программка :)
Другой вариант, похожий на DenyHosts, - sshutout http://www.techfinesse.com/sshutout/sshutout.html
Это довольно старая тема, и ее нужно обновить;) В настоящее время лучший вариант - использовать 2FA, например https://ubuntu.com/tutorials/configure-ssh-2fa#1-overview. После установки на моем сервере боты сразу перестали пытаться вторгнуться, в отличие от принятого решения iptables.