# Как защитить свой сервер от брутфорс-атак. Базовые настройки

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

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

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

# Обнаружение атаки

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

sudo journalctl -u ssh | tail -20

Эта команда выведет на экран последние 20 строк из лога SSH. Если вы видите регулярные неудачные попытки подключения к вашему серверу, значит, его пытаются взломать.

# SSH-подключение с аутентификацией по ключу

Это очень удобный способ сделать своё подключение безопасным и полностью исключить риск кражи пароля программами-кейлоггерами.

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

Вы создаёте пару таких ключей, помещаете публичный ключ на сервер и при подключении «предъявляете» частный ключ, соответствующий публичному. Сервер сверяет ключи и «пропускает» вас. При таком способе аутентификации полностью исключается передача пароля, а значит, невозможен перехват данных, отвечающих за безопасность.

# Создание ключей

Создавать ключи будем при помощи утилиты puttygen. Это специальная программа, генерирующая пары ключей с возможностью выбора типа шифрования, типа генерации и т.д. Откройте окно программы и нажмите кнопку Generate .

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

После этого в поле «Public key for pasting…» появится публичный ключ, который нужно будет поместить на сервер. Сохраним копию этого ключа к себе на локальную машину кнопкой Save public key. Выберем директорию, куда сохранять, и укажем имя файла id_rsa.txt.

Здесь же сохраним частный ключ кнопкой Save private key. Сохраняем его в файл id_prkey.ppk. При желании можно указать также кодовую фразу, которая будет дополнительным уровнем защиты при аутентификации.

# Добавление на сервер публичного ключа

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

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

cd ~
mkdir .ssh
vim /.ssh/authorized_keys

В открывшийся пустой текстовый файл добавляем наш публичный ключ, который сгенерировала нам puttygen, и сохраняем его.

Теперь убедимся, что нашему пользователю выданы полные права на доступ к папке с ключом:

sudo chown -R $USER:$USER /.ssh

Осталось только настроить конфигурацию ssh-сервиса. Для этого откроем конфигурационный файл:

sudo vim /etc/ssh/sshd_config

Здесь найдём и раскомментируем строку PubkeyAuthentication и укажем в ней yes. Эта директива отвечает за активацию подключения к серверу с помощью пары ключей.

Ниже также активируем строку AuthorizedKeysFile, отвечающую за доступные имена файлов, в которых хранятся публичные ключи. Укажем здесь адрес к нашему файлу с ключом .ssh/authorized_keys.

Перезагрузим ssh-сервис и всё будет готово.

sudo systemctl restart ssh

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

# Опции SSH-подключения

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

Для настройки различных вариантов аутентификации откроем конфигурационный файл ssh:

sudo vim /etc/ssh/sshd_config

Найдём здесь блок Authentication, отвечающий за аутентификацию. Раскомментируем строку PermitRootLogin и укажем в ней yes. Эта директива запретит подключаться к нашему серверу по SSH от имени root-пользователя. Поскольку root — одно из самых распространённых имён, а пользователи часто забывают о его изменении или блокировке, оно является популярным местом для атаки.

Далее завершим настройку аутентификации, запретив подключение к нашему серверу с использованием пароля. В строке PasswordAuthentication укажем значение no.

Осталось только перезапустить SSH-сервис:

sudo systemctl restart ssh

Теперь к нашему серверу нельзя подключиться от имени root-пользователя или с использованием пароля. Это отсечёт довольно большую часть атак от самых простых ботов.

# Смена стандартного порта

По умолчанию для SSH-подключения используется порт 22. Это стандартный порт, который в первую очередь проверяют боты.

Использовать его с выделенным IP крайне не рекомендуется. Изменить параметры SSH-подключения можно в том же конфигурационном файле:

sudo vim /etc/ssh/sshd_config

Здесь найдём строку Port и сменим её значение на любое другое доступное. Проверить список используемых портов можно командой netstat -tulpn.

И чуть ниже в строке ListenAddress укажем свой выделенный IP.

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

sudo ufw allow PortNumber
sudo systemctl restart ssh

Если ваш VPS расположен на Джино, то проблема со сменой стандартного порта может возникнуть только в случае подключения выделенного IP. При использовании общего IP стандартный порт 22 уже проксирован, и данные для SSH-подключения (хост и порт) указаны в разделе Управление — Доступ в консоль.

# Fail2ban

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

Эта утилита проверяет логи SSH-подключения и по результатам заданных правил (количество неудачных попыток за определённое время) блокирует доступ часто используемым IP-адресам.

Работа и настройка Fail2ban, а также самостоятельное создание фильтров описаны в наших отдельных инструкциях, здесь же мы остановимся только на общих моментах работы утилиты.

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

В корневой папке программы создадим новый файл, описывающий правила подключения к нашему серверу:

sudo vim /etc/fail2ban/jail.local

Добавим в файл следующие строки:

[sshd]
enabled   = true
maxretry  = 3
findtime  = 1h
bantime   = 7d
ignoreip  = 127.0.0.1/8

Здесь мы указали, что используем уже имеющийся фильтр для SSH-подключений и будем на 7 дней добавлять в список заблокированных IP-адреса, с которых было совершено 3 неудачных попытки авторизации в течение 1 часа.

Также здесь мы указали список адресов, которые нужно игнорировать при проверке. В данном случае это адреса нашей внутренней локальной сети. Здесь же можно указывать IP-адреса, с которых производите подключение вы и ваши коллеги, чтобы исключить случайную блокировку.

В любом случае, если возникнет необходимость убрать из списка запрещённых IP-адрес, попавший туда по ошибке, это можно сделать командой unban:

sudo fail2ban-client unban 12.34.56.78

Эти базовые приёмы по защите от брутфорс-атак не гарантируют полную безопасность вашего сервера, но уберегут вас от большинства мелких атак, происходящих в интернете.