Защита сервера: полное руководство по безопасности Linux
Безопасность сервера - это основа качественной работы любого бизнеса, стартапа или простого веб-сайта. В 99% случаев нарушения на клиентских серверах происходят по причине взлома, а сам взлом - следствие недостаточной безопасности сервера.
В этой статье мы разберем наиболее эффективные способы защиты сервера. Начнем с минимально необходимых мер и закончим продвинутой защитой. В первую очередь материал предназначен для новичков, но и любой системный администратор может использовать его как отличную памятку.
Каждая инструкция максимально упрощена. Даже если вы подключаетесь к серверу впервые, не переживайте - вы во всем разберетесь.
#Linux: базовые настройки
По умолчанию команда sudo может не выполняться в ОС Debian. Может потребоваться установка пакета командой apt install sudo либо просто удаление sudo из используемых команд.
Прежде чем начать, убедитесь, что в системе есть текстовый редактор nano.
Ubuntu / Debian
sudo apt install nanoCentOS
yum install nano#Регулярные обновления системы
Это база, ключевая мера безопасности для любого сервера. Если в системе обнаружена уязвимость, важно одним из первых установить обновление и устранить проблему. Всего одна команда заметно снижает риск взлома системы.
Ubuntu / Debian
sudo apt update && sudo apt upgrade -yCentOS
sudo yum update -y#Использование SSH-ключей
Благодаря SSH-ключам подбор пароля становится попросту нереалистичным. Только представьте - количество возможных комбинаций ключа достигает 2 в степени 2048.
Подробно процесс использования SSH-ключей и отключения доступа к серверу по паролю описан в отдельной статье - рекомендуем ознакомиться.
#Изменение порта SSH
Порт 22, стандартный для SSH, давно стал мишенью для злоумышленников. Сканеры и боты непрерывно простукивают интернет в поисках серверов, открытых на этом порту. Их задача - найти доступный сервер и начать перебор паролей по огромной базе простых и популярных комбинаций.
Результат такой активности - переполненные логи с сообщениями о неуспешных подключениях, из-за чего анализ реальных угроз усложняется. Смена порта значительно сокращает этот шум и делает сервер менее заметным для подобных атак.
Простое решение - заменить порт 22 на нестандартный, любой удобный вам. Например, 50321. Сначала проверьте, что выбранный порт не занят другим приложением. Для этого воспользуемся утилитой netstat из пакета net-tools.
Ubuntu / Debian
sudo apt install net-toolsCentOS
sudo yum install net-toolsПроверяем порт 50321. Это значение выбрано лишь в качестве примера - вы можете использовать любой другой свободный порт.
sudo netstat -tuln | grep 50321Если команда ничего не вывела, порт свободен. Для сравнения проверим порт 22 и убедимся, что он действительно занят и используется.

Перейдите в конфигурацию SSH-сервера с помощью редактора nano.
nano /etc/ssh/sshd_configУберите символ # в строке Port и вместо 22 укажите желаемое значение. В нашем случае - 50321. Результат должен выглядеть так.

Переключите раскладку на английский язык и нажмите CTRL+X, затем Y и Enter для сохранения файла. После этого перезапустите службу SSH.
Ubuntu / Debian
sudo systemctl restart sshCentOS
sudo systemctl restart sshdПосле перезапуска не торопитесь закрывать текущее окно сервера. Оставьте его открытым на время. Если что-то пойдет не так, вы сможете откатить изменения. В новом окне попробуйте подключиться к серверу по указанному порту.
#Резервное копирование данных
На этих трех пунктах можно было бы завершить базовую настройку безопасности. Регулярные обновления, SSH-ключи и нестандартный порт SSH в совокупности дают огромный эффект и снижают вероятность взлома на 90-95% по сравнению со стандартными настройками. Для неопытного пользователя, который не хранит на сервере сверхконфиденциальные данные, этого более чем достаточно.
Тем не менее никогда нельзя забывать про резервные копии. Это отличное правило, которое пригодится не только при работе с серверами, но и в собственных проектах. Ни один хостинг-провайдер не может гарантировать 100% сохранность данных. Случаи бывают разные - от банального сбоя дисков до крупных инцидентов в дата-центре. Такие ситуации редки, но испытывать судьбу не стоит.
Разберемся на практике. Для Ubuntu, Debian и CentOS подойдет встроенная утилита tar.
tar -cvzf /путь/к/backup.tar.gz /путь/к/папке- /путь/к/backup.tar.gz - путь и название архива.
- /путь/к/папке - путь к папке, которая будет заархивирована. Можно указать конкретный файл или символ * для добавления в архив всего содержимого текущего каталога.
Например, заархивируем папку share из корневого каталога /root. Сначала убедимся, что находимся в нужном каталоге.
cd /rootЗатем выполним архивацию через tar.
tar -cvzf backup.tar.gz shareПосле завершения архивации выполните команду ls и убедитесь, что файл действительно создан.

Дальше с архивом можно поступать по-разному. Вы можете скачать его на свой компьютер по sFTP или выгрузить в облачное хранилище. Ручной копии раз в две недели обычно достаточно, хотя все зависит от типа проекта. Для крупных проектов архивацию и выгрузку на внешнее хранилище можно автоматизировать через Cron, даже с интервалом в 24 часа.
#Linux: продвинутая защита
#Настройка брандмауэра
Воспользуемся утилитой iptables - она встроена в Ubuntu, Debian и CentOS. Посмотреть текущие правила можно так.
sudo iptables -L -v -nЧтобы избежать потери доступа к серверу, в первую очередь явно разрешите порт 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Чтобы сохранить созданные правила, используйте команду ниже.
Ubuntu / Debian
sudo /sbin/iptables-saveCentOS
sudo /sbin/service iptables saveПроцесс настройки iptables подробно описан в отдельной статье - рекомендуем к ознакомлению.
#Fail2Ban - блокировка брутфорсеров
Fail2Ban - эффективный инструмент для повышения безопасности сервера. Он отслеживает логи системных служб и автоматически блокирует IP-адреса, с которых выполняются многократные неудачные попытки входа. Такой подход защищает сервер от перебора паролей и заодно разгружает логи от лишних данных.
Установка
Ubuntu / Debian
sudo apt install fail2ban -yCentOS
sudo yum install epel-release
sudo yum install 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Вы можете задать собственные значения, например более строгие, как на скриншоте ниже.

При значении bantime = -1 адреса нарушителей блокируются навсегда. Это эффективный метод борьбы с ботами, но применять его следует осторожно, чтобы случайно не заблокировать доверенных пользователей.
После внесения изменений перезапустите Fail2Ban.
sudo systemctl restart fail2banПроверить журнал работы можно так.
sudo tail -f /var/log/fail2ban.log#Двухфакторная аутентификация через Google Authenticator
Двухфакторная аутентификация значительно повышает безопасность сервера. После ее настройки при входе сначала запрашивается одноразовый OTP-код, который обновляется каждые 30 секунд, а затем пароль от сервера. Учитывайте, что для авторизации каждый раз потребуется телефон.
Установка модуля PAM
Ubuntu / Debian
sudo apt install libpam-google-authenticatorCentOS
sudo yum install epel-release
sudo yum install 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 секунд (3 токена: предыдущий, текущий и следующий). При проблемах с точностью синхронизации окно можно расширить до 17 токенов и допуска в 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, чтобы применить настройки.
Ubuntu / Debian
sudo systemctl restart sshCentOS
sudo systemctl restart sshdПопробуйте подключиться к серверу. Сначала система запросит код аутентификатора - введите его.

Затем введите пароль от сервера. Подключение выполнено успешно.
#Антивирус ClamAV
Операционные системы на базе Linux считаются более защищенными, чем Windows, но антивирус все равно может быть полезен. Это особенно важно, если вы часто обмениваетесь файлами или используете сервер в корпоративной среде. Рассмотрим бесплатный антивирус ClamAV с открытым исходным кодом. Он сканирует систему и выявляет вирусы, трояны, шпионские программы и другие виды вредоносного ПО.
Установка
Ubuntu / Debian
sudo apt install clamav -yCentOS
sudo yum install epel-release
sudo yum install clamav clamav-updateПосле установки обновите базу данных вирусов. Сначала остановите службу обновления, затем запустите обновление вручную.
sudo systemctl stop clamav-freshclam
sudo freshclamУбедитесь, что служба запущена.
sudo systemctl start clamav-freshclamРучное сканирование
Просканировать конкретную папку можно так.
clamscan -r /путь/к/папкеДля сканирования всех файлов системы используйте команду ниже.
sudo clamscan -r -i /Не нашли ответ? Мы на связи 24/7.Написать в поддержку