Лучшие практики безопасности MySQL

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

Введение

В этой лабораторной работе вы научитесь повышать безопасность вашей базы данных MySQL. Мы рассмотрим основные рекомендации по безопасности, включая установку пароля для пользователя root, создание выделенных пользователей в соответствии с принципом наименьших привилегий, управление разрешениями пользователей и удаление анонимных учетных записей. К концу этой лабораторной работы вы лучше поймете, как защитить ваш сервер MySQL от распространенных уязвимостей.

Защита учетной записи root

При стандартной установке MySQL пользователь root часто может подключаться с локальной машины без пароля. Ваш первый шаг в обеспечении безопасности MySQL — это установка надежного пароля для учетной записи root.

Сначала откройте терминал на вашем рабочем столе.

Подключитесь к серверу MySQL от имени пользователя root. В этой лабораторной среде вы можете использовать sudo для подключения без пароля.

sudo mysql -u root

После подключения вы увидите приглашение MySQL (mysql>).

Теперь установите пароль для пользователя root. Инструкция ALTER USER используется для изменения учетных записей пользователей. Замените YourStrongPassword! на выбранный вами пароль.

ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPassword!';

Эта команда устанавливает пароль для пользователя root при подключении с localhost. Вы должны увидеть следующий вывод, подтверждающий успешное выполнение команды:

Query OK, 0 rows affected (0.01 sec)

Далее немедленно примените изменения привилегий с помощью команды FLUSH PRIVILEGES.

FLUSH PRIVILEGES;

Вывод будет следующим:

Query OK, 0 rows affected (0.00 sec)

Теперь вы успешно установили пароль для пользователя root. Хотя вы по-прежнему можете использовать sudo mysql -u root для подключения, любая прямая попытка подключения с помощью mysql -u root -p теперь потребует введенный вами пароль. Это критически важный первый шаг в обеспечении безопасности вашей базы данных.

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

Использование учетной записи root для приложений представляет собой риск безопасности, поскольку она обладает неограниченными правами. Рекомендуется создавать выделенных пользователей с ограниченными привилегиями для каждого приложения. На этом шаге вы создадите новую базу данных и пользователя с доступом только к этой базе данных.

Теперь создайте новую базу данных для вашего приложения. Назовем ее app_db.

CREATE DATABASE app_db;

Вы должны увидеть следующее подтверждение:

Query OK, 1 row affected (0.01 sec)

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

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

Вывод будет следующим:

Query OK, 0 rows affected (0.01 sec)

Теперь предоставьте необходимые привилегии пользователю app_user. В этом примере мы предоставим разрешения SELECT и INSERT для всех таблиц в базе данных app_db. Это соответствует принципу наименьших привилегий, предоставляя пользователю только необходимые ему разрешения.

GRANT SELECT, INSERT ON app_db.* TO 'app_user'@'localhost';

Примените изменения, выполнив команду FLUSH PRIVILEGES.

FLUSH PRIVILEGES;

Вы можете проверить только что предоставленные привилегии, выполнив:

SHOW GRANTS FOR 'app_user'@'localhost';

Вывод покажет точные разрешения для app_user:

+------------------------------------------------------------------+
| Grants for app_user@localhost                                    |
+------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `app_user`@`localhost`                     |
| GRANT SELECT, INSERT ON `app_db`.* TO `app_user`@`localhost`     |
+------------------------------------------------------------------+
2 rows in set (0.00 sec)

Вы успешно создали выделенную базу данных и пользователя с соответствующими разрешениями.

Управление привилегиями пользователя

Требования к приложениям могут меняться, и вам может потребоваться соответствующим образом скорректировать разрешения пользователей. На этом шаге вы попрактикуетесь в изменении привилегий, отозвав существующее разрешение у пользователя app_user.

Предположим, что теперь app_user должен иметь возможность только читать данные (SELECT), но не добавлять новые данные (INSERT). Вам необходимо отозвать привилегию INSERT.

Используйте инструкцию REVOKE для удаления привилегии INSERT у пользователя app_user в базе данных app_db.

REVOKE INSERT ON app_db.* FROM 'app_user'@'localhost';

Вы увидите следующее подтверждение:

Query OK, 0 rows affected (0.00 sec)

Примените изменения, выполнив команду FLUSH PRIVILEGES.

FLUSH PRIVILEGES;

Теперь проверьте, было ли отозвано разрешение, снова проверив предоставленные пользователю права.

SHOW GRANTS FOR 'app_user'@'localhost';

Вывод теперь должен показать, что app_user имеет только привилегию SELECT для app_db. Привилегия INSERT отсутствует.

+--------------------------------------------------------------+
| Grants for app_user@localhost                                |
+--------------------------------------------------------------+
| GRANT USAGE ON *.* TO `app_user`@`localhost`                 |
| GRANT SELECT ON `app_db`.* TO `app_user`@`localhost`         |
+--------------------------------------------------------------+
2 rows in set (0.00 sec)

Это демонстрирует, как эффективно управлять разрешениями пользователей для адаптации к меняющимся требованиям безопасности.

Удаление анонимных учетных записей пользователей

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

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

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

Если анонимные пользователи существуют, этот запрос перечислит их. Свежая установка на Ubuntu может включать одного, но более новые версии MySQL/MariaDB часто не имеют анонимных пользователей по умолчанию.

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

+------+-----------+
| User | Host      |
+------+-----------+
|      | localhost |
+------+-----------+
1 row in set (0.00 sec)

Тогда вам следует удалить анонимного пользователя с помощью инструкции DROP USER, указав как имя пользователя (пустая строка ''), так и хост:

DROP USER ''@'localhost';

Вы должны увидеть следующее подтверждение:

Query OK, 0 rows affected (0.01 sec)

Однако, если ваш запрос возвращает пустой набор, как показано ниже:

Empty set (0.00 sec)

Это означает, что в вашей базе данных нет анонимных пользователей, что уже безопасно. В этом случае, если вы попытаетесь удалить несуществующего анонимного пользователя, вы получите ошибку:

ERROR 1396 (HY000): Operation DROP USER failed for ''@'localhost'

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

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

FLUSH PRIVILEGES;

Снова проверьте, что анонимные пользователи больше не существуют, выполнив запрос SELECT:

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

Этот запрос должен вернуть пустой набор, подтверждая отсутствие анонимных пользователей:

Empty set (0.00 sec)

Вы успешно проверили и устранили потенциальную уязвимость безопасности вашего сервера. Теперь вы можете выйти из оболочки MySQL.

exit;

Резюме

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

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