Как создать нового пользователя в MySQL и выдать ему права

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';

Это предотвратит оставшиеся права.

Комментарии (0)

Войдите, чтобы оставить комментарий

Похожие статьи

Как создать AI-агента на Python с OpenAI для автоматического парсинга счетов

Подробный гайд, как разработать полноценного AI-агента на Python и OpenAI API, который автоматически парсит счета (PDF, фото), вытягивает данные в структурированный JSON, валидирует их и сохраняет в CSV или базу. Плюс интеграция с Telegram-ботом для загрузки документов.

45 0 3 мин

Как загружать большие файлы в Laravel

Подробный практический гайд по загрузке больших файлов в Laravel с использованием разбиения на части и функцией возобновления. Объясняется, как организовать сервер и клиент для надёжной загрузки больших файлов.

37 0 2 мин