Безопасность сайта начинается с уменьшения площади возможной атаки.
Чеклист, который выработал и применяю у себя:
— IP-адрес реального сервера никогда не был прописан в DNS домена. В DNS попадает proxy или балансер — от Cloudflare, Fortes, Qrator или вашего другого сервера.
— Отключена возможность зайти под root пользователем. Вначале сделали нового пользователя, дали ему sudo-права, потом запретили вход из-под root.
— SSH-логин возможен только по ключу, пароли отключены совсем.
— SSH работает на нестандартном порте — 22-й слишком очевиден, меняем.
— Стоит и настроен firewall. Закрыты все порты, кроме нужных: 80 и 443 для сайта, порт для SSH, порт под метрики для мониторинга. Мой выбор ufw, его вполне хватает всё перекрыть.
— Установлен fail2ban — чтобы не донимали сервер брутфорсом.
— Операционная система и системные программы периодически обновляются.
— На сервере отключена возможность отправки почты. Совсем. Если взломают — сервер не станет рассадником спама и не нужно будет его IP вычищать из блеклистов. Вся почта отправляется через внешний SMTP.
— Не ставим или удаляем FTP — протокол устаревший и через него часто ломают серверы.
— Во всех папках для загрузки файлов через сайт стоит запрет на выполнение кода. В nginx и apache прописывается запрет. WordPress и Битрикс чаще всего ломают именно так — заливают исполняемый PHP-файл в загрузки и запускают по прямой ссылке.
— PHP позволяет запретить вызов некоторых функций. Вам точно нужен eval()?
— В идеале — код движка размещён выше корня веб-сервера. Так сделано во всех «взрослых» фреймворках. WP и Битрикс требуют ухищрений, но тоже можно кое-что сделать.
— Движок обновлён до свежей версии. Тут у клиентов зачастую беда, потому что поддержкой не занимаются.
— Код сайта в git. Всегда можно посмотреть и откатить любые заражения за одну минуту. git reset --hard и всё почистили.
— Минимум раз в сутки делается бэкап базы данных и загруженных файлов.
— На сервере установлены и периодически запускаются руткит-сканеры.
Это базовые действия. Опытные сисадмины добавят ещё пару десятков пунктов.
У меня большая часть этих действий происходит автоматически, потому что прописана в ansible-плейбуке. Но и руками делается тоже быстро.
А что я забыл и вы бы добавили в этот чеклист?
