Защита сайта: файрвол, ограничение входа, права на файлы и поиск вредоносного кода

80% взломов сайтов происходят через пять типовых точек входа: устаревшие плагины, слабые пароли, открытые резервные копии баз данных, обход загрузки файлов и подбор пароля SSH. Для защиты не нужны дорогие продукты — хватит четырёх шагов: в облачной группе безопасности...

独立站安全加固:四层防御与一条红线Site hardening: four layers of defense and one red line 被黑的站 80% 是弱口令和未更新插件,不是0day —— 加固先堵常见入口80% of breaches come from weak passwords and outdated plugins, not zero-days 层Layer 关键动作Key action 量化门槛Quantitative bar 1 防火墙1. Firewall 云安全组 + WAF · 只开80/443/SSHSG + WAF, open only 80/443/SSH SSH 限固定IP,禁密码登录SSH whitelist, key-only login 2 登录限制2. Login lock 失败5次锁30分钟 · 改默认路径Lock after 5 fails, rename admin path 2FA必须开,密码≥16位2FA on, 16-char min password 3 文件权限3. File perms 目录755 文件644 · wp-config只读dirs 755, files 644, wp-config 400 uploads 禁PHP执行No PHP execution in uploads 4 恶意扫描4. Malware scan 每周扫核心文件 · 比对哈希Weekly core-file hash check 插件主题7天内必须更新Patch plugins within 7 days 红线:被黑后第一动作不是查后门,是断开数据库写入并从最近干净备份恢复Red line: after a breach, restore from clean backup before hunting backdoors 在线清理会漏掉藏在cron和数据库里的webshell,恢复比清理更彻底Live cleanup misses DB/cron webshells; restore beats cleaning 常见被黑入口排名Top breach vectors 1. 未更新插件/主题漏洞 2. wp-admin弱口令 3. 数据库备份文件暴露在web目录1. Outdated plugins 2. Weak wp-admin passwords 3. Exposed DB backups 4. 文件上传绕过 5. SSH端口暴露+密码爆破 —— 前五类占独立站被黑事件的80%以上4. Upload bypass 5. SSH brute force — top 5 cover 80%+ of breaches
Четыре уровня защиты сайта: файрвол, ограничение входа, права на файлы, поиск вредоносного кода

Защита сайта: файрвол, ограничение входа, права на файлы и поиск вредоносного кода

Сначала вывод:80% взломов сайтов происходят через пять типовых точек входа: устаревшие плагины, слабые пароли, открытые резервные копии баз данных, обход загрузки файлов и подбор пароля SSH. Для защиты не нужны дорогие продукты — хватит четырёх шагов: в облачной группе безопасности открыть только 80/443 и порт 22 с ограничением по IP, блокировать wp-admin на 30 минут после 5 неудачных попыток и включить обязательную 2FA, выставить права 755 на каталоги и 644 на файлы, запретить выполнение PHP в uploads, раз в неделю сверять хеши системных файлов. После взлома первое действие — не чистить сайт вручную, а восстановить его из последней чистой резервной копии.

1. Firewall: группа безопасности в облаке плюс WAF — сначала закройте ненужные порты

Многие думают, что файрвол — это программа на сервере, но для сайта на облачном хостинге первая линия защиты — группа безопасности облачного провайдера. Главная опасность — когда в группе безопасности по умолчанию открыты порты 3306, 6379, 9000: база данных и Redis оказываются в открытом интернете, и сканеры подбирают к ним доступ за считаные минуты. Правильно — разрешить в группе безопасности только 80 и 443, а порт 22 ограничить фиксированным IP вашего офиса.

Вторая линия защиты — WAF (Web Application Firewall). Бесплатной версии Cloudflare достаточно: она автоматически блокирует SQL-инъекции, XSS и типовые сканеры. Не делайте правила WAF слишком агрессивными, иначе заблокируете обычных посетителей. Сначала включите режим только логирования на 3 дня, убедитесь, что доля ложных срабатываний ниже 1%, и только потом переключайтесь на блокировку.

Порт/сервис Состояние по умолчанию Состояние после усиления Причина
80/443 Открыт 0.0.0.0/0 Открыт 0.0.0.0/0 Должен быть доступен из интернета
22 SSH Открыт 0.0.0.0/0 Ограничить фиксированным IP компании, перейти на вход по ключу Главная цель брутфорса паролей
3306 MySQL Часто открывают по ошибке Разрешить только 127.0.0.1 Никогда не открывать в интернет
6379 Redis Часто открывают по ошибке Только локально, задать пароль При доступе без авторизации злоумышленник запишет свой публичный ключ
9000 PHP-FPM Локальный socket Оставить локальный socket, не открывать TCP Доступ из интернета не нужен
8888/宝塔面板 Часто открыта наружу Ограничить по IP и сменить порт по умолчанию Панель — частая цель атак

场景示例:一个用宝塔面板的WordPress站,刚上线时安全组全开,三天后服务器CPU跑到100%。登上去看是3306端口被境外IP爆破,MySQL日志里全是连接失败记录。改成安全组只开80/443和限公司IP的22,CPU立刻降回5%。这个事故10分钟就能避免,但多数人上线时根本不看安全组。

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

2. Ограничение входа: сужаем вход для брутфорса

wp-admin в WordPress — главный вход для взлома независимого сайта. Логин admin по умолчанию, простой пароль, открытая страница входа — сканер пробегает словарь за пару часов. Контринтуитивный факт: плагин ограничения входа работает лучше любого сканера безопасности, потому что большинство брутфорс-атак вообще не доходит до эксплуатации уязвимостей — они упираются в страницу входа и блокируются.

Три обязательных ограничения входа: блокировка после 5 неудач на 30 минут, смена стандартного пути входа (/wp-admin на случайную строку), обязательная 2FA. Пароль не короче 16 символов, генерируйте менеджером паролей, не используйте слово плюс цифры. С SSH то же самое: запретите вход по паролю, оставьте только ключи.

Параметр По умолчанию Значение защиты Инструмент/реализация
Блокировка после неудачных входов Без ограничений 5 неудач — блокировка на 30 минут Wordfence или свой fail2ban
Путь входа /wp-admin Случайная строка, например /login-7f3k Плагин WPS Hide Login
Двухфакторная аутентификация Нет Обязательный TOTP 2FA Wordfence или Two Factor
Длина пароля 6 символов ≥16 случайных символов Генерация менеджером паролей
Аутентификация SSH Вход по паролю Только ключи, пароль запрещён в sshd_config указать PasswordAuthentication no
Пользователь базы данных root удалённо Отдельный пользователь, только с локального хоста Создать отдельный аккаунт в MySQL

Пример из практики: SaaS-сайт для зарубежных рынков, страница входа в админку на /secret-admin, включена 2FA, блокировка после 5 неудач на 30 минут. Логи показывают около 2000 попыток входа в неделю с зарубежных IP — все заблокированы, ни одна не прошла. Без ограничений при средней стойкости пароля вероятность успешного подбора за 3 месяца превысила бы 30%.

Общий подход к выбору плагинов и технологическому стеку — в статье Четыре собственных плагина технологического стека crater.

3. Права на файлы: чтобы загруженные вредоносные файлы не запускались

Права на файлы — слой, который многие игнорируют. После взлома WordPress атакующий обычно загружает PHP-вебшелл в каталог wp-content/uploads. Если в uploads разрешено выполнение PHP, вебшелл сразу получает контроль над сайтом; если выполнение PHP запрещено, загруженный файл не запустится, и атакующий останется ни с чем.

Стандартные права: каталоги 755, файлы 644, wp-config.php — 400 (только владелец может читать). Не ставьте всё на 777 ради удобства — это всё равно что повесить ключ на двери. Для каталога uploads добавьте в конфигурацию nginx правило, запрещающее выполнение .php, .phtml, .php5 и подобных файлов.

Путь Права Владелец Пояснение
Корень сайта 755 www-data:www-data Не давать 777
wp-config.php 400 root Веб-процесс не может читать
wp-content/themes 755 www-data Нужны права на запись для автообновления
wp-content/uploads 755 www-data Запретить выполнение PHP
wp-content/plugins 755 www-data Нужна запись для обновления плагинов
Каталог .git Не выставлять в веб — Раскрытие приведёт к утечке исходного кода

Ещё одна частая причина взлома — файлы резервных копий базы данных лежат прямо в веб-каталоге. Многие плагины бэкапа по умолчанию сохраняют .sql.gz в wp-content/backup/, и атакующий, найдя его сканером, просто скачивает файл и получает все данные сайта. Правильно — хранить бэкапы вне корня сайта либо после создания копии автоматически загружать её в объектное хранилище и удалять локальную версию. О стратегии бэкапа читайте Бэкап и восстановление сайта.

4. Вредоносные сканирования и патчи: раз в неделю, обновление в течение 7 дней

Искать вредоносный код нужно не после взлома, а заранее. Раз в неделю сверяйте хеши системных файлов: если хеши файлов ядра WordPress не совпадают с известной версией, значит, их изменили. Обновления плагинов и тем нужно устанавливать в течение 7 дней — от публикации уязвимости до её использования автоматическими сканерами в среднем проходит 14 дней, так что патч за 7 дней отсекает большинство атак.

Сканеры делятся на три типа: плагины вроде Wordfence проверяют известные сигнатуры webshell; ClamAV запускает антивирусное сканирование на уровне сервера; анализ серверных логов выявляет подозрительные шаблоны доступа. Используйте их вместе, не надейтесь, что один инструмент закроет всё. О подходе к анализу логов AI-краулеров читайте анализе логов AI-краулеров, те же методы анализа логов помогут находить и вредоносные сканеры.

Что проверить Частота Инструмент Работа с исключениями
сверка хешей системных файлов Еженедельно Wordfence core integrity Нашли расхождения — восстановите из чистой версии
Обновление плагинов и тем Каждый понедельник Админка WP + логи Обновить в течение 7 дней
Сканирование webshell Еженедельно ClamAV или Wordfence Изолировать и удалить вредоносные файлы
Подозрительные входы Ежедневно Логи fail2ban Автоматическая блокировка IP атакующих
Недавно изменённые файлы в веб-каталоге Еженедельно find -mtime -7 Неожиданные изменения — сразу разбираться
Аномальные записи в базе данных Еженедельно base64-контент в wp_posts Удалить скрытый код eval

Контринтуитивное напоминание: после взлома не спешите чистить сайт онлайн. Главная проблема онлайн-очистки в том, что webshell и задачи cron, спрятанные в базе данных, вычистить до конца не получится, и через две недели всё вернётся. Правильный порядок: отключить сайт от внешних сервисов, восстановить из последнего чистого бэкапа, сменить все пароли и ключи, проверить cron и остатки в базе данных, затем снова запустить сайт. Полный порядок действий после взлома читайте Очистка и повторная индексация сайта после взлома.

Чек-лист ежедневного осмотра смотрите Шесть задач на месяц в период обслуживания сайта, зафиксируйте в нём и усиление безопасности. Как настроить пороги оповещений, читайте Мониторинг сайта и оповещения.

FAQ: частые вопросы

Сайт взломали — что делать в первую очередь?
Не чистите онлайн, обычно это не помогает до конца. Правильный порядок: первое — немедленно переведите сайт в режим обслуживания или уберите его из балансировщика, чтобы прекратить эксплуатацию; второе — восстановите все файлы и базу данных из последнего чистого бэкапа; третье — смените все пароли: wp-admin, SSH, базы данных, FTP, панели хостинга — все; четвёртое — проверьте задачи cron и таблицу wp_options в базе данных на скрытые бэкдоры; пятое — убедившись, что всё чисто, снова запустите сайт и отправьте запрос на пересмотр в Google Search Console. Онлайн-очистка годится только как временная мера, а не как окончательное решение.
Стоит ли покупать платный WAF, хватит ли бесплатной версии Cloudflare?
Для большинства B2B-сайтов бесплатного тарифа Cloudflare достаточно. В него уже входят базовая защита от SQL-инъекций и XSS, блокировка типовых сканеров и глобальный rate limiting. Платные правила WAF и Bot Management в тарифе Pro за 20 долларов в месяц покупать не стоит, пока у вас нет явных доказательств атак. Вложите деньги в ограничение попыток входа и права на файлы — отдача будет выше. О платном WAF стоит думать только если вас уже роняли через DDoS или спам через формы превышает нормальный поток заявок более чем в 10 раз.
Как часто обновлять плагины WordPress и безопасно ли автообновление?
Патчи безопасности нужно ставить в течение 7 дней после раскрытия уязвимости: среднее окно, за которое публичную уязвимость подхватывают автоматические сканеры, — 14 дней. Для ядра и плагинов безопасности автообновление можно включить, а вот с функциональными плагинами будьте осторожны — автообновление иногда конфликтует с темой и приводит к белому экрану. Рекомендую так: автообновление для ядра, плагинов безопасности и кэширования, а кастомные функциональные плагины сначала прогонять на staging, потом выкладывать. Раз в месяц, по понедельникам, запускайте полное обновление и делайте резервную копию перед ним.
Какие права выставить для wp-config.php и каталога uploads?
Для wp-config.php — 400, владелец root: веб-процесс не сможет его прочитать и даже при взломе сайта не получит пароль от базы. Каталоги — 755, файлы — 644, не ставьте 777 ради удобства. В конфигурации nginx или Apache добавьте для каталога uploads запрет на выполнение файлов .php, .phtml, .php5 — тогда злоумышленник не сможет запустить загруженный webshell. После настройки прав пройдитесь по админке WordPress и проверьте, что загрузка картинок, обновление плагинов и автообновление работают, чтобы слишком строгие права не сломали бизнес.
Менять ли стандартный SSH-порт 22 и можно ли оставить вход по паролю?
Вход по паролю нужно отключить, разрешить только вход по ключу. Смена стандартного порта отсекает половину сканеров, но не заменяет вход по ключу. Правильный порядок: в sshd_config задать PasswordAuthentication no, PermitRootLogin no, PubkeyAuthentication yes, затем заменить порт 22 на высокий, например 52022, и в группе безопасности облака ограничить SSH-порт фиксированным IP офиса. На ключ поставьте passphrase и храните его в менеджере паролей, не оставляйте приватный ключ без пароля на сервере.
Как понять, что сайт взломали, и есть ли предвестники?
Обычно есть пять признаков: Google Search Console сообщает о вредоносном ПО, в панели вебмастера появляется масса китайских ключей про азартные игры или порно, резко растут нагрузка на CPU и трафик, в wp-admin заходят с незнакомых IP, в исходном коде страниц появляются подозрительные iframe или код eval. Раз в неделю запускайте проверку целостности файлов ядра в Wordfence: если хеши не совпадают с официальными, реагируйте сразу. Держите включённым fail2ban для отслеживания неудачных входов: IP с более чем 50 неудачными попытками за сутки блокируется на 24 часа. Как настроить оповещения мониторинга, смотрите Мониторинг сайта и оповещения в статье.

В заключение

В защите сайта дороже всего не инструменты, а установка «пронесёт». Независимый сайт — не банк, но это вход для ваших заявок: если его взломают или он упадёт, вы потеряете реальные лиды. Четыре уровня защиты не обязательно внедрять сразу, но порядок важен: сначала закрыть порты, потом ограничить вход, затем настроить права на файлы и в конце подключить сканирование. Первые три шага делаются за один день и дают максимальную отдачу.

Три шага на практике. Первый: зайдите в группу безопасности облака и закройте порты 3306, 6379, 8888 — им не место в открытом интернете, а SSH ограничьте IP-адресом компании. Второй: смените путь к wp-admin, включите 2FA и блокировку после 5 неудачных попыток, а для SSH перейдите на вход по ключу. Третий: раз в неделю в фиксированное время проверяйте хеши основных файлов и обновляйте плагины. Выполнив эти три шага, вы уже отбиваете 80% типовых атак.

Запомните одну фразу: независимые сайты взламывают редко из-за изощрённых хакеров — чаще из-за слабых паролей, необновлённых плагинов и открытых резервных копий баз данных. Закройте эти три входа, и это поможет лучше любой системы безопасности.

crater
crater Эксперт Crater

Официальный аккаунт организации · crater Crater

环形山 (Crater) — компания, которая помогает выходить на зарубежные рынки: разработка сайтов на WordPress, Google SEO и комплексный рост в GEO. Мы работаем с умными устройствами, промышленным оборудованием, SaaS и новой энергетикой.

Возможности продуктаБелая книга по методологииОтраслевые отчёты
965篇分享
78статей в базе знаний