Традиционно сервер базы данных и интерфейс находились в одной изолированной сети. Это позволяло интерфейсу взаимодействовать с базой данных по незашифрованному каналу, не заботясь о безопасности. Все это изменилось за последние несколько лет с появлением облачных и распределенных систем. Ваши приложения больше не привязаны к одной изолированной сети. Сейчас, более чем когда-либо, связь между интерфейсом и базой данных должна быть зашифрована и защищена. Вы можете добиться этого, используя VPN для виртуализации изолированной сети. Интерфейс и база данных могут быть частью этой VPN, и связь между ними будет защищена. Или вы можете использовать TLS для шифрования данных, отправляемых в базу данных и из нее, почти так же, как веб-сайты защищают свою связь с браузерами с помощью HTTPS.
Установка сервера MySQL
В статье предполагается, что у вас есть сервер, выделенный для использования MySQL с доступным статическим IP-адресом, возможно, в облаке или где-то в вашей локальной сети. Следующие команды в этом подразделе должны выполняться в оболочке сервера. Давайте быстро установим и настроим MySQL на Ubuntu.
$ sudo apt update $ sudo apt install mysql-server $ sudo mysql_secure_installation
Последняя команда запустит сценарий для изменения некоторых небезопасных настроек MySQL по умолчанию. Сначала будет запрос на установку плагина проверки пароля. Это позволит проверить, достаточно ли надежен новый пароль, который вы устанавливаете для пользователей. Вы можете отказаться от этого плагина, если хотите. После этого вам будет предложено установить пароль пользователя root в MySQL. Идите вперед и установите надежный пароль пользователя root.
Press y|Y for Yes, any other key for No: n Please set the password for root here. New password: Re-enter new password:
После этого вы можете в значительной степени сказать «Yes» любому другому запросу в этом сценарии, поскольку сценарий удаляет тестового пользователя, удаляет тестовую базу данных, отключает удаленный вход в систему root и, наконец, перезагружает свою таблицу привилегий. Как только это будет сделано, поскольку мы запретили удаленный вход в систему root, давайте создадим базу данных и нового пользователя, который может получить доступ к этой базе данных удаленно, без необходимости использовать SSH (или вход) в оболочку сервера UNIX/Linux. Но прежде чем мы это сделаем, давайте проверим, имеет ли наша сборка MySQL встроенный TLS или нет.
Проверка доступности TLS
TLS доступен в MySQL, только если MySQL скомпилирован так, чтобы он был встроен в него. Нет динамического модуля для загрузки. Поэтому, если вы не уверены, что в вашем пакете MySQL установлен TLS, вы можете проверить это, запустив:
$ sudo mysql mysql> SHOW VARIABLE LIKE ‘%ssl%’ +---------------+----------+ | Variable_name | Value | +---------------+----------+ | have_openssl | DISABLED | | have_ssl | DISABLED | | ssl_ca | | | ssl_capath | | | ssl_cert | | | ssl_cipher | | | ssl_crl | | | ssl_crlpath | | | ssl_key | | +---------------+----------+ 9 rows in set (0.00 sec)
Если он говорит, что переменная have_openssl и have_ssl имеет значение, установленное как DISABLED то есть SSL и хорошо идти (вам нужно только включить его, читая дальше). Если для значений установлено значение NO, вам необходимо получить другую версию MySQL в диспетчере пакетов или где-либо еще.
mysql> exit
Настройка MySQL
По умолчанию сервер mysql прослушивает только интерфейс обратной связи, то есть адрес localhost или 127.0.0.1, для удаленных подключений мы хотим, чтобы он также прослушивал общедоступный статический IP-адрес. Для этого откройте файл /etc/mysql/my.cnf и добавьте следующие несколько строк в самый конец.
... [mysqld] require_secure_transport = ON bind-address = <StaticIP>
Здесь вы заменяете <StaticIP> фактическим IP-адресом вашего сервера. Если вы сомневаетесь, какой IP использовать, вы можете использовать 0.0.0.0 для прослушивания на всех интерфейсах. Теперь перезапустите сервер, чтобы новая конфигурация вступила в силу.
$ sudo service mysql restart
Создание удаленного пользователя
Примечание. Если вы хотите использовать базу данных в производственной среде, есть вероятность, что клиент, который будет подключаться к этой базе данных – ваш интерфейс – будет иметь статический IP-адрес. В этом случае замените символ процента «%» на соответствующий IP-адрес клиента. «%» – это просто подстановочный знак, означающий «любое значение». Мы настроим myUser так, чтобы он мог входить в систему с любого IP-адреса (например, изменяющегося IP-адреса вашего внутреннего широкополосного соединения), что, возможно, небезопасно.
$sudo mysql mysql> CREATE DATABASE myDatabase; mysql> CREATE USER 'myUser'@'%' IDENTIFIED BY 'password' REQUIRE SSL; mysql> GRANT ALL ON myDatabase.* TO 'myUser'@'%';
Замените «password» на настоящий надежный пароль, и у нас появится пользователь с именем myUser, который имеет полный доступ к базе данных myDatabase.
Включение TLS (также известного как SSL)
Пока вы вошли в оболочку mysql как пользователь root mysql, вы можете проверить статус соединения, набрав \s:
mysql> \s -------------- mysql Ver 14.14 Distrib 5.7.24, for Linux (x86_64) using EditLine wrapper Connection id: 5 Current database: Current user: root@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 5.7.24-0ubuntu0.18.04.1 (Ubuntu) Protocol version: 10 Connection: Localhost via UNIX socket ...
Обратите внимание на выделенные строки о подключении и SSL. Хотя это состояние подходит для локального входа пользователя root, к тому времени, когда мы войдем через TLS в качестве myUser, тип подключения будет через TCP/IP, а не необработанный сокет, и будет использоваться шифр SSL. Для этого есть простая команда. Но сначала давайте выйдем из командной строки mysql.
mysql> exit
Теперь запускаете:
$ sudo mysql_ssl_rsa_setup --uid=mysql $ sudo service mysql restart
Как только это будет сделано, вы можете снова посмотреть на переменную have_ssl .
$ sudo mysql mysql> SHOW VARIABLES LIKE '%ssl%'; +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | have_openssl | YES | | have_ssl | YES | | ssl_ca | ca.pem | | ssl_capath | | | ssl_cert | server-cert.pem | | ssl_cipher | | | ssl_crl | | | ssl_crlpath | | | ssl_key | server-key.pem | +---------------+-----------------+ 9 rows in set (0.01 sec)
Вход в систему из отдельного клиента MySQL
Появились новые параметры, указывающие, что сертификат и ключ TLS установлены и TLS включен. Теперь вы можете выйти из системы, открыть клиент MySQL на своем локальном компьютере, если у вас его нет (и вы используете Debian или Ubuntu), получите клиент оболочки MySQL:
$ sudo apt install mysql-client $ mysql -u myUser -p -h <MySQLServerIP>
Замените myUser и <MySQLServerIP> своим фактическим именем пользователя и IP-адресом сервера, введите выбранный пароль, и вы должны войти в базу данных. Проверьте подключение:
mysql> \s -------------- mysql Ver 14.14 Distrib 5.7.24, for Linux (x86_64) using EditLine wrapper Connection id: 5 Current database: Current user: remote_user@yourlocalIP SSL: Cipher in use is DHE-RSA-AES256-SHA Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 5.7.24-0ubuntu0.18.04.1 (Ubuntu) Protocol version: 10 Connection: <MySQLServerIP> via TCP/IP Server characterset: latin1 Db characterset: latin1 Client characterset: utf8 Conn. characterset: utf8 TCP port: 3306 Uptime: 13 min 52 sec Threads: 2 Questions: 32 Slow queries: 0 Opens: 107 Flush tables: 1 Open tables: 100 Queries per second avg: 0.038 --------------
Вы можете видеть, что теперь он использует RSA для шифрования вашего трафика, и соединение осуществляется с определенным IP через TCP/IP. Теперь ваше соединение с этой базой данных MySQL безопасно.
Заключение
Это самый простой способ защитить удаленные соединения MySQL с помощью TLS. Имейте в виду, что это не то же самое, что защита клиента phpMyAdmin через TLS. Это сочетание TLS и HTTP, которое требует от вас защиты веб-интерфейса. Связь между phpMyAdmin, который отображает ваш веб-интерфейс, и базой данных может быть незашифрованной, и это нормально, если они находятся на одном сервере.