Введение
В этой лабораторной работе вы научитесь повышать безопасность вашей базы данных 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 и защитить ее от несанкционированного доступа и потенциальных угроз.



