MySQL - это свободная система управления реляционными базами данных. Она часто используется в составе LAMP-стека (Linux, Apache, MySQL, PHP) и по состоянию на сейчас является самой популярной свободной базой данных в мире.
Что нужно перед началом
Чтобы следовать этому руководству, нужен доступ к MySQL-серверу. Предполагается, что MySQL уже установлен (например, на Ubuntu), но инструкции применимы и в других окружениях.
Создание нового пользователя
После установки MySQL автоматически создаётся пользователь root с максимальными правами. Эту учётную запись удобно использовать только для административных задач.
Вход в MySQL
На Ubuntu/MySQL по умолчанию root-пользователь настроен через аутентификацию auth_socket, то есть пароль не требуется, если вы выполняете команду от имени системного root-пользователя:
sudo mysqlЕсли root настроен с паролем, используйте:
mysql -u root -pВам будет предложено ввести пароль.
Синтаксис создания пользователя
Чтобы создать нового пользователя, выполните команду:
CREATE USER 'username'@'host' IDENTIFIED WITH authentication_plugin BY 'password';username- имя пользователя, которое вы создаёте.host- хост, с которого разрешено подключение (например,localhostили%).authentication_plugin- плагин аутентификации, который будет использоваться.
Плагины аутентификации в MySQL
caching_sha2_password
Плагин аутентификации по умолчанию в MySQL 8.0. Использует алгоритм SHA-256 и кэширование хэшей для ускорения повторных подключений. Обеспечивает высокий уровень безопасности и поддерживает удалённые соединения. Рекомендуется для всех новых проектов, если клиенты и драйверы поддерживают MySQL 8.
mysql_native_password
Классический плагин аутентификации, использующий SHA-1. Хорошо поддерживается старыми версиями клиентов, библиотек и PHP-приложений. Уровень безопасности ниже, чем у caching_sha2_password, но всё ещё широко используется из-за совместимости.
Часто применяется для старых проектов и инструментов вроде устаревших версий phpMyAdmin.
auth_socket
Плагин для локальной аутентификации через системного пользователя. Позволяет подключаться к MySQL без пароля, если системный пользователь совпадает с MySQL-пользователем. Работает только для локальных соединений и часто используется для root-доступа на Linux-серверах. Подходит для административных задач и серверов без удалённого root-доступа.
sha256_password
Плагин аутентификации на основе SHA-256 без кэширования. Безопаснее mysql_native_password, но медленнее caching_sha2_password. Использовался в MySQL до версии 8.0, сейчас встречается редко. Может применяться в специфических сценариях, где требуется явный SHA-256 без кэша.
mysql_clear_password
Плагин, передающий пароль в открытом виде. Используется только в сочетании с защищённым SSL/TLS-соединением и, как правило, для внешних систем аутентификации (например, LDAP или PAM). Сам по себе небезопасен. В продакшене без TLS применять нельзя.
authentication_ldap_simple
Плагин аутентификации через LDAP. Позволяет подключать MySQL к корпоративным каталогам пользователей. Требует дополнительной настройки LDAP-сервера и используется в корпоративных средах. Доступен в коммерческих версиях MySQL.
authentication_pam
Плагин аутентификации через PAM (Pluggable Authentication Modules). Интегрирует MySQL с системной аутентификацией Linux. Часто используется в закрытых серверных окружениях с централизованным управлением доступом. Также относится к корпоративным решениям.
ed25519
Плагин аутентификации на основе алгоритма Ed25519. Высокая криптостойкость и быстрая работа. Чаще встречается в MariaDB, но может использоваться и в MySQL-совместимых системах. Актуален для проектов с повышенными требованиями к безопасности.
Пример: создать пользователя
Создадим пользователя sammy с паролем (замените на собственные значения):
CREATE USER 'sammy'@'localhost' IDENTIFIED BY 'password';Если нужен плагин mysql_native_password (например, для phpMyAdmin):
CREATE USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';Или можно изменить способ аутентификации позже:
ALTER USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';После создания пользователя можно выдавать ему права.
Выдача прав пользователю
Синтаксис
Команда для выдачи прав выглядит так:
GRANT PRIVILEGE ON database.table TO 'username'@'host';PRIVILEGE- конкретные права (например,SELECT,INSERT,UPDATE).database.table- база данных и таблица. Звёздочки (*.*) означают все базы и таблицы.
Пример
Выдадим пользователю sammy глобальные права на основные действия:
GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;WITH GRANT OPTION позволяет этому пользователю в будущем выдавать права другим.
Важно: не стоит давать пользователю ALL PRIVILEGES без необходимости, это почти как root и снижает безопасность:
GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;Применение изменений
Раньше рекомендовалось выполнять:
FLUSH PRIVILEGES;чтобы перезагрузить таблицы прав. Но если вы используете GRANT или CREATE USER, MySQL сам обновляет права, и отдельный FLUSH не обязателен.
Отзыв прав и удаление пользователя
Чтобы отозвать права:
REVOKE type_of_permission ON database_name.table_name FROM 'username'@'host';Здесь важно использовать FROM, а не TO. Чтобы посмотреть текущие права пользователя:
SHOW GRANTS FOR 'username'@'host';Чтобы удалить пользователя полностью:
DROP USER 'username'@'host';После выполнения пользователь будет удалён навсегда.
Частые ошибки и их исправление
Ошибка "Access denied for user"
Это означает, что логин, пароль или права неверные. Проверьте правильность введённых данных и убедитесь, что пользователю выданы нужные привилегии.
Проблемы с удалённым подключением
Если пользователь не может подключиться удалённо, убедитесь, что host установлен как % или конкретный IP:
GRANT ALL PRIVILEGES ON *.* TO 'username'@'%';Это разрешит подключения с любого хоста.
Ошибка 1396 - пользователь уже существует
Если MySQL сообщает, что такой пользователь уже есть, сначала удалите старую запись:
DROP USER 'newuser'@'%';Затем создайте снова.
Вопросы и ответы
Как создать пользователя с ограниченными правами?
Укажите только нужные привилегии. Например, для пользовательских операций:
GRANT SELECT, INSERT, UPDATE, DELETE ON database_name.* TO 'username'@'localhost';Это даст доступ только к указанным действиям.
Как посмотреть права пользователя?
Команда ниже покажет текущие привилегии:
SHOW GRANTS FOR 'username'@'localhost';Чем отличается GRANT ALL PRIVILEGES от указания конкретных привилегий?ALL PRIVILEGES даёт полный набор прав, что может быть рискованно. Ограничение привилегий снижает возможный ущерб и повышает безопасность.
Как разрешить удалённый доступ?
Используйте % вместо localhost в определении хоста:
GRANT ALL PRIVILEGES ON *.* TO 'username'@'%';Это позволит пользователю подключаться с любого адреса.
Как безопасно удалить пользователя?
Сначала отзовите все его привилегии, затем удалите:
REVOKE ALL PRIVILEGES ON *.* FROM 'username'@'localhost';
DROP USER 'username'@'localhost';Это предотвратит оставшиеся права.