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

MySQLBeginner
Практиковаться сейчас

Введение

В профессиональном системном администрировании использование пользователя root для обычных подключений приложений представляет серьёзную угрозу безопасности. Если злоумышленник получит контроль над приложением, использующим учётную запись root, он получит полный доступ ко всем базам данных на сервере.

Согласно лучшей практике, у каждого приложения должен быть собственный выделенный пользователь, а его разрешения должны быть ограничены только собственной выделенной базой данных.

В базах данных это соответствует разделению идентификаторов приложений на уровне операционной системы. Контроль доступа должен отражать назначение учётной записи, а не только удобство её использования.

Это вариант принципа минимальных привилегий, с которым вы уже познакомились при управлении пользователями Linux. Если учётная запись одного приложения будет скомпрометирована, ограниченные привилегии уменьшат возможный масштаб ущерба.

В этой лабораторной работе вы защитите окружение с помощью стандартной последовательности действий:

  1. Создадите новую базу данных для условного приложения.
  2. Создадите отдельную учётную запись для этого приложения.
  3. Предоставите пользователю разрешения только для его базы данных.
  4. Проверите настройку, войдя в систему от имени нового пользователя.

Создание новой базы данных

Сначала войдите на сервер MySQL с административными привилегиями, чтобы создать новую базу данных.

Откройте терминал и выполните следующую команду для входа в командную оболочку MySQL:

sudo mysql

Примечание: команда sudo выполняет аутентификацию от имени root через системный сокет. Если система запросит пароль, которого вы не знаете, попробуйте выполнить mysql -u root -p.

Когда вы увидите приглашение mysql>, можно выполнять команды SQL.

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

Создайте базу данных с именем app_db. Она будет хранилищем данных нашего приложения.

CREATE DATABASE app_db;

Если команда выполнена успешно, MySQL ответит Query OK. Проверить наличие базы данных можно, выведя список всех баз данных:

SHOW DATABASES;

В списке должна появиться app_db.

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

Теперь, когда база данных создана, нужно создать пользователя для работы с ней. Мы создадим пользователя с именем app_user.

В той же командной оболочке MySQL выполните следующую команду:

CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'password';

Разбор команды:

  • 'app_user': имя пользователя.
  • '@'localhost': ограничивает подключения пользователя этим сервером (это мера безопасности).
  • IDENTIFIED BY 'password': устанавливает пароль "password".

На этом этапе пользователь уже существует, но у него нет разрешений. Он может войти в систему, но не может читать или записывать данные.

Важно понимать эту модель безопасности: идентификация пользователя и его привилегии — разные понятия. Создание учётной записи не даёт автоматического доступа ко всем объектам базы данных.

Проверить наличие пользователя можно, просмотрев системную таблицу пользователей:

SELECT User, Host FROM mysql.user WHERE User = 'app_user';

Предоставление разрешений

Теперь нужно явно предоставить app_user разрешение использовать app_db.

Мы предоставим пользователю ALL разрешения для базы данных app_db — на чтение, запись и изменение таблиц.

Выполните эту команду в командной оболочке MySQL:

GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'localhost';

Разбор синтаксиса:

  • GRANT ALL PRIVILEGES: предоставляет полный доступ.
  • ON app_db.*: применяет эти разрешения к базе данных app_db и к * (всем таблицам внутри неё).
  • TO 'app_user'@'localhost': указывает, кому предоставляются эти разрешения.

Шаблон database.* важен, поскольку область действия привилегий можно ограничивать. В MySQL/MariaDB разрешения можно предоставлять глобально, для отдельной базы данных, для отдельной таблицы, а иногда и на ещё более узком уровне.

Это позволяет app_user иметь широкие возможности внутри app_db, но не иметь доступа к остальным объектам.

Чтобы убедиться, что разрешения назначены правильно, выполните:

SHOW GRANTS FOR 'app_user'@'localhost';

Проверка доступа пользователя

Чтобы убедиться, что всё работает правильно, выйдите из учётной записи root и попробуйте войти как новый пользователь.

Сначала завершите сеанс root:

EXIT;

Теперь в терминале Linux войдите как app_user:

mysql -u app_user -p

Когда появится запрос, введите пароль password.

После входа проверьте, какие базы данных вам доступны:

SHOW DATABASES;

Что проверить:

  • Вы должны увидеть app_db и information_schema.
  • Вы не должны увидеть mysql или sys.

Это подтверждает, что настройки разрешений работают правильно: пользователь видит только те объекты, к которым ему разрешён доступ.

Проверка — важная часть настройки контроля доступа. Недостаточно выполнить оператор GRANT: нужно убедиться, что получившееся представление системы соответствует запланированной модели минимальных привилегий.

Переключитесь на свою базу данных, чтобы завершить лабораторную работу:

USE app_db;
EXIT;

Итоги

В этой лабораторной работе вы успешно реализовали безопасную модель доступа к базе данных. Вы научились:

  • Создавать новую базу данных (app_db).
  • Создавать выделенного пользователя (app_user).
  • Предоставлять точные привилегии с помощью команды GRANT.
  • Проверять, что контроль доступа работает согласно заданным правилам.

Модель «минимальных привилегий» — один из основополагающих принципов безопасности баз данных. Её следует использовать для каждого развёртываемого приложения.