Cada vez que te conectas a MySQL desde la línea de comandos, necesitas proporcionar un usuario y una contraseña. El método más directo (escribir mysql -u root -pMiContraseña) es también el más peligroso: la contraseña queda expuesta en el historial de la shell, en los logs del sistema y es visible para cualquier usuario que ejecute ps aux en el mismo servidor. La herramienta mysql_config_editor resuelve este problema almacenando las credenciales de forma cifrada en un archivo protegido.

Qué es mysql_config_editor

mysql_config_editor es una utilidad incluida con MySQL que gestiona un archivo de credenciales cifrado llamado .mylogin.cnf, ubicado en el directorio home del usuario. A diferencia de almacenar contraseñas en texto plano en el archivo .my.cnf, el archivo .mylogin.cnf usa un cifrado ofuscado que impide la lectura directa.

El concepto central es el login-path: un nombre que agrupa las credenciales de conexión a un servidor específico (host, usuario, contraseña y puerto). Puedes definir múltiples login-paths para diferentes servidores y luego conectarte simplemente referenciando ese nombre.

Crear un login-path

Para almacenar las credenciales de un servidor, usa el subcomando set:

mysql_config_editor set --login-path=produccion \
  --host=db-prod-01.empresa.com \
  --user=admin \
  --password \
  --port=3306
Enter password: ********

La contraseña se solicita de forma interactiva por seguridad; nunca se pasa como argumento en la línea de comandos. Esto crea una entrada en el archivo .mylogin.cnf con el nombre "produccion".

Puedes crear múltiples login-paths para diferentes entornos:

mysql_config_editor set --login-path=staging \
  --host=db-staging.empresa.com \
  --user=admin \
  --password \
  --port=3306
 
mysql_config_editor set --login-path=desarrollo \
  --host=localhost \
  --user=dev_user \
  --password \
  --port=3306
 
mysql_config_editor set --login-path=replica \
  --host=db-replica-01.empresa.com \
  --user=repl_monitor \
  --password \
  --port=3306

El login-path especial client se usa como valor por defecto cuando no especificas ningún login-path al conectarte:

mysql_config_editor set --login-path=client \
  --host=localhost \
  --user=root \
  --password

Con esta configuración, simplemente ejecutar mysql (sin opciones) te conectará como root a localhost.

Listar login-paths configurados

Para ver todos los login-paths almacenados y su configuración (excepto las contraseñas, que se muestran como asteriscos):

mysql_config_editor print --all
[produccion]
user = admin
password = *****
host = db-prod-01.empresa.com
port = 3306

[staging]
user = admin
password = *****
host = db-staging.empresa.com
port = 3306

[desarrollo]
user = dev_user
password = *****
host = localhost
port = 3306

[client]
user = root
password = *****
host = localhost

Para ver solo un login-path específico:

mysql_config_editor print --login-path=produccion
[produccion]
user = admin
password = *****
host = db-prod-01.empresa.com
port = 3306

Usar login-paths para conectarse

Una vez configurados los login-paths, conectarse a cualquier servidor es sencillo y seguro:

# Conectar al servidor de producción
mysql --login-path=produccion
 
# Conectar al staging
mysql --login-path=staging
 
# Conectar a desarrollo
mysql --login-path=desarrollo

Los login-paths funcionan con todas las herramientas de MySQL, no solo con el cliente mysql:

# Hacer un backup del servidor de producción
mysqldump --login-path=produccion erp_produccion > backup.sql
 
# Verificar el estado del servidor de staging
mysqladmin --login-path=staging status
 
# Importar datos en desarrollo
mysql --login-path=desarrollo tienda_dev < datos_prueba.sql

También puedes combinar un login-path con opciones adicionales. Las opciones de la línea de comandos sobrescriben los valores del login-path:

# Usar credenciales de producción pero conectar a una base de datos específica
mysql --login-path=produccion erp_produccion
 
# Usar las credenciales pero forzar otro puerto
mysql --login-path=produccion --port=3307

El archivo .mylogin.cnf

El archivo donde se almacenan las credenciales se ubica en:

ls -la ~/.mylogin.cnf
-rw------- 1 admin admin 544 Mar 18 15:20 /home/admin/.mylogin.cnf

Observa los permisos 600 (solo lectura y escritura para el propietario). Si alguien intenta leer el archivo directamente, verá datos binarios cifrados, no texto plano. Sin embargo, es importante notar que el cifrado usado es una ofuscación simétrica, no un cifrado criptográficamente fuerte. Su propósito principal es evitar la lectura casual, no proteger contra un atacante sofisticado con acceso al sistema de archivos.

Por esta razón, proteger los permisos del archivo y del directorio home sigue siendo importante:

chmod 600 ~/.mylogin.cnf
chmod 700 ~

Eliminar y modificar login-paths

Para eliminar un login-path completo:

mysql_config_editor remove --login-path=staging

Para eliminar solo un campo específico de un login-path (por ejemplo, el puerto):

mysql_config_editor remove --login-path=produccion --port

Para modificar un login-path, simplemente vuelve a ejecutar set con el mismo nombre. Los valores se sobrescriben:

mysql_config_editor set --login-path=produccion \
  --host=db-prod-02.empresa.com \
  --user=admin \
  --password

Caso práctico: configuración para un equipo de DBAs

Imagina un equipo de tres administradores de bases de datos que gestionan un cluster de MySQL con un servidor primario y dos réplicas. Cada DBA configura sus login-paths de la siguiente manera:

# Servidor primario (lectura y escritura)
mysql_config_editor set --login-path=primary \
  --host=mysql-primary.internal \
  --user=dba_admin \
  --password \
  --port=3306
 
# Réplica 1 (solo lectura, para consultas de monitoreo)
mysql_config_editor set --login-path=replica1 \
  --host=mysql-replica1.internal \
  --user=dba_readonly \
  --password \
  --port=3306
 
# Réplica 2
mysql_config_editor set --login-path=replica2 \
  --host=mysql-replica2.internal \
  --user=dba_readonly \
  --password \
  --port=3306

Ahora, verificar el estado de replicación es un comando limpio:

mysql --login-path=replica1 -e "SHOW REPLICA STATUS\G" \
  | grep -E "Seconds_Behind|Running"
             Replica_IO_Running: Yes
            Replica_SQL_Running: Yes
        Seconds_Behind_Source: 0

Caso práctico: integración con scripts de backup

Los scripts de backup son uno de los principales beneficiarios de los login-paths, ya que eliminan la necesidad de almacenar contraseñas en archivos de script o variables de entorno:

#!/bin/bash
# backup_diario.sh
FECHA=$(date +%Y%m%d)
DESTINO="/backups/mysql"
 
# Lista de bases de datos a respaldar
BASES=$(mysql --login-path=produccion -N -e "SHOW DATABASES" \
  | grep -v -E "^(information_schema|performance_schema|sys|mysql)$")
 
for DB in $BASES; do
  echo "Respaldando $DB..."
  mysqldump --login-path=produccion \
    --single-transaction \
    --routines \
    --triggers \
    "$DB" | gzip > "$DESTINO/${DB}_${FECHA}.sql.gz"
done
 
echo "Backup completado."

Este script puede ejecutarse como un cron job sin ningún riesgo de exposición de credenciales. Ni el historial de cron, ni los logs del sistema, ni la salida de ps mostrarán la contraseña.

Usar mysql_config_editor es una práctica de seguridad básica que todo administrador debería adoptar desde el primer día. En el siguiente artículo veremos cómo ejecutar archivos SQL desde la línea de comandos, una habilidad que se complementa perfectamente con los login-paths que acabamos de configurar.

Escrito por Eduardo Lázaro