# MySQL con túneles SSH
La forma más eficaz y segura de trabajar con MySQL de forma remota en mi opinión es usando herramientas de escritorio, configurándolas con túneles SSH.
# Ventajas
- No requiere dar permisos de acceso remoto específicos por IP o FQDN
- La seguridad queda en manos de las capas superiores de defensa (firewall)
- Las herramientas disponibles son mucho más eficaces y seguras que phpMyAdmin
# Herramientas disponibles
- Mysql WorkBench con el problema de que no es 1005 funcional con MariaDb y Percona
- TablePlus Quizás el mejor y más completo programa para trabajar con bases de datos como programador. Disponible, en Windows/Mac/Linux/iOS/iPadOS, aunque en linux esta en fase experimiental.
- MysqlFront ahora HeidiSQL para windows
- Navicat (Privativo)
- Sequel Pro sólo para Mac y se puede compilar fácilmente. Es de lo mejor
- DBeaver multiplataforma con versión Community Edition (Java)
# Instalación de MySQL Workbench
MySQL Workbench puede instalarse eligiendo nuestro sistema operativo.
En las descargas oficiales suele haber un hash md5 que nos sirve para verificar que lo que nos hemos bajado, es un paquete oficial no manipulado. No verificar nuestras descargas puede tener consecuencias muy graves, ya que en caso de que hallan explotado alguna vulnerabilidad en el repositorio, podemos estar descargando una instalador que contiene un troyano, lo cual ha sucedido ya en numerosas ocasiones.
# Configuración de MySQL Workbench
Nada más abrir el programa tendremos un panel de control (dashboard) como el de la imagen de abajo (pero vacío), apuntando a la sección Mysql Connections
En el panel veremos un icono que nos permitirá la creación o edición de nuestras conexiones.
# Configuración de una conexión sobre SSH
Trabajaremos con SSH, en una conexión basada en llaves, sin contraseña.
- Seleccionamos el método de conexión del desplegable central que hay en la pestaña Connection usando para nuestro propósito Standard TCP/IP over SSH
- En la pestaña Parameters del método de conexión:
- SSH Hostname: El nombre del servidor. En el caso de que el puerto SSH no fuera el puerto 22 debemos añadir :XX siendo XX el número del puerto
- SSH Username: El nombre del usuario con el que conectaremos a la maquina MySQL
- SSH Key File: Introduciremos el path al fichero privado de nuestro juego de llaves. Es posible de acuerdo a la configuración más habitual tanto en Linux, Mac o Windows, que el botón de apertura del administrador de archivos (...) no nos muestre los directorios ocultos (los que empiezan por "."), en cuyo caso debemos ponerlo manualmente. SSH Key File con putty
- MySQL Hostname: 127.0.0.1
- MySQL Server Port: 3306
- Username: Usuario con acceso a MySQL via contraseña. No son validos usuarios que se conectan via socket como en las nuevas versiones de MySQL 8 o MariaDb 10.3/10.4. En estos casos es necesario crear un usuario con autentificación basada en contraseña.
- Password: El del usuario con acceso a MySQL
- Default Schema: la base de datos por defecto que queremos que visualize. En blanco mostrara todas a las que tiene acceso el usuario.
- El botón de Test Connection nos permitirá comprobar nuestra configuración.
Nuestra conexión ya estará disponible para ser usada haciendo doble click en ella en nuestro panel de control.
# Configuración de TablePlus
En este manual vamos a trabajar sobre Windows ya que en mi plataforma de trabajo, basada en Linux, todavía hay algunos bugs en la versión actual. Además por desgracia, es el SO de muchos programadores, asi que el alcance del manual es mayor para ellos, con la dificultad añadida del dichoso PuTTY.
- Instalar la aplicación
- Tener preparado nuestra llave SSH. En el caso de windows con PuTTy, debemos exportar la llave al formato adecuado en lugar de usar la llave privada con formato propietario de ese programa. Consulta nuestro manual Llaves en formato OpenSSH
# Creación de una nueva conexión remota con SSH
Crear una conexión nueva es sencillo, y nos permite elegir el modelo de motor de la base de datos, entre las más comunes para los programadores, diferenciando en nuestro caso entre MySQL y MariaDB. Tambiín podemos trabajar con otras que no son soportadas por las herramientas descritas en este documento y que requieren de aplicaciones individuales, como Redis, SQLite, Cockroach, ...
Recordar que MySQL, MariaDB, Percona y otros forks de MySQL, no son 100% compatibles. Este dato causa muchos problemas a propietarios de sitios, pues sus desarrolladores obvian este tipo de cosas que pueden resultar muy negativas en caso de restauración o migración de servicios a otros servidores.
# Ajustes
Lo más importante y necesario para una conexión remota basada en SSH
- Host/Socket: localhost
- User: root (si queremos tener acceso a todas las bases de datos)
- Password: contraseña del usuario. En el caso de que sea un servidor de las últimas versiones de MySQL o MariaDB, y que tengamos la autentificación basada en socket para el usuario root, deberemos crear un usuario con permisos pero que use el modelo de autentifciación basado en contraseña en lugar de socket.
- Database: Si queremos que siempre abra una database en particular.
- Over SSH: Casilla que debemos activar para realizar la conexión basada en SSH.
- Server: Hostname remote o FQDN.
- Port: Puerto SSH remoto.
- User: User ssh.
- Use SSH Key: TablePlus detecta si nla llave no es OpenSSH, en cuyo caso te lanzará la aplicación windows para convertirla. Mi consejo es que directamente uses PuttyGen para hacer esto. [Llaves en formato OpenSSH](https://manuales.castris.com/
- Passphrase: Si creaste la llave con contraseña deberás ponerla aquí.
Una vez rellenado correctamente, puedes probar y salvar. Ya esta listo.
# Configuración de HeidiSQL (antiguo MySQLFront)
HeidiSQL es el desarrollo continuado del antiguo MySQLFront el cual es aconsejable instalar ya que mucha gente instala viejas versiones descargadas de los sitios más insospechados y que pueden tener brecha de seguridad.
- Instalar la aplicación
- Tener preparada nuestra llave ssh. Consulta nuestro manual para Putty
En el ejemplo que vamos a desarrollar estamos en un escenario de Windows, configurando una conexión remota vía SSH Tunnel contra un servidor MariaDB, usando llave SSH.
# Configuración de la sesión
# Ajustes
- Tipo de red: MySQL (SSH Tunnel)
- Library: libmariadb.dll (disponible varias versiones para mariadb, mysql, ya que existen diferencias en su forma de trabajar)
- Nombre del host/IP: 127.0.0.1
- Usuario: root (Puede ser posible que según tu configuración del motor de bases de datos tengas que crear un usuario con permisos de autentificación basada en password en lugar de basada en sockets)
# Túnel SSH
- Ubicación de plink.exe: Este es un ejecutable que se encuentra en el directorio de instalación del Programa PuTTY
- Host SSH + puerto: Nombre o hostname del servidor MySQL al que queremos conectarnos.
- Nombre de usuario: Es el nombre del usuario con permisos para acceder vía SSH al servidor. Puede ser root o nuestro usuario personal (aconsejable)
- Contraseña: Dejamos el texto que viene por defecto ya que vamos a configurar el acceso con llave sin contraseña.
- Archivo de llave privada: Aquí seleccionaremos la llave privada que corresponde a la llave pública que *debe estar autorizada en el servidor en el usuario que hemos configurado más arriba. Si no puedes añadirla, puedes solicitárselo a tu administrador de sistemas o hosting.
- Puerto local: Referido al puerto de escucha de MySQL/MariaDB por defecto 3306