MySQL管理 · 3 min read · Jan 29, 2026

1つのphpMyAdminインストールから複数のMySQLサーバーを管理する(SSL暗号化を使用)

1つのphpMyAdminインストールから複数のMySQLサーバーを管理する(SSL暗号化を使用)

バージョン 1.0
著者: Falko Timme
Twitterでフォローしてください

このチュートリアルでは、1つのphpMyAdminインストールから複数のMySQLサーバーを管理する方法を説明します。セキュリティ上の理由から、phpMyAdminとリモートMySQLサーバー間の通信はSSL暗号化を使用しています(ローカルMySQLサーバーの場合、phpMyAdminとMySQL間の通信はサーバーを離れないため、これは必要ありません)。phpMyAdminは、PHPで書かれた無料のソフトウェアツールで、World Wide Webを介してMySQLの管理を扱うことを目的としています。phpMyAdminは、MySQLに対して幅広い操作をサポートしています。

私は、これがあなたにとって機能するという保証を行いません!

1 前提条件

このチュートリアルでは、2つのMySQLサーバーを管理する方法を示します - 1つはローカル(local.example.com、IPアドレス192.168.0.100 - これはphpMyAdminがインストールされているサーバー)で、もう1つはリモートサーバー(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シェルで次のコマンドを実行します:

show variables like '%ssl%';

出力が次のようになっている場合(both have_openssl and have_ssl show 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

(remote.example.comの/var/log/syslog内)および

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
パスワードを入力してください:
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.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に戻り、次のように3つのファイルを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シェルを離れないでください。これからlocal.example.comからremote.example.comに接続できるMySQLルートユーザーを作成し、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;

これで完了です - local.example.comからremote.example.comに接続できるMySQLルートユーザーが作成され、SSL暗号化を使用する必要があります。

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。