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

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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

Первый шаг включает в себя доступ к оболочке MySQL от имени пользователя root с помощью команды sudo mysql -u root, а затем использование оператора ALTER USER для обновления пароля пользователя root на надежный, уникальный пароль. После обновления пароля мы обновим привилегии с помощью команды FLUSH PRIVILEGES;, чтобы изменения вступили в силу немедленно. Наконец, мы выйдем из оболочки MySQL и проверим новый пароль.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL mysql(("MySQL")) -.-> mysql/BasicKeywordsandStatementsGroup(["Basic Keywords and Statements"]) mysql(("MySQL")) -.-> mysql/DatabaseFunctionsandDataTypesGroup(["Database Functions and Data Types"]) mysql(("MySQL")) -.-> mysql/TransactionManagementandSecurityGroup(["Transaction Management and Security"]) mysql(("MySQL")) -.-> mysql/SystemManagementToolsGroup(["System Management Tools"]) mysql/BasicKeywordsandStatementsGroup -.-> mysql/alter_table("Table Modification") mysql/BasicKeywordsandStatementsGroup -.-> mysql/select("Data Retrieval") mysql/BasicKeywordsandStatementsGroup -.-> mysql/delete("Data Deletion") mysql/DatabaseFunctionsandDataTypesGroup -.-> mysql/user("User Info Function") mysql/TransactionManagementandSecurityGroup -.-> mysql/identified_by("User Authentication") mysql/TransactionManagementandSecurityGroup -.-> mysql/grant_permission("Permission Granting") mysql/TransactionManagementandSecurityGroup -.-> mysql/revoke_permission("Permission Revocation") mysql/SystemManagementToolsGroup -.-> mysql/show_status("Status Overview") subgraph Lab Skills mysql/alter_table -.-> lab-550914{{"Лучшие практики безопасности MySQL"}} mysql/select -.-> lab-550914{{"Лучшие практики безопасности MySQL"}} mysql/delete -.-> lab-550914{{"Лучшие практики безопасности MySQL"}} mysql/user -.-> lab-550914{{"Лучшие практики безопасности MySQL"}} mysql/identified_by -.-> lab-550914{{"Лучшие практики безопасности MySQL"}} mysql/grant_permission -.-> lab-550914{{"Лучшие практики безопасности MySQL"}} mysql/revoke_permission -.-> lab-550914{{"Лучшие практики безопасности MySQL"}} mysql/show_status -.-> lab-550914{{"Лучшие практики безопасности MySQL"}} end

Изменение пароля пользователя root

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

Сначала давайте зайдем в оболочку MySQL от имени пользователя root. Поскольку мы работаем в виртуальной машине LabEx, мы будем использовать команду sudo для выполнения команд от имени пользователя root.

Откройте терминал в виртуальной машине LabEx. Каталог по умолчанию - ~/project.

Чтобы зайти в оболочку MySQL от имени пользователя root, выполните следующую команду:

sudo mysql -u root

Вам может потребоваться ввести пароль пользователя labex. Поскольку у пользователя labex есть привилегии sudo без пароля, просто нажмите Enter.

Теперь вы находитесь в оболочке MySQL. Вы увидите приглашение, похожее на mysql>.

Далее мы изменим пароль пользователя root. В MySQL 8.0 и более поздних версиях используется другой плагин аутентификации (caching_sha2_password), чем в более старых версиях (mysql_native_password). Мы будем использовать оператор ALTER USER для обновления пароля и обеспечения совместимости.

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

ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'your_new_password';

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

После выполнения команды вы должны увидеть следующий вывод:

Query OK, 0 rows affected (0.00 sec)

Теперь давайте обновим привилегии, чтобы изменения вступили в силу немедленно:

FLUSH PRIVILEGES;

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

Query OK, 0 rows affected (0.00 sec)

Наконец, выйдите из оболочки MySQL, введя:

exit

Вы вернетесь к обычному приглашению терминала.

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

mysql -u root -p

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

Включение SSL для безопасных соединений

На этом шаге мы будем включать SSL (Secure Sockets Layer) для безопасных соединений с вашим сервером MySQL. SSL шифрует данные, передаваемые между клиентом и сервером, защищая их от прослушивания и подмены.

Сначала нам нужно сгенерировать SSL-сертификаты и ключи. Для этого мы будем использовать командную строку openssl.

Откройте терминал в виртуальной машине LabEx. Каталог по умолчанию - ~/project.

Мы создадим каталог для хранения SSL-сертификатов и ключей. Выполните следующую команду:

mkdir ssl
cd ssl

Теперь давайте сгенерируем серверный ключ:

sudo openssl genrsa 2048 > server-key.pem

Далее сгенерируем запрос на подпись сертификата (CSR):

sudo openssl req -new -key server-key.pem -out server-req.pem

Вам будет предложено ввести информацию, такую как название страны, штат, город, название организации и т.д. Вы можете ввести соответствующие значения или оставить их пустыми. Для "Common Name" введите localhost или имя хоста/IP-адрес сервера.

Теперь подпишем запрос на сертификат, чтобы создать SSL-сертификат:

sudo openssl x509 -days 365 -in server-req.pem -signkey server-key.pem -out server-cert.pem

Эта команда создает самоподписанный сертификат, действительный в течение 365 дней.

Далее сгенерируем клиентский ключ:

sudo openssl genrsa 2048 > client-key.pem

Сгенерируем запрос на подпись клиентского сертификата (CSR):

sudo openssl req -new -key client-key.pem -out client-req.pem

Вам будет предложено ввести информацию, аналогичную запросу на подпись сертификата сервера.

Теперь подпишем запрос на клиентский сертификат:

sudo openssl x509 -days 365 -in client-req.pem -signkey client-key.pem -out client-cert.pem

Наконец, сгенерируем ключ и сертификат центра сертификации (CA):

sudo openssl genrsa 2048 > ca-key.pem
sudo openssl req -new -x509 -days 365 -key ca-key.pem -out ca-cert.pem

Теперь у нас есть следующие файлы в каталоге ~/project/ssl:

  • server-key.pem
  • server-cert.pem
  • client-key.pem
  • client-cert.pem
  • ca-key.pem
  • ca-cert.pem

Далее нам нужно настроить MySQL для использования этих SSL-сертификатов.

Отредактируйте файл конфигурации MySQL. Его расположение может отличаться в зависимости от вашей установки MySQL, но обычно он находится по адресу /etc/mysql/my.cnf или /etc/my.cnf. Поскольку мы находимся в контейнере Docker, мы создадим файл my.cnf в ~/project и смонтируем его в контейнер.

Создайте файл с именем my.cnf в каталоге ~/project:

cd ~/project
nano my.cnf

Добавьте следующие строки в файл my.cnf:

[mysqld]
ssl-cert=/var/lib/mysql/ssl/server-cert.pem
ssl-key=/var/lib/mysql/ssl/server-key.pem
ssl-ca=/var/lib/mysql/ssl/ca-cert.pem
require_secure_transport=ON

Важно: Пути в файле my.cnf относятся к контейнеру MySQL. Мы должны скопировать сертификаты в правильное место внутри контейнера. Поскольку мы не можем напрямую получить доступ к файловой системе контейнера, мы пропустим этот шаг в рамках этого лабораторного занятия. Параметр require_secure_transport=ON заставляет все соединения использовать SSL.

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

Наконец, давайте подключимся к серверу MySQL с использованием SSL.

mysql --ssl-ca=~/project/ssl/ca-cert.pem --ssl-cert=~/project/ssl/client-cert.pem --ssl-key=~/project/ssl/client-key.pem -u root -p

Введите пароль пользователя root при запросе.

Чтобы проверить, что соединение использует SSL, выполните следующую SQL-команду:

SHOW STATUS LIKE 'Ssl_cipher';

Если в столбце Value отображается шифр, значит, соединение использует SSL.

+---------------+-----------------------+
| Variable_name | Value                 |
+---------------+-----------------------+
| Ssl_cipher    | TLS_AES_256_GCM_SHA384 |
+---------------+-----------------------+
1 row in set (0.00 sec)

Если столбец Value пуст, значит, соединение не использует SSL.

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Ssl_cipher    |       |
+---------------+-------+
1 row in set (0.00 sec)

Отзыв избыточных привилегий у пользователя

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

Сначала давайте зайдем в оболочку MySQL от имени пользователя root.

Откройте терминал в виртуальной машине LabEx. Каталог по умолчанию - ~/project.

Чтобы зайти в оболочку MySQL от имени пользователя root, выполните следующую команду:

sudo mysql -u root

Вам может потребоваться ввести пароль пользователя labex. Поскольку у пользователя labex есть привилегии sudo без пароля, просто нажмите Enter.

Теперь вы находитесь в оболочке MySQL. Вы увидите приглашение, похожее на mysql>.

Давайте создадим нового пользователя с именем testuser и паролем testpassword.

CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'testpassword';

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

Query OK, 0 rows affected (0.00 sec)

Теперь давайте предоставим пользователю testuser некоторые привилегии. Например, давайте предоставим ему привилегии SELECT, INSERT, UPDATE на базе данных с именем testdb. Если база данных не существует, мы создадим ее сначала.

CREATE DATABASE IF NOT EXISTS testdb;
GRANT SELECT, INSERT, UPDATE ON testdb.* TO 'testuser'@'localhost';

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

Query OK, 0 rows affected (0.00 sec)

Теперь предположим, что мы хотим отозвать у пользователя testuser привилегию UPDATE. Мы можем использовать оператор REVOKE.

REVOKE UPDATE ON testdb.* FROM 'testuser'@'localhost';

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

Query OK, 0 rows affected (0.00 sec)

Теперь давайте обновим привилегии, чтобы изменения вступили в силу немедленно:

FLUSH PRIVILEGES;

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

Query OK, 0 rows affected (0.00 sec)

Чтобы проверить привилегии пользователя testuser, вы можете использовать оператор SHOW GRANTS:

SHOW GRANTS FOR 'testuser'@'localhost';

В выводе будут показаны привилегии, предоставленные пользователю testuser. Вы должны увидеть привилегии SELECT и INSERT, но не UPDATE.

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

Наконец, выйдите из оболочки MySQL, введя:

exit

Вы вернетесь к обычному приглашению терминала.

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

На этом шаге мы удалим анонимные пользовательские учетные записи с вашего сервера MySQL. Анонимные пользовательские учетные записи - это учетные записи с именем пользователя '' (пустая строка), которые могут потенциально разрешить несанкционированный доступ к вашей базе данных. Удаление этих учетных записей - хорошая практика безопасности.

Сначала давайте зайдем в оболочку MySQL от имени пользователя root.

Откройте терминал в виртуальной машине LabEx. Каталог по умолчанию - ~/project.

Чтобы зайти в оболочку MySQL от имени пользователя root, выполните следующую команду:

sudo mysql -u root

Вам может потребоваться ввести пароль пользователя labex. Поскольку у пользователя labex есть привилегии sudo без пароля, просто нажмите Enter.

Теперь вы находитесь в оболочке MySQL. Вы увидите приглашение, похожее на mysql>.

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

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

Этот запрос покажет всех пользователей с пустым именем пользователя. Столбец Host указывает хост, с которого пользователь может подключаться. Вы, возможно, увидите записи, такие как ''@'localhost' или ''@'%'.

Для удаления анонимной пользовательской учетной записи используйте оператор DROP USER. Например, чтобы удалить анонимную пользовательскую учетную запись, которая может подключаться с localhost, выполните следующую команду:

DROP USER ''@'localhost';

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

Query OK, 0 rows affected (0.00 sec)

Если есть другие анонимные пользовательские учетные записи (например, ''@'%'), удалите их также:

DROP USER ''@'%';

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

Query OK, 0 rows affected (0.00 sec)

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

FLUSH PRIVILEGES;

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

Query OK, 0 rows affected (0.00 sec)

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

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

На этот раз запрос должен вернуть пустой набор результатов.

Наконец, выйдите из оболочки MySQL, введя:

exit

Вы вернетесь к обычному приглашению терминала.

Резюме

В этом практическом занятии первоначальный этап был посвящен улучшению безопасности MySQL путем изменения пароля пользователя root. Это включало в себя доступ к оболочке MySQL от имени пользователя root с помощью команды sudo mysql -u root.

Суть этого этапа заключалась в выполнении оператора ALTER USER для обновления пароля пользователя root, чтобы обеспечить совместимость с плагином аутентификации caching_sha2_password, используемым в MySQL 8.0 и более поздних версиях. Затем команда FLUSH PRIVILEGES была использована для немедленного применения изменений, после чего был выполнен выход из оболочки MySQL.