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=3306Enter 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=3306El 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 \
--passwordCon 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=desarrolloLos 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.sqlTambié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=3307El 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=stagingPara eliminar solo un campo específico de un login-path (por ejemplo, el puerto):
mysql_config_editor remove --login-path=produccion --portPara 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 \
--passwordCaso 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=3306Ahora, 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
