Как базово защитить вход в админку сайта
Админка сайта почти всегда привлекает автоматические попытки входа. Даже если проект небольшой, боты могут перебирать стандартные URL, логины и пароли. Базовая защита входа не делает сайт неуязвимым, но убирает самые простые риски: слабые пароли, старые аккаунты, бесконечные попытки входа и открытый доступ без контроля.
Проверить старые аккаунты
Первое, что стоит сделать, — посмотреть список пользователей с доступом в админку. На старых проектах часто остаются аккаунты бывших сотрудников, подрядчиков или тестовые пользователи.
SELECT id, email, role, status, last_login_at
FROM users
WHERE role IN ('admin', 'manager');
Неактуальные аккаунты лучше отключить, а не просто надеяться, что пароль никто не знает.
Сильные пароли и уникальные доступы
Общий логин admin на всех сотрудников — плохая практика. Невозможно понять, кто что сделал, и сложно безопасно отозвать доступ одному человеку.
- у каждого администратора свой аккаунт;
- нет паролей admin/admin и похожих;
- пароли не отправляются в открытом виде в чатах;
- после ухода сотрудника доступ отключается;
- пароли меняются после подозрительных событий.
Ограничение попыток входа
Форма входа не должна позволять бесконечно перебирать пароль. Можно ограничивать попытки по IP, логину или их сочетанию.
$key = 'login-attempts:' . Yii::$app->request->userIP;
$attempts = (int)Yii::$app->cache->get($key);
if ($attempts >= 10) {
throw new TooManyRequestsHttpException('Слишком много попыток входа');
}
Yii::$app->cache->set($key, $attempts + 1, 900);
Это простой пример. В реальном проекте нужно аккуратно учитывать успешный вход, срок блокировки и риск заблокировать офис с общим IP.
Двухфакторная авторизация
Если админка управляет заказами, клиентскими данными или оплатами, 2FA сильно снижает риск входа по украденному паролю. Не всегда нужно внедрять сложную систему сразу для всех ролей. Можно начать с администраторов.
Минимально стоит хотя бы предусмотреть 2FA для ролей с полным доступом и резервные коды восстановления.
Ограничение по IP
Для некоторых проектов админку можно закрыть по IP. Это хорошо работает, если сотрудники заходят из офиса или через VPN. Но если IP часто меняется, такой подход будет мешать работе.
location /admin/ {
allow 203.0.113.10;
deny all;
try_files $uri $uri/ /index.php?$args;
}
Важно не закрыть случайно AJAX endpoints, которые нужны публичной части. Поэтому правило нужно проверять на тестовом сценарии.
Скрывать URL админки — не защита
Нестандартный URL админки может уменьшить шум от простых ботов, но не заменяет нормальную авторизацию. Если доступ слабый, скрытый путь всё равно найдут через логи, ссылки или утечку.
Нормальная защита — это пароли, роли, ограничение попыток, HTTPS, логи и актуальные зависимости.
HTTPS и cookies
Вход в админку должен работать только через HTTPS. Cookies авторизации лучше передавать с secure и httpOnly.
'session' => [
'cookieParams' => [
'httpOnly' => true,
'secure' => true,
'sameSite' => yii\web\Cookie::SAME_SITE_LAX,
],
],
Перед включением secure нужно убедиться, что HTTP всегда редиректит на HTTPS.
Логи входов
Полезно фиксировать успешные и неуспешные попытки входа: время, пользователя, IP, user agent. Не нужно писать пароль в лог даже при ошибке.
Yii::warning([
'email' => $this->email,
'ip' => Yii::$app->request->userIP,
], 'admin-login-failed');
Если неуспешных попыток много, это повод включить более жёсткие ограничения или проверить, не открыт ли стандартный путь админки для всего интернета.
Чек-лист базовой защиты
- Удалить или отключить старые админские аккаунты.
- Убрать общие логины.
- Проверить силу паролей.
- Включить ограничение попыток входа.
- Рассмотреть 2FA для администраторов.
- Ограничить доступ по IP, если это подходит процессу.
- Проверить HTTPS и cookie-флаги.
- Логировать успешные и неуспешные входы.
Защита админки начинается с простых вещей. Они не требуют большого бюджета, но закрывают много типовых сценариев, которыми пользуются автоматические боты и случайные злоумышленники.
Комментарии (0)
Пока нет комментариев. Будьте первым!