Как создать пользователя MySQL и дать ему права
Войдите в MySQL администратором и выполните три команды: создать базу, создать пользователя, выдать права.
sudo mysqlВ Ubuntu и Debian администратор root входит так, без пароля, — проверка идёт по системному пользователю. В других системах — mysql -u root -p.
CREATE DATABASE shop CHARACTER SET utf8mb4;
CREATE USER 'shop'@'localhost' IDENTIFIED BY 'длинный-сложный-пароль';
GRANT ALL PRIVILEGES ON shop.* TO 'shop'@'localhost';Теперь программа или сайт подключаются пользователем shop и работают только с базой shop. Проверьте вход — войдите пользователем shop (пароль программа спросит) сразу в базу shop:
mysql -u shop -p shopFLUSH PRIVILEGES после CREATE USER и GRANT не нужен: эти команды применяются сразу.
Что значит 'shop'@'localhost'
Пользователь в MySQL — это пара «имя и адрес, с которого он подключается»:
| Запись | Откуда можно войти |
|---|---|
'shop'@'localhost' | только с этого же сервера |
'shop'@'192.168.1.20' | только с одного адреса |
'shop'@'192.168.1.%' | из всей сети 192.168.1.x |
'shop'@'%' | с любого адреса |
'shop'@'localhost' и 'shop'@'%' — разные пользователи, с разными паролями и правами. Для сайта на том же сервере, что и база, нужен localhost.
'%' пускает с любого адреса в интернете, если порт MySQL (3306) открыт наружу. Боты подбирают пароли к открытым базам круглосуточно. Разрешайте вход только из своей сети или с нужного адреса и не открывайте порт 3306 в брандмауэре для всех.
Чтобы подключаться с другого компьютера, мало создать пользователя: сам сервер MySQL в Ubuntu по умолчанию слушает только 127.0.0.1. Это меняет параметр bind-address в его файле настроек, после чего сервер перезапускают.
Какие права выдать
| Задача | Команда |
|---|---|
| Всё в одной базе | GRANT ALL PRIVILEGES ON shop.* TO 'shop'@'localhost'; |
| Только чтение | GRANT SELECT ON shop.* TO 'report'@'localhost'; |
| Чтение и изменение строк | GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO 'app'@'localhost'; |
| Посмотреть права | SHOW GRANTS FOR 'shop'@'localhost'; |
| Забрать право | REVOKE DELETE ON shop.* FROM 'app'@'localhost'; |
Не давайте программам права на все базы (ON *.*) и WITH GRANT OPTION: если пароль утечёт, пострадает только одна база.
Сменить пароль и удалить
ALTER USER 'shop'@'localhost' IDENTIFIED BY 'новый-пароль';
DROP USER 'shop'@'localhost';DROP USER удаляет пользователя и его права, но не базу и не данные.
Частые ошибки
You are not allowed to create a user with GRANT(ошибка 1410). В MySQL 8.0 командаGRANT … IDENTIFIED BY …из старых инструкций больше не создаёт пользователя. СначалаCREATE USER, потомGRANT— как выше.Access denied for user 'shop'@'localhost'— неверный пароль или пользователь создан для другого адреса. Список пользователей:SELECT user, host FROM mysql.user;.- Вход с другого компьютера отклонён — пользователь есть только для
localhost, сервер слушает127.0.0.1или порт закрыт брандмауэром.
А в PostgreSQL
CREATE USER shop WITH PASSWORD 'длинный-сложный-пароль';
CREATE DATABASE shop OWNER shop;Владелец базы получает на неё все права. Войти администратором в Ubuntu — sudo -u postgres psql. В SQLite пользователей нет вовсе: доступ к базе определяется правами на её файл.