Защита нужна всем ресурсам
При создании сервера для личных нужд, например, игр или хранения фотографий, пользователи часто игнорируют вопросы безопасности. Наиболее популярная причина — недооценка значимости ресурса: «Мой домашний сервер хакерам не нужен».
На самом деле не все так просто. Как только у сервера появляется публичный IP-адрес, уже через 15 минут ботнеты начинают сканировать систему на возможные уязвимости. В случае успеха, сервер будет взломан и либо станет частью ботнета, либо будет использован злоумышленниками другим образом.
Подробнее об атаках на новые интернет‑ресурсы — в тексте «Как поймать сетевых взломщиков на серверы-приманки».
В лучшем случае можно потерять сохранения игр или фотографии. В худшем — личные файлы будут навсегда переданы в публичную сеть. Сегодня обсудим несколько простых мер, которые помогут избежать неприятностей, а ботнеты и хакеры, попытавшись взломать ресурс, отправятся на поиски другой, более легкой цели.
Шаг 1. Придумайте сложный пароль
Если для входа на сервер используется пароль, а не подключение по безопасному протоколу, о котором поговорим позже, то можно не сомневаться — злоумышленники попытаются его подобрать. Взлом происходит в автоматическом режиме с использованием базы популярных паролей. К примеру, согласно исследованию сервиса DLBI, для домена RU в 2023 году список возглавляла следующая десятка:
- 123456,
- 123456789,
- 1000000,
- 12345678,
- 12345,
- 123123,
- 12345zz,
- qwerty,
- Qwerty123,
- 1234567890.
В специализированных базах хранятся сотни тысяч подобных записей, поэтому использование пароля вида «Qwerty1234» равносильно его отсутствию.
Идеальный вариант — пароли с заглавными и строчными буквами, цифрами и специальными символами. Длина последовательности должна быть не менее 15−20 символов. Например, хорошим вариантом будет StZrj32^4!cker%fsWEr
, однако такую строку трудно запомнить. Если вдобавок следовать общепринятым рекомендациям о периодичности смены пароля (минимум раз в полгода), то задача по запоминанию становится почти невозможной. Кроме того, при вводе такого пароля легко допустить ошибку.
Допустимо использовать парольные фразы — их легко запомнить и можно складывать в довольно сложный пароль. Однако они не должны быть связаны с жизнью или работой. Предположим, вы никогда не играли в майнкрафт. Тогда стоит попробовать такую последовательность: Minecraft_eto_moja_jizn’2019!!!1902
.
Такие пароли вряд ли встретятся в словарях хакеров. Кроме того, их легко менять: можно чередовать порядок слов в фразах, тем самым создавая новые пароли. Еще одно преимущество в том, что такие строки достаточно длинные — подобрать их простым перебором будет практически невозможно.
Шаг 2. Установите блокировщик атак
Каким бы сложным не был пароль, есть риск, что с некоторой попытки злоумышленникам удастся его подобрать. Лучше всего не допускать попыток атак подобного рода. Для этого можно использовать утилиту fail2ban
.
Даже при полной уверенности в надежности паролей, fail2ban
оказывается полезной — она экономит трафик и снижает нагрузку на сервер, так как еще на ранних этапах блокирует нелегитимных пользователей. Это важно, поскольку утилита освобождает ресурсы виртуальной машины от бессмысленной работы — перерасчета хэша каждого вводимого пароля и записи очередного инцидента в системный журнал.
fail2ban
отслеживает по лог‑файлам деятельность запущенных программ и на основании заданных условий блокирует доступ с IP‑адресов обнаруженных нарушителей. Известность утилита приобрела благодаря своей способности предотвращать атаку грубым перебором (брутфорс) «из коробки», без необходимости сложной настройки. Поддерживаются все популярные *nix‑сервисы.
Произвести установку и конфигурирование просто. Рассмотрим команды.
Команда установки fail2ban для Debian/Ubuntu:
apt-get install fail2ban
Команда установки fail2ban для CentOS/Fedora/RHEL:
yum install fail2ban
Готово! Базовая защита от перебора паролей включена. Если нужны особенные настройки для более серьезной защиты, дополнительную информацию можно найти на странице проекта.
Шаг 3. Подключайтесь только по SSH
Вход на сервер по паролю — скорее исключительный способ авторизации. Общепринятый подход — обмен SSH‑ключами и полное отключение возможности использования пароля. Суть метода в использовании математически связанной пары ключей — открытого и закрытого.
Открытый (публичный) ключ используется для шифрования данных. Не стоит опасаться попадания открытого ключа в чужие руки — злоумышленник сможет только зашифровать какую‑то свою информацию, что не несет никакой угрозы. Открытый SSH-ключ хранится на удаленном узле.
Закрытый (приватный) SSH-ключ используется для расшифровывания данных. Такой ключ необходимо надежно оберегать от возможности быть скопированным третьими лицами и никогда не передавать по сети. Хранится он на устройстве, которое будет подключаться к удаленному узлу. Рекомендуется дополнительно защищать закрытый ключ паролем от возможного прочтения.
Рассмотрим, как подключиться по SSH. Потребуется лишь несколько несложных действий.
1. Сгенерируем связаную пару ключей на устройстве, с которого будем подключаться к серверу. Можно указать тип предпочитаемого алгоритма (по умолчанию предлагается RSA). После создания пары нужно уточнить место хранения ключей. Предложенный вариант можно оставить без изменения. Далее — программа попросит придумать кодовую фразу для защиты приватного ключа. Настоятельно рекомендуем воспользоваться советом, чтобы защитить содержимое приватного ключа.
$ ssh-keygen -t rsa
Generating public/private RSA key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
2. Сгенерированный публичный ключ установим на сервере. Общепринятое место хранения ключей — каталог .ssh
в домашней директории. Для выполнения копирования можно воспользоваться утилитой ssh-copy-id
, указав имена пользователя и сервера (или IP‑адрес сервера). Не забудьте ответить yes
на предупреждение о копировании открытого ключа на неизвестный хост.
$ ssh-copy-id username@remote_host
3. Отключим авторизацию по паролю.
3.1. Авторизуемся на сервере с помощью SSH-ключа. Сделать это можно с помощью команды:
ssh -i <путь до приватного ключа> username@<ip-сервера>
3.2. Откроем файл с конфигурацией SSH:
sudo nano /etc/ssh/sshd_config
3.3. В файле будет находиться параметр PasswordAuthentification
, отмеченный как комментарий. Удалим символ однострочного комментария (#
), находящийся перед названием параметра. После — отключим действие параметра, подставив ему значение no
.
PasswordAuthentification no
Подробнее о настройке SSH-авторизации по ключу и популярных ошибках — в тексте «Авторизация на базе ключей SSH».
Шаг 4. Заблокируйте root
Следующий логичный шаг после включения SSH — отключение авторизации пользователя root
.
Работа от имени пользователя с неограниченными полномочиями — плохая практика, можно ненароком выполнить опасную команду без возможности отменить изменения. Лучше авторизовываться от лица обычного пользователя, а в случае необходимости выполнения административных задач, использовать специальную утилиту sudo (от англ. super user do).
Неотключенный root несет и другую угрозу. Если злоумышленник сможет авторизоваться как root, то вернуть доступ к серверу будет невозможно и придется пересоздавать его в панели управления хостинг‑провайдера.
Отключить авторизацию пользователя root можно внеся следующие изменения в файл /etc/ssh/sshd_config
:
PermitRootLogin no
Чтобы изменения вступили в силу, нужно перезагрузить службу:
sudo systemctl restart ssh
Шаг 5. Используйте безопасные протоколы
С авторизацией разобрались. Но о какой безопасности может идти речь, если мы используем протоколы, которые не шифруют данные? В случае развертывания простого игрового сервера можно не придавать этому большого значения. Но при других сценариях важно проверить, безопасные ли протоколы вы используете. Например, вместо HTTP лучше выбрать HTTPS, вместо SMTP — SMTPS, FTP — FTPS, а вместо SNMP первой и второй версий — SNMPv3.
В мире существует более 7 000 сетевых протоколов. Рассказываем про самые популярные из них, а также о существующих сетевых моделях передачи данных в курсе «Как работают сетевые протоколы».
Шаг 6. Своевременно обновляйте версии ОС и ПО
Важно регулярно обновлять приложения и операционную систему. В интернете активно действуют боты, которые эксплуатируют популярные уязвимости. Использование Linux или MacOS не гарантирует защиты.
Оптимальный подход — следить за уязвимостями и своевременно устанавливать патчи. Если это кажется трудоемким, проверяйте выход новых stable-версий и устанавливайте их хотя бы раз в неделю. Перед обновлением не забывайте делать резервные копии, чтобы в случае проблем можно было вернуть системы в прошлое (рабочее) состояние.
Если вы выбрали сложный путь и решили отслеживать новые уязвимости, то сделать это можно, например, на следующих сайтах:
- Банк данных угроз безопасности информации (ФСТЭК России),
- Common Vulnerabilities And Exposures,
- VulnDB – Vulnerability Intelligence.
Шаг 7. Контролируйте порты
Важно следить за тем, какие порты приложений вы публикуете в открытую сеть. Не стоит открывать все, т. к. это помогает ботам и злоумышленникам понять, какие системы установлены, и эксплуатировать уязвимости. Лучше руководствоваться правилом «Запрещено все, что не нужно для корректной работы приложения».
Если на сервере установлены базы данных и другие системы, то лучше разрешить к ним доступ с loopback IP-адреса (127.0.0.1) и подключаться внутри системы. Для управления системами не рекомендуется публиковать порты в публичную сеть. Однако если у вас один хост, то через один из портов придется подключаться.
Шаг 8. Подключите двухфакторную аутентификацию
Если приложение поддерживает двухфакторную аутентификацию, ее важно включить.Особенно актуально, если доступ к данным открыт из публичной сети. Даже если злоумышленник получит пароль от сервера, двухфакторная защита станет дополнительным барьером.
Шаг 9. Защитите сервер от DDoS
DDoS (Distributed Denial of Service) — распределенная атака типа «отказ в обслуживании», которую используют хактивисты, чтобы нарушить нормальную работу целевого сервера, сайта или приложения с помощью мощного потока трафика.
Если ваш проект пользуется популярностью или его использует много пользователей, возможны DDoS-атаки. Важнейшие элементы защиты от них — файрволы, которые можно настроить на выявление и блокирование нелегитимного трафика.
Selectel предоставляет бесплатную защиту. Она помогает бороться с потоками нежелательного трафика из внешней сети, фильтрует DDoS-атаки на уровне сетевых протоколов L3, L4. По умолчанию включена для всех услуг Selectel, кроме облака на базе VMware — для него автоматически подключается другая защита.
Шаг 10. Логируйте и мониторьте
Настройте логирование. Это не отнимет много времени и позволит выявить причины неполадок или медленной работы, а также обнаружить факты вмешательства.
Следует также настроить мониторинг доступности ресурсов и сбор метрик о загруженности сервера. Так вы сможете заранее узнать, что заканчивается место или нужен более мощный сервер, а также мониторить статусы работы систем.
Выводы
Может показаться, что одиночные серверы для игр или pet-проектов взламывать бессмысленно. Отчасти это правда: злоумышленник вряд ли будет тратить на это много ресурсов, если не преследует личных целей. Однако важно обеспечить базовую безопасность, чтобы сервер не стал частью ботнета или не использовался для майнинга криптовалют.