Безопасность сайта начинается с уменьшения площади возможной атаки.
Чеклист, который выработал и применяю у себя:
– 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-плейбуке. Но и руками делается тоже быстро.
А что я забыл и вы бы добавили в этот чеклист?