MySQL, phpMyAdmin · 5 min read · Jan 29, 2026

Управление несколькими серверами MySQL из одной установки phpMyAdmin (с использованием SSL-шифрования)

Управление несколькими серверами MySQL из одной установки phpMyAdmin (с использованием SSL-шифрования)

Версия 1.0
Автор: Фалко Тимме
Следите за мной в Twitter

Это руководство объясняет, как вы можете управлять несколькими серверами MySQL из одной установки phpMyAdmin. По соображениям безопасности связь между phpMyAdmin и любым удаленным сервером MySQL осуществляется с использованием SSL-шифрования (это не требуется для локального сервера MySQL, так как связь между phpMyAdmin и MySQL не покидает сервер). phpMyAdmin — это бесплатный инструмент, написанный на PHP, предназначенный для управления MySQL через Всемирную паутину. phpMyAdmin поддерживает широкий спектр операций с MySQL.

Я не даю никаких гарантий, что это будет работать для вас!

1 Предварительная заметка

В этом руководстве я покажу, как управлять двумя серверами MySQL — одним локальным (local.example.com с IP-адресом 192.168.0.100 — это сервер, на котором установлена phpMyAdmin) и одним удаленным сервером (remote.example.com с IP-адресом 192.168.0.101) — из экземпляра phpMyAdmin. Я предполагаю, что phpMyAdmin уже установлен (либо вручную, либо через менеджер пакетов вашей дистрибуции) и работает (т.е. вы уже должны иметь возможность управлять локальным сервером MySQL через phpMyAdmin) — я не буду охватывать установку phpMyAdmin здесь.

Это руководство основано на Debian Wheezy/Ubuntu 12.04. Для других дистрибутивов вам, возможно, придется настроить некоторые пути, но принцип остается тем же.

2 Включение поддержки SSL на удаленном сервере MySQL

remote.example.com:

Войдите в MySQL…

mysql -u root -p

… и выполните следующую команду в оболочке MySQL:

show variables like '%ssl%';

Если вывод выглядит следующим образом (оба have_openssl и have_ssl показывают DISABLED)…

mysql> show variables like ’%ssl%’;
+—————+———-+
| Variable_name | Value    |
+—————+———-+
| have_openssl  | DISABLED |
| have_ssl      | DISABLED |
| ssl_ca        |          |
| ssl_capath    |          |
| ssl_cert      |          |
| ssl_cipher    |          |
| ssl_key       |          |
+—————+———-+
7 rows in set (0.00 sec)

mysql>

… это означает, что MySQL был скомпилирован с поддержкой SSL, но в настоящее время он не включен. Чтобы включить его, сначала выйдите из оболочки MySQL…

quit;

… и откройте /etc/mysql/my.cnf:

vi /etc/mysql/my.cnf

Прокрутите вниз до раздела * Security Features (внутри секции [mysqld]) и добавьте строку со словом ssl:

| | [...] # * Security Features # # Read the manual, too, if you want chroot! # chroot = /var/lib/mysql/ # # For generating SSL certificates I recommend the OpenSSL GUI "tinyca". ssl # ssl-ca=/etc/mysql/cacert.pem # ssl-cert=/etc/mysql/server-cert.pem # ssl-key=/etc/mysql/server-key.pem [...] | |

Перезапустите MySQL…

/etc/init.d/mysql restart

… и снова проверьте, включен ли теперь SSL:

mysql -u root -p
show variables like '%ssl%';

Вывод должен выглядеть следующим образом, что означает, что SSL теперь включен:

mysql> show variables like ’%ssl%’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| have_openssl  | YES   |
| have_ssl      | YES   |
| ssl_ca        |       |
| ssl_capath    |       |
| ssl_cert      |       |
| ssl_cipher    |       |
| ssl_key       |       |
+—————+——-+
7 rows in set (0.00 sec)

mysql>

Введите…

quit;

… чтобы выйти из оболочки MySQL.

Убедитесь, что OpenSSL установлен:

apt-get install openssl

Теперь проверьте вашу версию OpenSSL:

root@remote:~# openssl version
OpenSSL 1.0.1c 10 May 2012
root@remote:~#

Если у вас, как и у меня, версия OpenSSL 1.0.1c, сертификаты, сгенерированные OpenSSL, вызовут ошибки, такие как

Sep 18 17:02:15 remote mysqld: SSL error: Unable to get private key from ‘/etc/mysql/newcerts/server-key.pem’
Sep 18 17:02:15 remote mysqld: 120918 17:02:15 [Warning] Failed to setup SSL
Sep 18 17:02:15 remote mysqld: 120918 17:02:15 [Warning] SSL error: Unable to get private key

(в /var/log/syslog на remote.example.com) и

root@local:/etc/mysql/newcerts# mysql –ssl-ca=/etc/mysql/newcerts/ca-cert.pem –ssl-cert=/etc/mysql/newcerts/client-cert.pem –ssl-key=/etc/mysql/newcerts/client-key.pem -h remote.example.com -u root -p
Enter password:
ERROR 2026 (HY000): SSL connection error: protocol version mismatch
root@local:/etc/mysql/newcerts#

(на local.example.com, когда вы пытаетесь установить зашифрованное соединение с remote.example.com), по крайней мере с MySQL 5.5; см.:

Чтобы решить эту проблему, мы просто соберем свой собственный OpenSSL (это не нужно, если ваша версия OpenSSL старше 1.0.1):

cd /tmp
wget http://www.openssl.org/source/openssl-0.9.8x.tar.gz
tar xvfz openssl-0.9.8x.tar.gz
cd openssl-0.9.8x
./config –prefix=/usr/local/openssl-0.9.8
make
make install

После этого вы найдете свой новый бинарный файл OpenSSL в /usr/local/openssl-0.9.8/bin/openssl.

Теперь мы создадим CA, серверные и клиентские сертификаты, которые нам нужны для SSL-соединений. Я создаю эти сертификаты в каталоге /etc/mysql/newcerts, который мне нужно создать сначала:

mkdir /etc/mysql/newcerts && cd /etc/mysql/newcerts

Создайте CA сертификат (я использую /usr/local/openssl-0.9.8/bin/openssl здесь; если версия OpenSSL вашей системы старше 1.0.1, вы можете просто использовать openssl):

/usr/local/openssl-0.9.8/bin/openssl genrsa 2048 > ca-key.pem
/usr/local/openssl-0.9.8/bin/openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem

Создайте серверный сертификат:

/usr/local/openssl-0.9.8/bin/openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem > server-req.pem
/usr/local/openssl-0.9.8/bin/openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem

Создайте клиентский сертификат:

/usr/local/openssl-0.9.8/bin/openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem > client-req.pem
/usr/local/openssl-0.9.8/bin/openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem

Вывод команды…

ls -l

… теперь должен выглядеть следующим образом:

root@remote:/etc/mysql/newcerts# ls -l
total 32
-rw-r–r– 1 root root 1346 Sep 18 17:52 ca-cert.pem
-rw-r–r– 1 root root 1679 Sep 18 17:52 ca-key.pem
-rw-r–r– 1 root root 1099 Sep 18 17:53 client-cert.pem
-rw-r–r– 1 root root 1679 Sep 18 17:53 client-key.pem
-rw-r–r– 1 root root 956 Sep 18 17:53 client-req.pem
-rw-r–r– 1 root root 1099 Sep 18 17:53 server-cert.pem
-rw-r–r– 1 root root 1679 Sep 18 17:53 server-key.pem
-rw-r–r– 1 root root 956 Sep 18 17:53 server-req.pem
root@remote:/etc/mysql/newcerts#

Теперь нам нужно передать ca-cert.pem, client-cert.pem и client-key.pem на локальный сервер MySQL (на local.example.com); прежде чем мы это сделаем, мы создаем каталог /etc/mysql/newcerts на local.example.com:

local.example.com:

mkdir /etc/mysql/newcerts

Вернувшись на

remote.example.com

, мы можем передать три файла на

local.example.com

следующим образом:

remote.example.com:

scp /etc/mysql/newcerts/ca-cert.pem [email protected]:/etc/mysql/newcerts
scp /etc/mysql/newcerts/client-cert.pem [email protected]:/etc/mysql/newcerts
scp /etc/mysql/newcerts/client-key.pem [email protected]:/etc/mysql/newcerts

Далее откройте /etc/mysql/my.cnf…

vi /etc/mysql/my.cnf

… и измените раздел * Security Features; раскомментируйте строки ssl-ca, ssl-cert и ssl-key и заполните правильные значения:

| | [...] # * Security Features # # Read the manual, too, if you want chroot! # chroot = /var/lib/mysql/ # # For generating SSL certificates I recommend the OpenSSL GUI "tinyca". ssl ssl-ca=/etc/mysql/newcerts/ca-cert.pem ssl-cert=/etc/mysql/newcerts/server-cert.pem ssl-key=/etc/mysql/newcerts/server-key.pem [...] | |

Перезапустите MySQL:

/etc/init.d/mysql restart

Теперь снова войдите в MySQL…

mysql -u root -p

… и проверьте, что SSL включен и что правильные сертификаты загружены:

show variables like '%ssl%';

mysql> show variables like ’%ssl%’;
+—————+————————————-+
| Variable_name | Value                               |
+—————+————————————-+
| have_openssl  | YES                                 |
| have_ssl      | YES                                 |
| ssl_ca        | /etc/mysql/newcerts/ca-cert.pem     |
| ssl_capath    |                                     |
| ssl_cert      | /etc/mysql/newcerts/server-cert.pem |
| ssl_cipher    |                                     |
| ssl_key       | /etc/mysql/newcerts/server-key.pem  |
+—————+————————————-+
7 rows in set (0.00 sec)

mysql>

Не выходите из оболочки MySQL. Теперь мы собираемся создать пользователя root MySQL, которому разрешено подключаться с local.example.com к remote.example.com и который должен использовать SSL:

CREATE USER ‘root’@’192.168.0.100’ IDENTIFIED BY ‘mysqlrootpassword’;
GRANT ALL PRIVILEGES ON . TO ‘root’@’192.168.0.100’ IDENTIFIED BY ‘mysqlrootpassword’ WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

GRANT USAGE ON *.* TO 'root'@'192.168.0.100' REQUIRE SSL;

CREATE USER ‘root’@’local.example.com’ IDENTIFIED BY ‘mysqlrootpassword’;
GRANT ALL PRIVILEGES ON . TO ‘root’@’local.example.com’ IDENTIFIED BY ‘mysqlrootpassword’ WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

GRANT USAGE ON *.* TO 'root'@'local.example.com' REQUIRE SSL;
FLUSH PRIVILEGES;

Теперь вы можете выйти из оболочки MySQL:

quit;

Вот и все — теперь у нас есть пользователь root MySQL, которому разрешено подключаться с local.example.com к remote.example.com, но который должен использовать SSL-шифрование.

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.