Как создать безопасный сервер Linux
Это перевод оригинальной статьи How to Build a Secure Linux Server.
Подписывайтесь на телеграм-канал usr_bin, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.
Безопасность не обязательно должна быть сложной.
Большинство уязвимостей возникают из-за игнорирования основных принципов. Безопасный Linux-сервер начинается с правильной базовой настройки, и она защитит от подавляющего большинства угроз, с которыми можно столкнуться.
#1. Начните с минимальной установки.
Каждый неустановленный пакет — это пакет, который не может быть использован для взлома. Удалите всё ненужное и устанавливайте только то, что действительно поддерживает систему.
Это небольшое решение на самом начальном этапе окупается с лихвой в дальнейшем. Оптимизированную систему проще обновлять, проще контролировать и сложнее взломать. Сохраняя простоту нашего сервера, мы уже предпринимаем один из самых эффективных шагов по обеспечению безопасности. Мы всегда можем добавить пакеты позже, когда они действительно понадобятся.
Меньшее количество пакетов = меньше уязвимостей = меньшая поверхность атаки.
Проверьте прослушиваемые порты:
sudo ss -tulpn
Эта команда выводит список всех прослушиваемых портов TCP и UDP в системе, а также процессов, которые ими владеют. Она очень полезна для проверки того, какие службы запущены и какие порты они используют.
Внимательно изучите вывод и убедитесь, что все перечисленные службы ожидаемы. Отключите или удалите все ненужные службы, чтобы уменьшить поверхность атаки.
# Check enabled services: systemctl list-unit-files --type=service | grep enabled # Disable and stop service sudo systemctl disable service_name sudo systemctl stop service_name # Remove unused packages apt autoremove --purge
#2. Защитите SSH
SSH — это основной способ доступа к нашим серверам, и именно поэтому он является одним из первых инструментов, которые пытаются использовать злоумышленники. Обеспечение безопасности SSH всегда должно быть первостепенной задачей.
Отключить вход в систему от имени root и вход по паролю.
Запретите прямой доступ root по SSH. Всегда входите в систему как обычный пользователь и используйте sudo вместо этого.
Отредактируйте файл конфигурации SSH ( /etc/ssh/sshd_config)
PermitRootLogin no PasswordAuthentication no
Отключите вход в систему с правами root и по паролю через SSH, чтобы снизить риск атак методом перебора (brute-force).
Измените стандартный порт SSH
Порт SSH по умолчанию — 22. Изменение его на нестандартный порт может сократить количество автоматизированных атак.
Fail2ban
Рекомендуется установить fail2ban для автоматической блокировки IP-адресов, демонстрирующих вредоносную активность. Это простой демон, который отслеживает логи и создает правила брандмауэра для блокировки злоумышленников после многократных неудачных попыток входа в систему.
#3. Включите брандмауэр (даже в облаке)
Брандмауэр контролирует, каким портам, протоколам и IP-адресам разрешено взаимодействовать с нашим сервером.
Блокируйте все входящие соединения, кроме конкретных сервисов, которые мы используем.
Если вы размещаете веб-сервер, разрешите порты 80 и 443. Для SSH разрешите только наш собственный порт SSH и, в идеале, ограничьте доступ определенными IP-адресами, если у вас статическое подключение.
#4. Поддерживайте систему в актуальном состоянии.
Если мы не устанавливаем обновления, злоумышленники могут легко воспользоваться известными уязвимостями в программном обеспечении. Многие атаки не используют новые или сложные методы, они используют старые ошибки, для которых уже доступны исправления.
Включите автоматические обновления безопасности
Автоматические обновления устанавливают важные исправления безопасности в фоновом режиме, поэтому не нужно помнить об этом.
# On Ubuntu / Debian sudo apt install unattended-upgrades sudo dpkg-reconfigure unattended-upgrades # On Rocky Linux / AlmaLinux / CentOS sudo dnf install dnf-automatic sudo systemctl enable --now dnf-automatic.timer
Важно:
не забывайте о перезагрузке! Некоторые обновления (например, исправления ядра) работают только после перезагрузки.
# Check if a reboot is needed # Ubuntu if [ -f /var/run/reboot-required ]; then echo "Reboot needed"; fi # RHEL-based systems sudo needs-restarting -r
#5. Используйте принцип наименьших привилегий для пользователей и сервисов
Запускать всё с правами администратора root опасно. Если что-то пойдёт не так, это приведёт к серьёзным последствиям. Сервисы и пользователи должны иметь только те права доступа, которые им действительно необходимы, и ничего больше. Это ограничивает масштабы ущерба в случае компрометации учётной записи или сервиса.
Не запускайте сервисы от имени root
Большинство современных сервисов поддерживают запуск от имени собственного пользователя, например:
Всегда проверяйте конфигурации сервисов и убедитесь, что они запускаются под отдельной учетной записью пользователя, а не под учетной записью администратора root. Таким образом, в случае взлома сервиса злоумышленник не получит автоматически полный контроль над системой.
Используйте Sudo только для административных задач
Пользователи должны входить в систему как обычные пользователи и использовать sudo только при необходимости.
- Отключите прямой вход от имени root.
- Используйте
sudoдля внесения изменений в систему. - Ограничьте административный доступ доверенными пользователями
Предоставляйте только необходимые разрешения
Не каждому пользователю необходим полный доступ с правами sudo. Мы можем разрешить только выполнение определённых команд.
sudo visudo # deploy user can restart nginx, but can’t run other admin commands. deploy ALL=(ALL) NOPASSWD: /bin/systemctl restart nginx
#6. Мониторинг логов
Логи показывают, что происходит в нашей системе. Мониторинг логов помогает выявлять подозрительную активность.
Получайте ежедневные сводки логов.
Установите Logwatch или настройте rsyslog для отправки ежедневных логов. Не нужно читать каждую строку лога, но следует регулярно просматривать сводки на предмет необычных закономерностей, таких как неожиданные попытки входа в систему, сбои в сервисах или проблемы с дисковым пространством.
Примечание:
Для более сложного мониторинга рекомендуется настроить централизованное логирование с помощью таких инструментов, как Elasticsearch и Kibana.
#7. Настройте правильное резервное копирование и восстановление
Как бы ни была защищена наша система, сбои все равно случаются: проблемы с оборудованием, случайные удаления, неудачные деплои или инциденты безопасности. Резервные копии — это последняя линия защиты.
Автоматизация резервного копирования
Резервное копирование должно выполняться автоматически и регулярно. Можно использовать rsync с cron, инструменты резервного копирования, такие как BorgBackup или Restic, либо снапшоты облачного провайдера.
Следуйте правилу 3–2–1
Простая и эффективная стратегия:
Это защищает от сбоев оборудования, случайного удаления и программ-вымогателей.
Делайте резервные копии того, что важно.
Сосредоточьтесь на данных, которые сложно восстановить:
Резервное копирование всей операционной системы обычно менее важно, чем резервное копирование критически важных данных и конфигурационных файлов.
# 8. Мониторинг целостности файлов
Безопасность – это не только блокирование атак, но и умение распознавать подозрительные действия.
Мониторинг целостности файлов (FIM) — это средство обеспечения безопасности, которое отслеживает и проверяет изменения критически важных файлов, конфигураций и системных ресурсов, чтобы гарантировать, что они остаются авторизованными и неизмененными.
Установите и настройте такие инструменты, как AIDE(Advanced Intrusion Detection Environment), для мониторинга целостности файлов. Эти инструменты создают базу данных важных системных файлов и оповещают, когда критически важные файлы изменяются неожиданным образом.
#9. Усильте защиту сетевых сервисов
Для каждого сервиса, предоставляемого через интернет, необходимо уделить время его безопасной настройке.
- Веб-серверы должны использовать
HTTPSс современными конфигурациямиTLS. - Базы данных не должны прослушивать публичные интерфейсы, если это не является необходимым.
- Фреймворки приложений должны работать с минимальными привилегиями
Читайте документацию по безопасности для каждого сервиса, который мы разворачиваем.
Заключительные мысли
Идеальной безопасности не существует, но хорошей безопасности можно достичь. Создание защищенного сервера — это не внедрение всех возможных мер безопасности. Это формирование мышления, ориентированного на безопасность.
Задайте себе следующие вопросы:
Зачем нужен этот сервис? Кому необходим доступ к этому ресурсу? Что произойдет, если этот компонент будет скомпрометирован?
На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал usr_bin, где будет еще больше полезной информации.