从一个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_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 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 / 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; 看到:
- https://bugs.launchpad.net/percona-server/+bug/1007164
- http://bugs.mysql.com/bug.php?id=64870
- http://forums.mysql.com/read.php?11,400856,401127#msg-401127
为了解决这个问题,我们只需要构建我们自己的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.pem
, client-cert.pem
和client-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-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 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加密。