MySQL Ошибка 1045 (28000): Access denied for user (using password: YES)
Механизм аутентификации и авторизации пользователей в MySQL
Система безопасности MySQL идентифицирует учетную запись не только по имени пользователя, но и по IP-адресу или хосту, с которого инициировано подключение (составной идентификатор 'username'@'hostname'). Системная ошибка MySQL Error 1045 (SQLSTATE 28000): «Access denied for user 'appuser'@'192.168.1.50' (using password: YES)» возникает в следующих случаях:
- Неверный пароль или несовпадение хоста: Пользователь существует для хоста
'appuser'@'localhost', но подключение выполняется по сети с внешнего IP, для которого учетная запись не заведена ('appuser'@'%'). - Конфликт плагинов аутентификации: В MySQL 8.0 по умолчанию используется плагин
caching_sha2_password, который не поддерживается старыми клиентами или библиотеками (PHP PDO 7.1, старые драйверы), требующимиmysql_native_password. - Использование unix_socket плагина: Пользователь
rootпо умолчанию настроен на авторизацию через сокет операционной системы (auth_socket), что запрещает вход по паролю через TCP.
Бизнес-риски
Полный сбой подключения микросервисов к базе данных, остановка бэкапов и автоматических скриптов обслуживания.
Сравнение методов аутентификации в MySQL 8.0
| Плагин аутентификации | Безопасность | Совместимость с клиентами |
|---|---|---|
caching_sha2_password | Высокая (SHA-256 + кэширование хешей). | MySQL 8.0+, PHP 7.4+, современные драйверы. |
mysql_native_password | Средняя (двойной SHA-1). | Абсолютная совместимость со всеми легаси-клиентами. |
auth_socket | Высокая (доступ только локальному пользователю ОС). | Локальные системные скрипты Linux / root. |
Регламент сброса пароля и восстановления доступа
Сценарий 1: Коррекция хоста подключения и плагина аутентификации
Подключитесь к СУБД с правами администратора (локально через root):
# 1. Локальный вход под root:
sudo mysql
-- 2. Просмотр существующих пользователей, их хостов и плагинов:
SELECT user, host, plugin FROM mysql.user WHERE user = 'my_user';
-- 3. Создание пользователя для подключения с любого хоста (%) с совместимым плагином:
CREATE USER IF NOT EXISTS 'my_user'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongSecretPass123!';
-- Или смена пароля и плагина для существующего пользователя:
ALTER USER 'my_user'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongSecretPass123!';
-- 4. Выдача необходимых прав на базу данных:
GRANT ALL PRIVILEGES ON my_database.* TO 'my_user'@'%';
FLUSH PRIVILEGES;Сценарий 2: Экстренный сброс пароля root через --skip-grant-tables
Если доступ к учетной записи администратора полностью утерян:
# 1. Остановите службу MySQL:
sudo systemctl stop mysql
# 2. Запустите MySQL в безопасном режиме без проверки прав:
sudo mysqld_safe --skip-grant-tables --skip-networking &
# 3. Подключитесь без пароля:
mysql -u root
-- 4. Сбросьте кэш привилегий и установите новый пароль root:
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NewRootPassword123!';
FLUSH PRIVILEGES;
EXIT;
# 5. Завершите аварийный процесс mysqld_safe и запустите службу в штатном режиме:
sudo killall mysqld
sudo systemctl start mysqlСценарий 3: Проверка прав при использовании auth_socket (Ubuntu/Debian)
-- Перевод root с auth_socket на классический пароль (при необходимости):
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MyPassword123!';
FLUSH PRIVILEGES;Типовые ошибки администраторов
- Попытка подключиться под 'user'@'localhost' через 127.0.0.1: В MySQL
localhostозначает подключение через Unix-сокет, а127.0.0.1— сетевое TCP-соединение. Учетная записьuser@localhostне сможет войти по TCP на127.0.0.1. - Забытый FLUSH PRIVILEGES: После ручной модификации системных таблиц через
UPDATE mysql.userизменения не применятся до выполненияFLUSH PRIVILEGES(при использовании командALTER USER / GRANTсброс выполняется автоматически).
Специалисты ITSTM безопасно восстановят права доступа, настроят RBAC-роли и приведут политики аутентификации в соответствие с требованиями безопасности.
Частые вопросы (FAQ)
В чем разница между (using password: YES) и (using password: NO)?
YES означает, что клиент отправил пароль, но сервер отклонил его из-за несовпадения. NO означает, что клиент попытался войти вообще без передачи пароля.
Почему пользователь appuser@'%' не может войти локально?
Если в базе одновременно существует анонимный пользователь ''@'localhost' или явный 'appuser'@'localhost', MySQL отдает приоритет более специфичному хосту (localhost), а не маске %.
Как разрешить подключение пользователя только с определенной подсети?
Укажите маску подсети при создании пользователя: CREATE USER 'appuser'@'192.168.10.%' IDENTIFIED BY 'password';.
Почему PHP 7.2 выдает The server requested authentication method unknown to the client?
Старая версия PHP не поддерживает плагин caching_sha2_password. Переключите пользователя на mysql_native_password.