Защита ssh от брутфорса. Как защитить SSH подключение на Linux сервере Запретить пустые пароли

Одной из распространённых атак на службу SSH является атака методом перебора, когда удалённый атакующий бесконечно пытается залогиниться с различными паролями. Конечно, есть аргументы против аутентификации с помощью паролей для SSH, и есть альтернативные механизмы аутентификации, такие существующие варианты как аутентификация с публичным клюём или двух-факторная аутентификация сведут на нет атаку брут-форсингом. Не в даваясь в дискуссию о преимуществах и недостатках различных методов аутентификации, давайте рассмотрим ситуацию, когда необходима аутентификация паролем. Как вы защитите ваш SSH сервер против атак грубой силой?

fail2ban - это хорошо известный, с открытым кодом фреймворк по предотвращению вторжений для Linux, он мониторит различные лог-файлы системы (например, /var/log/auth.log or /var/log/secure) и автоматически задействуют различные способы защиты против выявленных подозрительных действий. На самом деле, fail2ban может быть очень полезен для защиты против атак по перебору паролей на SSH сервер.

В этом уроке я продемонстрирую как установить и настроить fail2ban для защиты SSH сервера против атак брут-форсингом с удалённых IP адресов .

Установка Fail2ban на Linux

Для установки fail2ban на CentOS или RHEL, сначала, установите репозиторий EPEL, и затем выполните следующую команду.

Для установки fail2ban на Fedora, просто запустите:

$ sudo yum install fail2ban

Для установки fail2ban на Ubuntu, Debian или Linux Mint:

$ sudo apt-get install fail2ban

Настройка Fail2ban для SSH сервера

Сейчас вы готовы для конфигурирования fail2ban для усиления вашего SSH сервера. Вам нужно отредактировать конфигурационный файл в /etc/fail2ban/jail.conf. Конфигурационный файл содержит секцию “DEFAULT”, где вы определяете параметры по умолчанию для всех сервисов, которые мониторятся, и специфичные для каждого сервиса секции, где вы определяете любые специфичные для сервиса джэйлы (например SSH, Apache и т. д.) для перезаписи параметров по умолчанию.

В секции джейлов определённых сервисов (где-то после секции ) вам нужно задать секцию , где вы зададите особые настройки для джэйлов SSH. Текущий бан IP адресов делается iptables.

Последующий пример в /etc/fail2ban/jail.conf, который содержит настройку джэйла “ssh-iptables”. Конечно, там могут быть и другие джейлы для разных приложений, в зависимости от ваших нужд.

$ sudo vi /etc/fail2ban/jail.local # разделённый пробелами список IP адресов, CIDR префиксов или DNS имён хостов # для обхода защиты fail2ban ignoreip = 127.0.0.1 172.31.0.0/24 10.10.0.0/24 192.168.0.0/24 # количество секунд, на которое блокируется клиент bantime = 86400 # количество неудачных попыток, после которых происходит блокировка maxretry = 5 # количество секунд в течение которых накопительно фиксируются неудачные попытки findtime = 600 mta = sendmail enabled = true filter = sshd action = iptables sendmail-whois # для основанных на Debian дистрибутивов logpath = /var/log/auth.log # для основанных на Red Hat дистрибутивах logpath = /var/log/secure # специфичный для ssh порог максимальных попыток maxretry = 3

В соответствии с приведённой конфигурацией, fail2ban будет автоматически банить любые удалённые IP адреса, с которых поступило хотя бы 3 неудачных попытки за последние 10 минут. Однажды забаненный, IP нарушителя будет оставаться заблокированным в течение 24 часов. Уведомление об этом событии будет отправлено по почте.

После того, как конфигурационный файл готов, перезапустите службу fail2ban как показано ниже.

На Debian, Ubuntu или CentOS/RHEL 6:

$ sudo service fail2ban restart

На Fedora или CentOS/RHEL 7:

$ sudo systemctl restart fail2ban

Чтобы проверить, успешно ли запущен fail2ban, выполните команду fail2ban-client с аргументом “ping”. Если служба fail2ban запущена нормально, вы должны увидеть ответ “pong”.

$ sudo fail2ban-client ping Server replied: pong

Тестирование защиты с Fail2ban на SSH от атаки перебором паролей

Чтобы проверить, работает ли fail2ban, попробуйте войти на сервер SSH используя неверный пароль для симуляции брут-форс атаки. В то же время, проверяйте /var/log/fail2ban.log, который записывает все интересные события, которые происходят в fail2ban.

$ sudo tail -f /var/log/fail2ban.log

Согласно логу выше, fail2ban забанил IP адрес 192.168.1.8, поскольку выявил множественные ошибки в попытка залогиниться на SSH с этого IP адреса.

Проверка статуса Fail2ban и разблокировка заблокированных IP адресов

Джейл “ssh-iptables” в fail2ban использует iptables для блокировки IP адресов нарушителей, вы можете легко проверить бан, посмотрев текущие правила iptables как показано ниже.

$ sudo iptables --list -n Chain INPUT (policy ACCEPT) target prot opt source destination fail2ban-SSH tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain fail2ban-SSH (1 references) target prot opt source destination DROP all -- 192.168.1.8 0.0.0.0/0 RETURN all -- 0.0.0.0/0 0.0.0.0/0

Если вы хотите разблокировать IP адреса от fail2ban, вы можете также выполнить команду iptables:

$ sudo iptables -D fail2ban-SSH -s 192.168.1.8 -j DROP

В то время, как вы можете проверять и управлять списком заблокированных IP в fail2ban вручную с помощью команд iptables, как было показано, верным способом, на самом деле, является использование инструмента командной строки ail2ban-client. Этот инструмент позволяет вам управлять не только джэйлом “ssh-iptables”, но также любыми другими типами джэйлов fail2ban в унифицированным интерфейсе командной строки.

Для проверки статуса fail2ban (который покажет список активных в настоящее время джейлов):

$ sudo fail2ban-client status

Чтобы проверить статус конкретного джейла (например, ssh-iptables):

$ sudo fail2ban-client status ssh-iptables

Вышеприведённая команда покажет список забаненных IP адресов.

Для разблокировки конкретного IP адреса:

$ sudo fail2ban-client set ssh-iptables unbanip 192.168.1.8

Обратите внимание, если вы остановите fail2ban, все заблокированные IP адреса будут разблокированы. Когда вы перезапустите fail2ban, он найдёт список IP адресов нарушителей из /var/log/secure (или /var/log/auth.log) и перезабанит эти IP адреса, если не истекло время бана.

Установка Fail2ban на автозагрузку и включении

После того, как вы успешно протестировали fail2ban, последним шагов по задействованию fail2ban является автоматический запуск при включении питания сервера. На основанных на Debian дистрибутивах, автозапуск fail2ban включен по умолчанию. На основанных на Red Hat дистрибутивах, включите автостарт следующим способом.

На CentOS/RHEL 6:

$ sudo chkconfig fail2ban on

На Fedora или CentOS/RHEL 7:

$ sudo systemctl enable fail2ban

Итог

В этом уроке я продемонстрировал как установить и настроить fail2ban для защиты SSH сервера. Хотя fail2ban может смягчить атаку перебором паролей, пожалуйста помните, он не может защитить SSH сервера против сложных (распределённых) кампаний по брут-форсингу, когда атакующие обходят fail2ban используя тысячи подконтрольных ботам IP адресов.

Secure Shell можно найти повсюду. С момента выпуска в 1995 году, SSH получил широкое распространение как мощный протокол удаленного доступа для Linux.

Однако, как известно, большая сила - большая ответственность. Неправильно сконфигурированный SSH демон может быть больше угрозой, нежели помощью. В этой статье мы рассмотрим пять шагов по усилению безопасности SSH.

1. Отключаем root логин.

Самый простой шаг. Очевидно, что существует мало причин разрешения захода root через SSH. Отключить же такой доступ довольно просто и это позволит усилить безопасность.

Найдем /etc/ssh/sshd_config (возможно он находиться в другом каталоге, это зависит от дистрибутива). В нем определим место PermitRootLogin и заменим значение на "no":

PermitRootLogin no

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

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

PasswordAuthentication no
ChallengeResponseAuthentication no

Используя этот Python-скрипт администратор может автоматические вносить хосты при неудачном логине в черный список, баня их навечно. Простейший способ установки:

Europa ~ # emerge -pv denyhosts
These are the packages that would be merged, in order:
Calculating dependencies... done!
app-admin/denyhosts-2.5 0 kB
Total size of downloads: 0 kB
europa ~ # emerge denyhosts

Документации по программе не очень много (если чего - есть, например ), однако все опции конфигурирования нормально описаны в конфигурационном файле.

Europa $ nano -w /etc/denyhosts.conf

Не думаю, что конфигурирование DenyHosts вызовет особые проблемы - достаточно внимательно прочитать конфиг.

После конфигурирования можно запустить программу демоном или через шедулер. В Gentoo демоном:

Rc-update add denyhosts default

Через cron, скажем каждые 10 минут:

Python /usr/bin/denyhosts -c /etc/denyhosts.conf

Вся радость DenyHost не только в блокировании хостов, пытающихся пробиться к вашему SSH серверу, но и в том, что можно синхронизировать свой "черный список" с серверами DenyHost. Таким образом создается коллективный список хостов, содержащий всех нападающих. Он предотвратит нападение в самом корне.

4. Изменяем номер порта.

Большинство попыток взлома идет от автоматических скриптов, сканирующих сеть на наличие SSH демонов. В подавляющем количестве случаев они пытаются вломиться на 22 порт, что только играет нам на руку. Изменив порт мы автоматически отсечем большинство попыток несанкционированного доступа.

В конфиге стоит поменять.

В данной статье рассмотрим базовый метод защиты SSH от массовой bruteforce-атаки. Под массовой bruteforce-атакой в данном случае подразумевается не целенаправленный подбор пароля, именно к вашему SSH, а обширный захват диапазона серверов, для последующего выявления из оного неустойчивых к подбору пары login-password.

Основными особенностями массовой bruteforce-атаки SSH, являются обширное сканирование диапазонов IP на открытый порт 22 и использование в качестве имени пользователя и пароля, часто употребляемые (например, root:passwd123, admin:server123 и т.д.).

Чтобы посмотреть статистику из log-файлов неудачных попыток авторизации по SSH у Вас на сервере, введите команду:

Cat /var/log/secure* | grep "Failed password" | grep sshd | awk "{print $1,$2}" | sort -k 1,1M -k 2n | uniq -c

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

1. Если Вы не используете для авторизации часто употребляемые имена пользователя, такие как root, admin, administrator, user и т.п. и используете для авторизации сложный пароль, то сразу можете переходить ко второму пункту. Чтобы сменить пароль на более сложный, введите команду:

Passwd #your_login#

где #your_login# — Ваше имя пользователя.
При вводе нового пароля, пароль не отображается, курсор будет находится на одном месте.

Зайдем на сервер через SSH, создадим нового пользователя и зададим ему пароль, для этого введем команды:

Adduser #newuser# passwd #newuser#

где #newuser# — Ваше новое имя пользователя, не используйте в качестве имени пользователя часто употребляемые, неплохой вариант ваш_никadmin (например, foxadmin, useralex, rootidler).

2. После этого заходим через SSH с новым логином и паролем. И открываем конфигурацию деймона SSH (sshd_config) командой:

Vi /etc/ssh/sshd_config

После чего Вы должны увидеть примерно такое содержимое:

Строки, начинающиеся с # являются закомментированными.

Чтобы защитить SSH от массового bruteforce , раскомментируйте и измените, либо добавьте следующие параметры файла:
a) port — порт, на котором SSHD принимает и обслуживает соединения. Расскоментируйте (удалите перед началом строки # ) и измените стандартное значение 22 , на любое другое от 1024 до 65536, кроме зарезервированных — список зарезервированных портов , например:

Port 2022

Чтобы удалить # и изменить значение port 22 , нажмите сначала на клавиатуре i , после редактирования необходимой строки нажмите клавишу ESC

b) LoginGraceTime — время ожидания регистрации пользователя в системе. Если пользователь, не успел войти в систему в течении отведенного данной директивой времени, сеанс обрывается. Уменьшим это значение:

LoginGraceTime 1m

c) PermitRootLogin — разрешить пользователю root вход через протокол SSH. Изменим на no .

PermitRootLogin no

d) AllowUsers — разрешенные для входа через протокол SSH имена пользователей разделенные пробелом. Здесь вместо #your_login# указываем новое созданное имя пользователя.

AllowUsers #your_login#

e) MaxAuthTries — количество попыток входа в систему за один сеанс. При достижении максимально разрешенного числа попыток, сеанс обрывается.

MaxAuthTries 2

В итоге мы получим:

Port 2022 LoginGraceTime 1m PermitRootLogin no AllowUsers #your_login# MaxAuthTries 2

В этой статье мы закончим настройку SSH для защиты от массового bruteforce . После редактирования , нажимаем на клавиатуре : , снизу появляется строка и далее вводим в ней wq и нажимаем клавишу Enter . При этом все сделанные изменения сохранятся.

Если Вы что-то сделали не так (например, нечаянно что-то удалили), для выхода без сохранения используйте вместо комбинации клавиш wq , клавиши q!

После завершения настройки SSH, перезапустим деймон командой:

Service sshd restart

Теперь при подключении через протокол SSH, используйте новый порт 2022 (или тот который Вы указали в настройках) вместо стандартного порта 22 .

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

Вконтакте

SSH - это протокол используемый для обеспечения безопасности и шифрования передачи данных в сети. Он широко используется в кругу Linux администраторов для управления удаленным серверомю. Сервер подключение к сети Интернет очень часто подвергаются атакам на службу SSH с целью получить доступ к серверу. Самая расптространенная это подбор пароля пользователя с правами адмиристратора. В этой инструкции мы рассмотрим базоые рекомендации для обеспечения безопасности SSH подключения.

Установите сложный пароль

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

  • Как минимум 8 символов
  • Используйте верхний и нижний регистр символов (AaBb)
  • Используйте буквы - цифры и знаки (!BasDf345$@)

Сильный пароль не только защитит от взлома по SSH протоколу, но и в целом улучшит защиту сервера.

Используйсте SSH ключи

Дополнительной защитой Вашего сервера будет использование ключа для подключения к серверу по SSH , генерировать ключ нужно на компьютере/сервере с которого будете подключаться:

Как создать SSH ключ на Windows ОС :

Чтобы создать ключ в Linux наберите команду:

Ssh-keygen -t rsa

Чтобы установить этот ключ на сервер к которому Вы будете подключаться наберите команду:

Ssh-copy-id -p 22 [email protected]

  • -p 22 - порт сервера по которому работает SSH протокол (может быть изменён, подробней информация ниже)
  • admin - Логин от Вашего сервера
  • 192.168.1.1 - IP адрес Вашего сервера

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

Используйте нестандартный порт

Стандартно SSH служба запущенная на сервере слушает 22 Порт для подключения/передачи данных, этим могут воспользоваться злоумышленники рассчитывая на то что большинство пользователей не меняют стандартный порт для подключения к серверу. Поэтому мы изменим порт, тем самым - ещё раз уменьшив риск взлома нашего сервера.

Для этого откроем конфигурационный файл SSH на сервере:

Sudo nano /etc/ssh/sshd_config

Найдем в нём закомментированную строку такого вида:

# Port 22

Удалим символ # - чтобы убрать опцию комментария и изменим 22 на любые цифры начиная с 11060 и по нарастанию, для примера будем использовать 11 060 , теперь строка должна выглядеть так:

Port 11060

Сохраните конфигурацию "Ctrl +O " и выходите из редактора "Ctrl +X ".

Нужно перезагрузить SSH службу - чтобы принялись новые настройки, выполним команду:

Sudo service sshd restart

Таким образом мы поменяли порт для подключения, с этих пор - чтобы подключиться к серверу нужно указывать нестандартный порт опцией -p 11060 , например:

Ssh -p 11060 [email protected]

Оставить доступ только части пользователей

SSH подключение можно лимитировать для отдельных учетных записей, например если на сервере имеется три учетных записи: admin , sergey , alex - у Вас есть возможность разрешить удаленное подключение только для некоторых из них. Для этого откройте конфигурационный файл SSH :

В этом файле спуститесь стрелочками до последней строки и добавьте новую с таким содержанием:

AllowUsers admin alex

Сохраните конфигурацию "Ctrl +O " и выходите из редактора "Ctrl +X ".

Перезагрузите службу SSH :

Sudo service sshd restart

Этим самым Вы разрешили удалённый доступ для пользователей admin и alex , в то время как пользователь sergey удаленно подключиться уже не сможет.

Включите SSH protocol 2

По стандарту SSH работает в режиме версии 1, эта версия устарела и имеет множество уязвимостей но для обеспечения лучшей безопасности рекомендуем переключить работу в режим версии 2. Для этого откройте конфигурационный файл SSH :

Sudo nano /etc/ssh/ssh_config

Найдите строку:

# Protocol 2

Удалите символ # - чтобы убрать опцию комментария и задействовать эту строку, дожно получиться так:

Protocol 2

Сохраните конфигурацию "Ctrl +O " и выходите из редактора "Ctrl +X ".

Перезагрузите службу SSH :

Sudo service sshd restart

Отключить пустые пароли

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

Sudo nano /etc/ssh/ssh_config

Найдите строку PermitEmptyPasswords и убедитесь что стоит значение "no ".

PermitEmptyPasswords no

Включите подробный журнал

Чтобы служба SSH вела журнал неудачных подключений с указанием IP - адресов, откройте конфигурационный файл SSH :

Sudo nano /etc/ssh/ssh_config

Найдите строку LogLevel и вместо INFO укажите VERBOSE , строка должна получится так:

LogLevel VERBOSE

Сохраните файл "Ctrl +O " и выйдите из редактора "Ctrl +X ".

Перезагрузите службу SSH :

Sudo service sshd restart

Можно проверить, вводим команду:

Cat /var/log/secure

Система выведит нам информацию, примерно такую:

Jun 21 13:06:28 centos sshd: Failed password for root from 118.212.143.47 port 48263 ssh2

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

Спасибо за внимание, на этом всё.

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

По умолчанию он включен на VPS и выделенных серверах большинства хостинг-провайдеров, так как с его помощью возможно легко и безопасно управлять удаленной машиной. К слову, на сервисе Велл-Веб можно недорого арендовать сервер VPS . Так как SSH поднят на всех VPS, Чтобы при использовании Secure Shell не возникло проблем, необходима правильная защита SSH.

Отключаем доступ от рута

В первую очередь рекомендуется деактивировать возможность удаленного подключения к машине под учетной записью суперпользователя (root). Для этого нужно найти файл sshd_config, который обычно (но не всегда) находится в каталоге /etc/ssh/, и открыть его.

В нем потребуется отыскать пункт PermitRootLogin и заменить его значение на "no", то есть должна получиться такая запись:

PermitRootLogin no

Естественно, это не предотвратит взлом, но все же несколько его затруднит.

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

Смена порта по умолчанию

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

Port номер_порта

Запись будет выглядеть, например, следующим образом:

Port 3048

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

Ограничение доступа по IP

Еще один способ защиты, который практически до нуля снизит вероятность несанкционированного подключения – это установка ограничений на авторизацию. SSH можно настроить таким способом, чтобы авторизоваться на сервере можно было только с удаленных машин с определенными IP-адресами. Для этого в файле sshd_config в строке AllowUser к имени каждого пользователя нужно дописать @номер_IP. Запись может иметь, например, такой вид:

AllowUsers [email protected], [email protected]

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

Безопасный пароль

Ну и конечно же стоит использовать стойкий к перебору пароль. Длинный и с как можно более разнообразными символами, желательно с кракозябрами. Это must have.