До основного вмісту

Управління користувачами та правами доступу в MySQL/MariaDB

MySQL / MariaDB · 19.04.2026 · 4 хв читання
Ілюстрація до статті «Управління користувачами та правами доступу в MySQL/MariaDB»

Створення користувача MySQL

-- Створити користувача для підключення лише з localhost
CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'StrongPassword123!';

-- Для підключення з будь-якої IP-адреси
CREATE USER 'myuser'@'%' IDENTIFIED BY 'StrongPassword123!';

-- Для конкретної IP-адреси
CREATE USER 'myuser'@'192.168.1.100' IDENTIFIED BY 'StrongPassword123!';

Видача привілеїв (GRANT)

-- Усі права на одну базу даних
GRANT ALL PRIVILEGES ON mydb.* TO 'myuser'@'localhost';

-- Лише читання
GRANT SELECT ON mydb.* TO 'readonly_user'@'localhost';

-- Читання + запис
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app_user'@'localhost';

-- На конкретну таблицю
GRANT SELECT, INSERT ON mydb.orders TO 'reports_user'@'localhost';

-- Суперкористувач (усі права на всі БД)
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;

-- Застосувати зміни
FLUSH PRIVILEGES;

Перегляд привілеїв

-- Привілеї конкретного користувача
SHOW GRANTS FOR 'myuser'@'localhost';

-- Перелік усіх користувачів
SELECT User, Host FROM mysql.user;

-- Поточний користувач
SHOW GRANTS;

Відкликання привілеїв (REVOKE)

-- Відкликати конкретні права
REVOKE INSERT, UPDATE, DELETE ON mydb.* FROM 'myuser'@'localhost';

-- Відкликати всі права
REVOKE ALL PRIVILEGES ON mydb.* FROM 'myuser'@'localhost';
FLUSH PRIVILEGES;

Зміна пароля користувача

-- MySQL 5.7 / MariaDB
SET PASSWORD FOR 'myuser'@'localhost' = PASSWORD('NewPassword456!');

-- MySQL 8.0+
ALTER USER 'myuser'@'localhost' IDENTIFIED BY 'NewPassword456!';
FLUSH PRIVILEGES;

Видалення користувача

DROP USER 'myuser'@'localhost';
FLUSH PRIVILEGES;

Створення користувача для вебзастосунку

-- Створити БД і користувача для нового сайту
CREATE DATABASE myapp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'SecurePass789!';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER,
    CREATE TEMPORARY TABLES, LOCK TABLES ON myapp_db.* TO 'myapp_user'@'localhost';
FLUSH PRIVILEGES;
Принцип мінімальних привілеїв: давайте користувачам лише ті права, які їм справді потрібні. Для вебзастосунків: SELECT, INSERT, UPDATE, DELETE. Без CREATE, DROP, ALTER — якщо застосунку це не потрібно.

Типові помилки прав доступу

ПомилкаПричинаРішення
ERROR 1045 (28000): Access denied for user 'app'@'10.0.0.5'Користувача створено для 'app'@'localhost', а підключення йде з іншого хоста чи IPСтворити окремий запис користувача під потрібний хост або використати 'app'@'%' з обмеженням мережі через firewall
ERROR 1142 (42000): SELECT command denied to userКористувачу не видано привілей SELECT на конкретну таблицю чи базуПеревірити SHOW GRANTS FOR 'user'@'host'; і видати відсутнє право
ERROR 1396 (HY000): Operation CREATE USER failedКористувач з таким іменем і хостом уже існуєВикористати CREATE USER IF NOT EXISTS або спочатку DROP USER

Host-маска '%' — типова помилка конфігурації

Привілей для 'user'@'%' дозволяє підключення з будь-якої IP-адреси, якщо сервер MySQL слухає зовнішні підключення (bind-address не обмежений на 127.0.0.1). Для користувача веб-застосунку, який завжди працює на тому самому сервері, що й база даних, єдино правильний варіант — 'user'@'localhost', а не '%': це не дає підключитися до бази навіть при компрометації пароля із зовнішньої IP, якщо порт 3306 випадково опиниться відкритим назовні. Перевірка, що порт закритий зовні, не замінює правильне налаштування host-маски користувача — це два незалежні рівні захисту.

Коли GRANT ALL — це не рішення, а проблема

GRANT ALL PRIVILEGES ON *.* WITH GRANT OPTION має сенс тільки для адміністративного облікового запису, яким користується людина, а не для сервісного користувача застосунку. Застосунку, який просто читає і пише дані, не потрібні права DROP, SHUTDOWN, CREATE USER — при SQL-ін'єкції чи витоку пароля з .env зловмисник отримає рівно той набір прав, що виданий користувачу. Мінімальний набір для типового веб-застосунку — SELECT, INSERT, UPDATE, DELETE, плюс CREATE TEMPORARY TABLES і LOCK TABLES, якщо це використовує ORM.

Перевірка фактичних прав після налаштування

# Повний список прав користувача, як їх бачить сервер
mysql -u root -p -e "SHOW GRANTS FOR 'app_user'@'localhost';"

# Перевірити, що користувач реально не бачить інші бази
mysql -u app_user -p -e "SHOW DATABASES;"

# Знайти користувачів із небезпечно широкими правами
mysql -u root -p -e "
SELECT User, Host, Super_priv, Grant_priv, Shutdown_priv
FROM mysql.user
WHERE Super_priv = 'Y' OR Grant_priv = 'Y';"

Останній запит варто ганяти періодично як аудит: якщо у списку опинився сервісний користувач застосунку, а не лише адміністративний обліковий запис, це привід переглянути його права за принципом мінімальних привілеїв. Відновлення доступу при втраті пароля описано у статті про скидання пароля root.

Чи була стаття корисною?
← Назад до бази знань Поставити питання підтримці