This article explains how to setup and use phpMyAdmin with a MySQL server running on the ReadyNAS duo. This configuration does not require installing phpMyAdmin on the ReadyNAS. Instead it provides a secure configuration while allowing to administer the database remotely. The idea is to use an SSH tunnel to establish a secure connection to the MySQL server. This article deals with the ReadyNAS duo but it can be applied to any MySQL server (I've used this mechanism for the administration of Planzone).
Creating the SSH Tunnel
The ssh tunnel is created when we use the ssh -L option. The first port (3307
) specifies the local port and localhost:3306
specifies the MySQL port on the remote endpoint. The tunnel is active only when we are connected with ssh. This is useful to guarantee that nobody can access the MySQL server while we are not connected. The MySQL traffic will also be encrypted by SSH. On your host, type the following command (replace pollux
by your ReadyNAS host name).
$ ssh -L 3307:localhost:3306 -l root pollux
root@pollux's password:
Linux nas-D2-24-F2 2.6.17.8ReadyNAS #1 Tue Jun 9 13:59:28 PDT 2009 padre unknown
nas-D2-24-F2:~#
Keep this connection open until you don't need the tunnel any more. As soon as you exit, the tunnel will be closed.
Setting up MySQL server
By default the MySQL server does not listen on any TCP/IP port but instead it uses Unix sockets (Unix sockets are faster and listening on TCP/IP ports could create security leaks if not done correctly). For the ssh
tunnel to work, the MySQL server must listen on the a TCP/IP port on the localhost address.
Look at the configuration file /etc/mysql/my.cnf
and make sure it contains the following lines (uncomment bind-address
and comment the skip-networking
):
socket = /var/run/mysqld/mysqld.sock
port = 3306
bind-address = 127.0.0.1
#skip-networking
You should then restart MySQL if you changed the configuration file:
nas-D2-24-F2:/ # /etc/init.d/mysql stop
nas-D2-24-F2:/ # /etc/init.d/mysql start
Setting up mysql grant
A grant definition is necessary so that we can connect to MySQL server on the TCP/IP port. From the MySQL server point of view, the connection is from the localhost (the tunnel endpoint on the ReadyNAS). Connect to MySQL and type the following commands (you can use pwgen
to make a password on Ubuntu):
mysql> grant all privileges on *.* to 'root'@'127.0.0.1' identified by 'Lugo6cho';
Query OK, 0 rows affected (0.04 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.02 sec)
Testing the connection
On another terminal window, try to connect to the MySQL server through the tunnel.
zebulon $ mysql -u root --host 127.0.0.1 --port 3307
If the client fails with Can't connect to MySQL server on '127.0.0.1' (111)
, verify that the tunnel is up and that the port is correct. If the client fails with Access denied for user 'root'@'127.0.0.1'
, verify the MySQL access rights and update the grant.
Update phpMyAdmin configuration
Now, we just need to add the tunnel local endpoint to the phpMyAdmin configuration. For this, add the following lines to the phpMyAdmin configuration file (/etc/phpmyadmin/config.inc.php
on Ubuntu).
$cfg['Servers'][$i]['host'] = '127.0.0.1';
$cfg['Servers'][$i]['port'] = '3307';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['AllowNoPassword'] = FALSE;
$i++;
Now, connect to your phpMyAddmin and login on the 127.0.0.1:3307
configuration. Once you are logged in, you'll administer the remote MySQL server.
Add a comment
To add a comment, you must be connected. Login