Защита от Брутфорса SSH в Linux. Защита ssh от брутфорса Никакой аутентификации на базе хоста

  • 11.08.2021

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

Конфигурационные файлы

  • /etc/ssh/sshd_config - файл конфигурации сервера OpenSSH;
  • /etc/ssh/ssh_config - файл конфигурации клиентской части OpenSSH;
  • ~/.ssh/ - директория, в которой хранятся пользовательские SSH настройки;
  • ~/.ssh/authorized_keys или ~/.ssh/authorized_keys - список ключей (RSA или DSA), которые используются для подключения к пользовательским аккаунтам;
  • /etc/nologin - если данный файл существует в системе, то sshd запретит подключаться всем пользователям кроме root в систему;
  • /etc/hosts.allow и /etc/hosts.deny - система запрета (часть безопасности). Работает по аналогии с ACL;
  • SSH порт по умолчанию - 22

Не нужен - выключай

Если вашему серверу не требуется удаленное подключение по SSH, то обязательно отключите его. В таких системах как CentOS/RHEL делается это так:

Chkconfig sshd off yum erase openssh-server

Используйте SSH второй версии

Протокол SSH первой версии имеет проблемы с безопасностью, которые закрыты во второй версии. Поэтому, используйте вторую версию. Убедитесь, что в файле /etc/ssh/sshd_config указана опция Protocol 2 .

Ограничивайте SSH доступ

По умолчанию, все системные пользователи имеют возможность подключаться к системе по SSH. Рекомендуем ограничить SSH доступ в целях безопасности. Например, разрешить SSH для пользователей root, merion и networks:

AllowUsers root merion networks

С другой стороны, вы можете разрешить доступ всем пользователям, кроме указанных:

DenyUsers root merion networks

Время неактивности

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

ClientAliveInterval 300 ClientAliveCountMax 0

В данной настройке мы указали время бездействия равным 300 секунд (5 минут).

Про файлы.rhosts

Дело в том, что данный файл содержит список хостов и пользователей. Если в данном файле содержится комбинация хоста и юзера, то данный пользователь сможет подключиться к системе по SSH без запроса пароля. Рекомендуем отключить эту «замечательную» фичу:

IgnoreRhosts yes

Никакой аутентификации на базе хоста!

Так называемая Host-Based Authentication позволяет пользователю с определенного хоста подключаться к серверу. Отключаем:

HostbasedAuthentication no

Прямое подключение через root

PermitRootLogin no

Сделайте баннер

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

22 порт только изнутри!

Сделайте доступ к 22 порту системы только через цепочку фаервол правил. Лучше всего, оставить доступ только изнутри LAN. Например, в Iptables можно дать доступ для 192.168.11.0/24:

A RH-Firewall-1-INPUT -s 192.168.11.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT

Где слушать

По умолчанию SSH слушает подключения на всех доступных интерфейсах. Мы рекомендуем сменить порт по умолчанию и указать IP – адрес, на котором необходимо ожидать подключения. Например, мы укажем порт 962 и IP – адрес 192.168.11.24

Port 962 ListenAddress 192.168.11.24

Криптостойкие пароли

Используйте устойчивые к защите пароли. В сети множество инструментов, которые сгенерируют криптостойкий пароль онлайн, бесплатно и без смс:)

Запретить пустые пароли

Бывают пользователи без паролей. Их доступ к SSH так же необходимо запретить с помощью опции:

Port 962 PermitEmptyPasswords no

Анализируйте логи

Установите логирование событий в режим INFO или DEBUG – это позволит иметь расширенный контроль над системой:

LogLevel INFO

Полезна ли Вам эта статья?

Пожалуйста, расскажите почему?

Нам жаль, что статья не была полезна для вас:(Пожалуйста, если не затруднит, укажите по какой причине? Мы будем очень благодарны за подробный ответ. Спасибо, что помогаете нам стать лучше!

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 от массовой 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 сервера. Описаны самые основные и простые в исполнении приёмы, а более сложные лишь указаны для интересующихся читателей

Основные приёмы

Все действия производятся в конфигурационном файле sshd демона -- /etc/ssh/sshd_config . Ниже приведу часть своего конфигурационного файла с комментариями.

### Network ### # Используем нестандартный порт (>1024) port 5679 # Используем только IPv4 соединения # inet = IPv4, inet6 = IPv6, any = both AddressFamily inet # Можно принимать соединения только с определённых IP-адресов #ListenAddress 0.0.0.0 # Используем вторую версию протокола, т.к. первая подвержена # известным уязвимостям Protocol 2 # Отключаем перенаправление графики (X-сервер) до тех пор # пока она явно не понадобится вам X11Forwarding no # Отключаем Disable TCPKeepAlive и используем ClientAliveInterval вместо этого, # чтобы предотвратить атаки типа TCP Spoofing TCPKeepAlive no # Выкидваем пользователя через 10min (600 sec) неактивности ClientAliveInterval 600 ClientAliveCountMax 3 ### Key configuration files ### # HostKeys для протокола версии 2 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_dsa_key # Используем непривилегированный процесс для # обработки входящего от клиента трафика # sandbox - openSSH >= 5.9 ("yes" - для младших версий) UsePrivilegeSeparation sandbox # При изменении этих значений, требует удалить старый ключ # /etc/ssh/ssh_host_rsa_key{,.pub}, и создать новый # путём перезапуска sshd. # # Время жизни ключа, т.е. через какое время будет сгененрирован новый ключ # в случае, если предыдущий был использован. KeyRegenerationInterval 1h # сила ключа ServerKeyBits 2048 # Разрешаем авторизацию по публичному ключу PubkeyAuthentication yes # Место хранения доверенных ключей в каталоге пользователя AuthorizedKeysFile .ssh/authorized_keys ### Logging ### # Префикс для syslog SyslogFacility AUTH # уровень подробности сообщений для самого sshd LogLevel INFO ### Authentication ### # список разрешённых пользователей AllowUsers ivan # ограничиваем время для ввода пароля для ssh-ключа LoginGraceTime 30s # запрещаем удалённо входить под учётной записью root PermitRootLogin no # Включаем явную проверку прав файлов и директорий с ssh-ключами StrictModes yes # Сколько раз переспрашивать пароль при неверном вводе MaxAuthTries 3 # Запрещаем вход по пустому паролю PermitEmptyPasswords no # Запрещаем вход по паролю в принципе # (Используем публичный/приватный ключ вместо этого) PasswordAuthentication no # Отключаем использование "challenge-responce" авторизацию, # т.к. она бесполезна при использовании ключей ChallengeResponseAuthentication no # Так как мы не используем пароль, то и {PAM, login(1)} нам не нужены UsePAM no UseLogin no # Позволяем клиенту передавать лишь определённый набор переменных окружения # RH BZ#CVE-2014-2532 # ShellShock exploit AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL

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

Комментарии

  • При использовании авторизации по ключу, ключ требуется предварительно сгенерировать на клиентской машине и скопировать публичный ключ на сервер. Пример:
client $ ssh-keygen client $ cat ~/.ssh/id_rsa.pub | ssh -p 5679 [email protected] "cat >> ~/.ssh/authorized_keys"
  • В файле /var/log/auth.log будут находиться сообщения от sshd . В случае, если этот файл отсутствует, вам требуется настроить вашу систему логирования. пример для syslog и syslon-ng . Я использую syslog-ng , и мне потребовалось добавить следующие строки в файл /etc/syslog-ng/syslog-ng.conf:
destination authlog { file("/var/log/auth.log"); }; log { source(src); destination(authlog); };

и перезапустить сервис syslog-ng .

  • При использовании нестандартного порта может потребоваться настроить ваш firewall (iptables, firewalld, etc).
    Пример настройки для iptables:
root# iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED --dport 5679 -j ACCEPT root# service iptables save root# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW,ESTABLISHED tcp dpt:5679 ...

Если этого мало

Это лишь базовые настройки. Дополнительно можно настроить

  • firewall (iptables)

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.