ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

MySQL через TLS в Ubuntu 18.04

MySQL Security - Генерация случайного пароля

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

Exit mobile version