Создание базы данных и пользователя

Создаём базу под проект, заводим для приложения отдельного пользователя и выдаём ему ровно нужные права.

Пользователь MySQL — учётная запись с паролем и набором привилегий, определяющих, что ему разрешено делать и над какими базами.

Создаём базу данных

База создаётся одной командой. Полезно сразу задать кодировку utf8mb4 — это полноценный Unicode, включая эмодзи (старый utf8 в MySQL урезанный).

CREATE DATABASE shop
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

Параметры кодировки — MySQL-специфика, поэтому блок помечен как текст. Сам по себе CREATE DATABASE существует и в стандарте, но SQLite-песочница работает с одной встроенной базой, так что эту команду мы только читаем.

Заводим пользователя приложения

Заходить в продакшен под root — плохая идея. Для приложения создают отдельного пользователя с минимально необходимыми правами. Часть 'app_user'@'localhost' означает «пользователь app_user, подключающийся с локальной машины».

CREATE USER 'app_user'@'localhost'
  IDENTIFIED BY 'надёжный_пароль';

Выдаём права командой GRANT

GRANT назначает привилегии. Можно выдать всё на конкретную базу, а можно — только нужные операции (принцип минимальных привилегий).

-- все права, но только на базу shop
GRANT ALL PRIVILEGES ON shop.* TO 'app_user'@'localhost';

-- или аккуратнее: только чтение и запись данных
GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO 'app_user'@'localhost';

-- применить изменения
FLUSH PRIVILEGES;

Запись shop.* означает «все таблицы базы shop». Можно сузить до конкретной таблицы: shop.orders.

Проверяем и отзываем права

SHOW GRANTS FOR 'app_user'@'localhost';   -- что разрешено
REVOKE DELETE ON shop.* FROM 'app_user'@'localhost';  -- отобрать право
DROP USER 'app_user'@'localhost';         -- удалить пользователя

Принцип минимальных привилегий

Главное правило безопасности: выдавайте ровно столько прав, сколько нужно для работы. Веб-приложению, которое только читает каталог, не нужно право DROP TABLE. Если злоумышленник получит доступ через такого пользователя, ущерб будет ограничен.

ПривилегияЧто разрешает
SELECTчитать данные
INSERT / UPDATE / DELETEдобавлять, менять, удалять строки
CREATE / DROPсоздавать и удалять таблицы и базы
ALL PRIVILEGESвсё перечисленное и больше

Итог

  • Базу создаём через CREATE DATABASE, кодировку лучше брать utf8mb4.
  • Для приложения заводим отдельного пользователя, а не работаем под root.
  • GRANT выдаёт права, REVOKE отзывает, SHOW GRANTS показывает их.
  • Принцип минимальных привилегий снижает риски при взломе.
Проверьте себя
1. Какую кодировку рекомендуется использовать для полноценной поддержки Unicode и эмодзи?
Autf8mb4
Blatin1
Cutf8
Dascii
2. Что означает запись shop.* в команде GRANT ... ON shop.*?
Aвсе базы с именем shop
Bвсе таблицы базы shop
Cтолько таблицу shop
Dвсе столбцы одной таблицы
3. В чём суть принципа минимальных привилегий?
Aвыдавать всем ALL PRIVILEGES для простоты
Bзапрещать любые права кроме SELECT
Cвыдавать только те права, что реально нужны для работы
Dработать всегда под root