从一个phpMyAdmin安装管理多个MySQL服务器(使用SSL加密)

从一个phpMyAdmin安装管理多个MySQL服务器(使用SSL加密) 本教程解释如何管理多个MySQL服务器

从一个phpMyAdmin安装(使用SSL加密)管理多个MySQL服务器

本教程介绍如何从一个phpMyAdmin安装中管理多个MySQL服务器。 为了安全起见,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(手动或通过您的发行版的软件包管理器)和工作(即,您应该已经能够通过phpMyAdmin来管理本地的MySQL服务器) - 我将不会在这里覆盖phpMyAdmin安装。

本教程基于Debian Wheezy / Ubuntu 12.04。 对于其他发行版,您可能需要调整一些路径,但原则是一样的。

2在远程MySQL服务器上启用SSL支持

remote.example.com:

登录MySQL ...

mysql -u root -p

...并在MySQL shell上运行以下命令:

show variables like '%ssl%';

如果输出如下( has_opensslhave_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 shell?

quit;

...并打开/etc/mysql/my.cnf

vi /etc/mysql/my.cnf

向下滚动到*安全功能部分(在[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 shell。

确保安装了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 / syslogremote.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

之后,您将在/usr/local/openssl-0.9.8/bin/openssl中找到新的OpenSSL二进制文件。

现在,我们创建了SSL连接所需的CA,服务器和客户端证书。 我在目录/ 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.pemclient-cert.pemclient-key.pem传输到本地的MySQL服务器(在local.example.com上 ); 在我们这样做之前,我们在local.example.com上创建目录/ etc / mysql / newcerts

local.example.com:

mkdir /etc/mysql/newcerts

回到remote.example.com ,我们可以将这三个文件传输到local.example.com ,如下所示:

remote.example.com:

scp /etc/mysql/newcerts/ca-cert.pem root@local.example.com:/etc/mysql/newcerts

scp /etc/mysql/newcerts/client-cert.pem root@local.example.com:/etc/mysql/newcerts

scp /etc/mysql/newcerts/client-key.pem root@local.example.com:/etc/mysql/newcerts

接下来,打开/etc/mysql/my.cnf ...

vi /etc/mysql/my.cnf

...并修改*安全功能部分; 取消注释ssl-cassl-certssl-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 shell。 我们现在要创建一个允许从local.example.com连接到remote.example.com的MySQL root用户,需要使用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 shell:

quit;

就是这样 - 我们现在有一个MySQL root用户可以从local.example.com连接到remote.example.com ,但需要使用SSL加密。