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 -pshow 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/newcertsscp /etc/mysql/newcerts/client-cert.pem [email protected]:/etc/mysql/newcertsscp /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-шифрование.
Get new posts in your inbox
No spam. Unsubscribe anytime.