Как защитить свой сервер? Основы кибербезопасности

Безопасность сервера — это основа качественной работы любого бизнеса, стартапа или простого веб-сайта. В 99% случаев нарушения на наших клиентских серверах происходят по причине взлома. А взлом, в свою очередь, из-за недостаточной безопасности сервера.

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

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

Linux (базовые настройки)

Обратите внимание, что по умолчанию команда sudo может не выполняться на ОС Debian. Может потребоваться установка пакета sudo через команду apt install sudo, либо просто удаление sudo из используемых команд.

Прежде чем начать, используйте команду sudo apt install nano (Ubuntu / Debian) или yum install nano (CentOS) для проверки, что утилита nano действительно есть в вашей системе.

Регулярные обновления системы

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

sudo apt update && sudo apt upgrade -y

Использование SSH-ключей

Благодаря SSH-ключам процесс подбора пароля становится попросту нереалистичным. Представьте, существует 2**2048 комбинаций ключа.

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

Изменение порта SSH

Порт 22, стандартный для SSH, давно стал мишенью для злоумышленников. Сканеры и боты непрерывно «простукивают» интернет в поисках серверов, открытых на этом порту. Их задача найти доступный сервер, а затем начать перебор паролей, используя огромную базу простых и популярных комбинаций.

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

Простым решением станет смена порта 22 на нестандартный, любой, какой вам нравится. Например 50321.

Для начала проверьте, что порт, который вы хотите использовать, не занят никаким другим приложением. Для этого воспользуемся утилитой netstat. Убедитесь, что необходимый пакет net-tools установлен.

sudo apt install net-tools

Проверяем порт 50321.

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

sudo netstat -tuln | grep 50321

Ничего не вывелось? — Значит порт не занят. Можем проверить порт 22 и увидеть, что он действительно занят и используется.

Перейдите в конфиг SSH-сервера. Используем текстовый редактор nano

nano /etc/ssh/sshd_config

Уберите "#" в строке port и вместо 22 укажите желаемый. В нашем случае — 50321. Выглядеть это должно так.

Переключите раскладку на английский язык и нажмите CTRL+X , далее Y, затем Enter для сохранения файла.

Перезапустите сервис SSH.

sudo systemctl restart ssh

После перезапуска не торопитесь закрывать текущее окно сервера. Временно оставьте его открытым. Если что-то пойдет не так, то можно будет откатить изменения.

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

Резервное копирование данных

На этих трех пунктах можно было бы завершить базовые настройки безопасности. Регулярные обновления, SSH-ключи и нестандартный порт SSH в совокупности дают огромный эффект. Соблюдение этих пунктов снизит возможность взлома на 90-95% по сравнению со стандартными настройками. Если вы неопытный пользователь и не размещаете на сервере сверхконфиденциальные данные, то этого будет более чем достаточно.

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

Разберемся на практике. Для ОС Ubuntu, Debian, CentOS можно использовать встроенную утилиту tar.

tar -cvzf /путь/к/backup.tar.gz /путь/к/папке

/путь/к/backup.tar.gz — путь и название архива.

/путь/к/папке — путь к папке, которая будет заархивирована. Можно указать название конкретного файла или просто " * " , чтобы добавить в архив все папки и файлы из текущего каталога.

Например, заархивируем папку share, которая находится в корневом каталоге /root Проверяем, что мы действительно в /root — cd /root

Используем команду для архивации через tar

tar -cvzf backup.tar.gz share

После завершения архивации используйте команду ls для проверки, что файл действительно создался.

Далее существует масса вариантов действий с данным архивом. Вы можете выгрузить его на свой компьютер через sFTP или на облачное хранилище. Создания ручной копии раз в 2 недели будет вполне достаточно (тем не менее, это зависит от типа вашего проекта).

Можно сделать автоматическое создание архива через Cron и последующую выгрузку на внешнее хранилище — даже с интервалом в 24 часа. Но это уже для особо крупных проектов.

Linux (для продвинутых)

Настройка брандмауэра

Воспользуемся утилитой Iptables (встроена в Ubuntu, Debian, CentOS). Проверить актуальные правила можно так:

sudo iptables -L -v -n

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

sudo iptables -A INPUT -p tcp --dport 50321 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

Далее предоставляем список часто используемых команд в Iptables. Рекомендуем вам в индивидуальном порядке рассматривать использование тех или иных конфигураций файрволла.

Запретить весь трафик от конкретного адреса. Где в аргументе -s указывается исходящий адрес.

sudo iptables -A INPUT -s 192.168.1.100 -j DROP

Запретить входящий трафик по определённому порту. Где --dport — это блокируемый порт.

sudo iptables -A INPUT -p tcp --dport 8080 -j DROP

Для сохранения созданных правил используйте команду

sudo /sbin/iptables-save

Процесс настройки Iptables подробно описан в отдельной статье. Рекомендуем к ознакомлению.

Fail2Ban — блокировка брутфорсеров

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

Установка

sudo apt install fail2ban -y

Убеждаемся, что служба Fail2Ban действительно запущена и проверяем статус.

sudo systemctl start fail2ban
sudo systemctl enable fail2ban
sudo systemctl status fail2ban

Рекомендуется не изменять напрямую файлы конфигурации /etc/fail2ban/fail2ban.conf и /etc/fail2ban/jail.conf, так как они могут быть перезаписаны при обновлениях. Вместо этого создайте их копии с расширением .local для внесения изменений:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Откройте файл в текстовом редакторе.

nano /etc/fail2ban/jail.local

Основные настройки:

[DEFAULT]
# Игнорируемые IP-адреса (например, ваш IP).
ignoreip = 127.0.0.1/8 ::1

# Время блокировки IP-адреса.
bantime = 10m

# IP-адрес блокируется, если он выполняет "maxretry" попыток в течение "findtime".
findtime = 10m

# Максимальное количество попыток до блокировки.
maxretry = 5

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

После внесения изменений перезапустите Fail2Ban.

sudo systemctl restart fail2ban

Проверка журнала отладки:

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

2FA Google — двойная аутентификация

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

Установим модуль PAM для Google Authenticator

sudo apt install libpam-google-authenticator

Выполните команду google-authenticator от имени пользователя, для которого настраивается 2FA:

google-authenticator

Вам будет задан следующий вопрос

  • Do you want authentication tokens to be time-based (y/n): Введите y для использования одноразовых паролей (TOTP).

Далее высветится большой QR-код, данные для ручного добавления и коды восстановления. Последние следует сохранить в безопасном месте. Они понадобятся на случай, если вы потеряете доступ к генератору кодов.

Загрузите приложение аутентификатора Google. Android | IOS

Отсканируйте предоставленный код. После чего аккаунт добавится в ваше приложение.

  • Update the .google_authenticator file (y/n): Введите y для сохранения настроек.

  • Do you want to disallow multiple uses of the same authentication token? (y/n): Рекомендуется ввести y для предотвращения повторного использования одного и того же токена.

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

Если вы сталкиваетесь с проблемами из-за низкой точности синхронизации времени, вы можете увеличить временное окно с его стандартного размера (3 разрешённых токена: предыдущий, текущий и следующий) до 17 разрешённых токенов (8 предыдущих, текущий и 8 следующих). Это обеспечит допуск рассинхрона времени до 4 минут между клиентом и сервером.

Введите y для увеличения временного окна, что может быть полезно при рассинхронизации времени.

  • Enable rate-limiting (y/n): Введите y для ограничения частоты попыток аутентификации, чтобы предотвратить атаки перебором.

Откройте файл конфигурации PAM для SSH:

sudo nano /etc/pam.d/sshd

Добавьте следующую строку в начало файла. Это указывает системе использовать модуль pam_google_authenticator для аутентификации.

auth required pam_google_authenticator.so

Сохраните и закройте файл. Далее откройте файл конфигурации SSH:

sudo nano /etc/ssh/sshd_config

Установите значение yes для параметра ChallengeResponseAuthentication. Эти настройки включают использование PAM и требуют как публичного ключа, так и одноразового пароля для аутентификации.

Сохраняем файл и закрываем. После внесения изменений перезапустите службу SSH для применения новых настроек:

sudo systemctl restart ssh

Попробуйте подключиться к серверу. Сначала будет запрошен код аутентификатора. Введите его.

Затем пароль от вашего сервера. Подключение выполнено успешно!

Антивирус ClamAV

Несмотря на то, что операционные системы на базе Linux, считаются более защищенными, чем Windows, использование антивируса может быть полезным. Это особенно важно, когда вы часто обмениваетесь файлами или используете сервер в корпоративной среде. Мы рассмотрим бесплатный антивирус ClamAV с открытым исходным кодом. Он умеет сканировать систему и выявлять вирусы, трояны, шпионские программы и другие виды вредоносного ПО.

Установка

sudo apt install clamav -y

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

sudo systemctl stop clamav-freshclam
sudo freshclam

Убедимся, что служба запущена.

sudo systemctl start clamav-freshclam

Ручное сканирование

clamscan -r /путь/к/папке

Сканирование всех файлов системы

sudo clamscan -r -i /

Last updated