Предотвращение атак грубой силы на ssh?

49

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

Это на коробке FreeBSD, но я думаю, что это применимо где угодно.

Скорбный
источник

Ответы:

25

Вот хороший пост на эту тему от Райнера Вихмана.

Здесь объясняются плюсы и минусы этих методов:

  • Сильные пароли
  • Аутентификация RSA
  • Использование iptables для блокировки атаки
  • Использование журнала sshd для блокировки атак
  • Использование tcp_wrappers для блокировки атак
  • Порт стучит
paulgreg
источник
39

Я использую fail2ban, который блокирует IP после нескольких неудачных попыток в течение настраиваемого промежутка времени.

Объедините это с проверкой надежности пароля (используя Джона (Джона Потрошителя)), чтобы гарантировать, что атаки методом перебора не будут успешными.

казарка
источник
4
Fail2ban отлично. Было просто расширить его до монитора / var / log / maillog и заставить его запретить постоянным спамерам попадать на мой почтовый сервер
Дейв Чейни,
Fail2ban может быть объединен с цепочкой iptables, которая отправляет tcp-трафик к TARPITцели, если вы чувствуете себя противно (из xtables-addons).
Тобу
24

Небольшая вещь, которую вы можете сделать, это использовать что-то вроде DenyHosts:

http://denyhosts.sourceforge.net/

Он использует встроенный hosts.allow / hosts.deny, чтобы заблокировать злоумышленников SSH.

hernan43
источник
16
  • Измените используемый порт (как упоминал Трент )
  • Требовать ключи шифрования вместо паролей. http://novosial.org/openssh/publickey-auth/
  • Черный список атакующих ips
  • Белый список известных пользователей предотвращает случайное попадание в черный список. (как сказал Самиуэла)
Крис Балланс
источник
15

Один из самых простых способов избежать этих атак - изменить порт, который прослушивает sshd.

трент
источник
1
Если, конечно, ваша система может выдержать это.
К. Росс
13
Безопасность через неизвестность, эффективная каждый раз.
Крис Балланс
1
Я не возражаю против изменения порта так сильно, но я узнал, что большинство брандмауэров (кроме моего собственного), как правило, блокируют все порты, кроме общих (80, 22, 443 и т. Д.). Если я нахожусь за этими брандмауэрами, я не могу попасть на свой домашний сервер через этот нестандартный порт. Для меня это не пойдет.
скорбим
@grieve, а затем изменить наш брандмауэр, чтобы освободить порт?
Рори
@ Рой Я говорю о брандмауэрах, отличных от тех, что у меня есть. Например, если я хочу подключиться по ssh к моей домашней машине из Starbucks, их брандмауэр блокирует исходящий порт. Я не могу это изменить. (Я просто использовал Starbucks в качестве примера. Я понятия не имею, какие порты они фактически блокируют или нет).
скорбим
12

Как указывает Крис, используйте ключи шифрования вместо паролей.

Добавьте к этому:

  • используйте белый список, где это возможно.

Сколько людей или мест (с плавающими публичными IP-адресами) вам действительно нужно для доступа к вашим публичным ssh-соединениям?

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

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

SAMT
источник
2
Белый список чрезвычайно важен, если вы делаете какие-либо черные списки, если не хотите быть заблокированными.
Райанер
2
+1 за активно белый список.
Крис Балланс
3
+1 за лучший ответ. Эти две вещи являются единственными разумными шагами, и они действительно очень эффективны. Либо один стоит, и оба вместе тем более. Бу на другие ответы, защищающие безопасность через безвестность!
DWC
11

В дополнение к другим хорошим предложениям, одна из действительно простых вещей - ограничение входящих подключений. Ограничение до 3 соединений в минуту на IP:

iptables -A INPUT -p tcp --dport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 3/min --limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
sherbang
источник
Возможно, я что-то неправильно понимаю, но многие основные браузеры подключаются между 4-6 соединениями одновременно, хотя стандарт HTTP устанавливает его на 2.
Джошуа Энфилд
1
Да, это было бы проблемой, если вы пытались ограничить скорость порта 80. Вы не подключаетесь к ssh через свой веб-браузер, и сеансы ssh - это долговременные сеансы, которые поддерживают состояние, а не краткосрочные сеансы без сохранения состояния, такие как HTTP. Распараллеливание ssh-сессий не имеет смысла. Это не значит, что ssh нигде не используется, но это редко.
Шербанг
Это решение не очень хорошо, если, как и я, вы обслуживаете Subversion через ssh. Один запрос SVN может создать большое количество соединений в быстрой последовательности. Если вы предоставляете эту услугу, вы можете использовать вторую службу sshd на другом порту или использовать известные IP-адреса из белого списка. Я подумываю использовать fail2ban или sshdfilter, чтобы поймать очевидные атаки в первый раз, не наказывая моих законных пользователей.
Пэдди
тоже неплохо бы знать этот вариант ...
ZEE
6

Используйте параметр «AllowUsers» в sshd_config, чтобы гарантировать, что только небольшой набор пользователей может войти в систему вообще. Все остальные будут отклонены, даже если их имя пользователя и пароль верны.

Вы даже можете ограничить пользователей для входа в систему с определенного хоста.

например,

AllowUsers user1 user2@host.example.com

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

Это не полностью останавливает атаки методом перебора, но помогает снизить риск.

Дэвид Гарднер
источник
3

Используйте что-то подобное с PF:

таблица <ssh-brute> постоянный
блок в быстром журнале от метки ssh_brute,
передаваемой в $ ext_if proto tcp в ($ ext_if) порт ssh модулирует состояние \
(max-src-conn-rate 3/10, глобальная перегрузка сброса)


источник
2

Стук в порт - довольно надежный способ не допустить подобных вещей. Немного беспокойно, иногда раздражает, но это определенно заставляет проблему уйти.

Люк
источник
Я попробовал это, и пользователи находят это раздражающим. Если бы это был только один или два человека, это могло бы быть хорошим вариантом, и почти исключило бы атаки грубой силы
Brent
2

Контекст важен, но я бы порекомендовал что-то вроде этого:

  • Поскольку вы используете FreeBSD, подумайте о запуске брандмауэра PF и его надежных функций ограничения скорости соединения. Это позволит вам отправлять грубой силы в черный список, если они подключаются на частой основе
  • Если к этому блоку нужно получить доступ из внешнего мира, рассмотрите возможность использования правила PF rdr, чтобы не разрешать трафик на порт 22, а перенаправлять на него какой-то непонятный порт. Это означает, что вы должны подключиться к порту 9122 вместо 22. Это неясно, но удерживает молотки подальше
  • рассмотрите возможность перехода только на аутентификацию на основе ключей, что делает бесполезными атаки по словарю
Михаил Горсух
источник
2

В дополнение к предложению Шербанга об ограничении скорости важна длительность задержки. Из-за увеличения задержки между группами из 3 попыток входа в систему с 2 минут до 20 минут количество различных IP-адресов, для которых было выполнено более трех попыток входа в систему, сократилось, сравнив два недельных периода на одной моей машине, с 44 попыток до 3. Ни один из этих трех адресов не пытался работать дольше 11 часов.

Очень анекдотично, но auth.log стал намного более читабельным для меня ...

Чарльз Стюарт
источник
1

Мне просто все равно. Пусть они пристегнутся в порту, они не собираются перебивать ключ.

romble
источник
-1 Вы когда-нибудь слышали о DoS-атаках?
Крис Балланс
8
Да, потому что SSH является единственной службой, подверженной атакам грубой силы. Если у вас есть порт, открытый для Интернета, его можно использовать, чтобы забить вашу машину в забвение. Вы, вероятно, также ставите свой HTTP-сервер на странные порты и за стуком портов, чтобы «избежать DoS-атак» ...
womble
1

установить OSSEC. он не только отслеживает повторные входы в систему, но и вводит временный блок с iptables для вызывающего ip. И в конце он отправит вам отчет с указанием деталей. он регистрирует все, что приятно. Сомоне однажды попробовал более 8000 имен для входа в систему. я проанализировал логи и получил хороший список пользователей из сделки;)

Marcin
источник