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

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

Пользователь 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 и эмодзи?
Alatin1
Butf8
Cutf8mb4
Dascii
2. Что означает запись shop.* в команде GRANT ... ON shop.*?
Aвсе базы с именем shop
Bвсе таблицы базы shop
Cтолько таблицу shop
Dвсе столбцы одной таблицы
3. В чём суть принципа минимальных привилегий?
Aвыдавать всем ALL PRIVILEGES для простоты
Bвыдавать только те права, что реально нужны для работы
Cзапрещать любые права кроме SELECT
Dработать всегда под root
Поддержать проект