# Как защитить свой сервер от брутфорс-атак. Базовые настройки
Очень часто серверы, даже созданные для каких-то локальных задач и не предназначенные для активной работы в сети, подвергаются брутфорс-атакам с целью получения к ним доступа.
Как правило, такие атаки осуществляют боты — примитивные программы, написанные для поиска незаблокированных стандартных портов. Они находят в сети сервер и пытаются получить к нему доступ, перебирая все возможные комбинации пользователь-пароль. Никакой фантазии или сложных алгоритмов работы — исключительно перебор.
Такие атаки могут быть очень назойливыми, а иногда даже могут замедлять работу сервера. В этой инструкции мы расскажем, как защитить от подобных атак SSH-подключение и свести к минимуму риск взлома вашего сервера.
# Обнаружение атаки
Как правило, обнаружить брутфорс-атаку без чтения логов подключения практически невозможно. После множества неудачных попыток подключения система может заблокировать определённого пользователя, но это будет единственный признак брутфорса. Проще и быстрее всего обнаружить атаку — проверить логи SSH-подключения:
sudo journalctl -u ssh | tail -20
Эта команда выведет на экран последние 20 строк из лога SSH. Если вы видите регулярные неудачные попытки подключения к вашему серверу, значит, его пытаются взломать.
# SSH-подключение с аутентификацией по ключу
Это очень удобный способ сделать своё подключение безопасным и полностью исключить риск кражи пароля программами-кейлоггерами.
В основе этого способа лежит создание пары ключей — частного и публичного — для аутентификации подключающегося пользователя.
Вы создаёте пару таких ключей, помещаете публичный ключ на сервер и при подключении «предъявляете» частный ключ, соответствующий публичному. Сервер сверяет ключи и «пропускает» вас. При таком способе аутентификации полностью исключается передача пароля, а значит, невозможен перехват данных, отвечающих за безопасность.
# Создание ключей
Создавать ключи будем при помощи утилиты puttygen. Это специальная программа, генерирующая пары ключей с возможностью выбора типа шифрования, типа генерации и т.д. Откройте окно программы и нажмите кнопку
.Программа попросит сделать несколько случайных движений мышью в определённой области экрана, чтобы на основании этих движений сгенерировать нашу пару ключей.
После этого в поле «Public key for pasting…» появится публичный ключ, который нужно будет поместить на сервер. Сохраним копию этого ключа к себе на локальную машину кнопкой
. Выберем директорию, куда сохранять, и укажем имя файла id_rsa.txt.Здесь же сохраним частный ключ кнопкой
. Сохраняем его в файл 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
Эти базовые приёмы по защите от брутфорс-атак не гарантируют полную безопасность вашего сервера, но уберегут вас от большинства мелких атак, происходящих в интернете.