Cómo configurar la replicación de MySQL con cifrado SSL en CentOS 5.4
Objetivo principal y palabras clave relacionadas
- Objetivo: Configurar replicación MySQL cifrada con SSL entre un servidor maestro y un esclavo en CentOS 5.4.
- Variantes relacionadas: replicación MySQL SSL, MySQL master slave SSL CentOS, cifrar replicación MySQL, configurar SSL MySQL, seguridad replicación MySQL.
Resumen breve
Este tutorial detalla cómo replicar la base de datos exampledb desde server1.example.com (192.168.0.100) hacia server2.example.com (192.168.0.101) usando SSL. Cubre la instalación de MySQL 5, habilitación de SSL, generación de certificados (CA, servidor y cliente), transferencia segura de certificados, ajustes de /etc/my.cnf en maestro y esclavo, creación de usuario de replicación con REQUIRE SSL (opcional), volcado e importación de la base de datos, y verificación de la replicación. También incluye comprobaciones, alternativas cuando SSL nativo no está disponible y listas de verificación operativas.
Importante
- Realice estas acciones como root o con privilegios equivalentes.
- Esta guía no sustituye una política de backups: una instrucción DELETE accidentada en el maestro también se replicará al esclavo.
1 Nota preliminar
En este tutorial se replicará la base de datos exampledb del servidor server1.example.com (maestro, IP 192.168.0.100) al servidor server2.example.com (esclavo, IP 192.168.0.101). Ambos sistemas ejecutan CentOS 5.4; los pasos suelen ser aplicables a otras distribuciones con mínimas modificaciones. Se asume que exampledb ya existe en el maestro y que no existe en el esclavo.
También se explica cómo cifrar la conexión de replicación entre maestro y esclavo usando SSL para evitar que contraseñas o datos sean capturados por sniffers en la red.
2 Instalar MySQL 5 y habilitar soporte SSL
Si MySQL 5 no está instalado en server1 y server2, instálelo ahora:
server1/server2:
yum install mysql mysql-devel mysql-server
Crear enlaces de arranque del sistema para MySQL para que se inicie automáticamente y arrancar el servicio:
chkconfig --levels 235 mysqld on
/etc/init.d/mysqld start
A continuación establezca la contraseña root de MySQL en ambos servidores:
server1:
mysqladmin -u root password yourrootsqlpassword
mysqladmin -h server1.example.com -u root password yourrootsqlpassword
server2:
mysqladmin -u root password yourrootsqlpassword
mysqladmin -h server2.example.com -u root password yourrootsqlpassword
(si el servidor ya tenía contraseña, ajuste los comandos o omítalos según corresponda). Esto evita que cualquiera acceda a su instancia MySQL sin credenciales.
Ahora verifique si el servidor MySQL soporta SSL. Conéctese a MySQL:
server1/server2:
mysql -u root -p
En el prompt de MySQL ejecute:
show variables like '%ssl%';
Si la salida muestra have_openssl y have_ssl como DISABLED, MySQL tiene soporte SSL compilado pero no está activado. Para activarlo, salga del shell MySQL:
quit;
Edite /etc/my.cnf y añada la palabra ssl en la sección [mysqld]:
vi /etc/my.cnf
Agregue (o verifique) una línea ssl en la sección [mysqld], por ejemplo:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
ssl
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
Reinicie MySQL:
/etc/init.d/mysqld restart
Vuelva a conectarse a MySQL y compruebe variables SSL:
mysql -u root -p
show variables like '%ssl%';
La salida esperada cuando SSL está habilitado debería mostrar have_openssl = YES y have_ssl = YES.
quit;
3 Configurar el maestro (server1)
3.1 Preparar directorio de binlogs
En server1 cree un directorio para los binlogs y ajuste la propiedad:
mkdir /var/log/mysql
chown mysql:mysql /var/log/mysql
3.2 Generar los certificados (CA, servidor y cliente)
Cree un directorio para los certificados y sitúese en él:
mkdir -p /etc/mysql/newcerts && cd /etc/mysql/newcerts
Genere la clave y el certificado de la CA (autoridad certificadora):
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem
Genere la clave y la petición/certificado del servidor:
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem > server-req.pem
openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
Genere la clave y la petición/certificado del cliente (para el esclavo):
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem > client-req.pem
openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
Lista de los ficheros generados (salida de ejemplo):
[root@server1 newcerts]# ls -l
total 32
-rw-r--r-- 1 root root 1375 Feb 8 17:37 ca-cert.pem
-rw-r--r-- 1 root root 1679 Feb 8 17:37 ca-key.pem
-rw-r--r-- 1 root root 1119 Feb 8 17:37 client-cert.pem
-rw-r--r-- 1 root root 1675 Feb 8 17:37 client-key.pem
-rw-r--r-- 1 root root 968 Feb 8 17:37 client-req.pem
-rw-r--r-- 1 root root 1119 Feb 8 17:37 server-cert.pem
-rw-r--r-- 1 root root 1679 Feb 8 17:37 server-key.pem
-rw-r--r-- 1 root root 968 Feb 8 17:37 server-req.pem
[root@server1 newcerts]#
Nota: las marcas de tiempo y tamaños pueden variar. Mantenga ca-key.pem en un lugar seguro; es la clave de su CA.
3.3 Transferir certificados al esclavo
En server2 cree el mismo directorio para certificados:
server2:
mkdir -p /etc/mysql/newcerts
En server1 transfiera los siguientes archivos al esclavo: ca-cert.pem, client-cert.pem y client-key.pem (no transfiera ca-key.pem):
server1:
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
Importante: proteger client-key.pem en el esclavo con permisos restrictivos (600) y propiedad mysql:root o root según el escenario.
3.4 Configurar /etc/my.cnf en el maestro para usar certificados
Edite /etc/my.cnf y añada las rutas a ca, cert y key en la sección [mysqld]:
vi /etc/my.cnf
Ejemplo de sección [mysqld] a incluir o actualizar:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
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
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
Reinicie MySQL:
/ etc/init.d/mysqld restart
3.5 Crear usuario de replicación que requiera SSL
Conéctese a MySQL en el maestro:
mysql -u root -p
En el prompt de MySQL cree el usuario de replicación. El uso de REQUIRE SSL obliga a que el esclavo se conecte cifrando la sesión:
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'slave_password' REQUIRE SSL;
FLUSH PRIVILEGES;
quit;
Si ya existe un usuario slave_user y quiere restringirlo a SSL:
GRANT USAGE ON *.* TO 'slave_user'@'%' REQUIRE SSL;
FLUSH PRIVILEGES;
3.6 Configuración de binlogs y parámetros de replicación en el maestro
Edite /etc/my.cnf y en la sección [mysqld] añada los parámetros para binlog y el server-id. Ejemplo:
vi /etc/my.cnf
Añadir/ajustar:
[mysqld]
# (elementos anteriores como ssl y paths)
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
binlog_do_db = exampledb
Reinicie MySQL:
/etc/init.d/mysqld restart
3.7 Bloquear la base, obtener posición y volcar datos
Conéctese al servidor MySQL y prepare la captura consistente del estado del maestro:
mysql -u root -p
En el prompt de MySQL:
USE exampledb;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
Apunte los valores File y Position que devuelve SHOW MASTER STATUS; los necesitará al configurar el esclavo. Ejemplo de salida:
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 3096416 | exampledb | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
No cierre este shell aún, porque FLUSH TABLES WITH READ LOCK mantiene un bloqueo global de lectura que impide cambios mientras tomamos el volcado.
En una segunda terminal (mientras mantiene el bloqueo en la primera), genere el volcado y transpórtelo al esclavo:
server1 (segunda terminal):
cd /tmp
mysqldump -u root -pyourrootsqlpassword --opt exampledb > snapshot.sql
scp snapshot.sql [email protected]:/tmp
Una vez terminado el scp, en la primera terminal (donde mantiene el lock) desbloquee y salga del shell MySQL:
server1:
UNLOCK TABLES;
quit;
4 Configurar el esclavo (server2)
4.1 Importar el volcado en el esclavo
En server2 importe el volcado al servidor MySQL local:
server2:
mysql -u root -p
CREATE DATABASE IF NOT EXISTS exampledb;
quit;
mysql -u root -p exampledb < /tmp/snapshot.sql
Ajuste permisos del directorio de certificados en server2:
chown -R mysql:mysql /etc/mysql/newcerts
chmod 600 /etc/mysql/newcerts/client-key.pem
4.2 Configurar /etc/my.cnf en el esclavo
Edite /etc/my.cnf en server2 y configure server-id distinto del maestro, y opcionalmente relay logs:
vi /etc/my.cnf
Ejemplo de sección [mysqld] para el esclavo:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
old_passwords=1
ssl
ssl-ca=/etc/mysql/newcerts/ca-cert.pem
ssl-cert=/etc/mysql/newcerts/client-cert.pem
ssl-key=/etc/mysql/newcerts/client-key.pem
server-id = 2
relay-log = /var/log/mysql/mysql-relay-bin
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
Reinicie MySQL en server2:
/etc/init.d/mysqld restart
4.3 Configurar el maestro en el esclavo usando SSL para la conexión de replicación
A continuación indique al esclavo desde qué maestro replicar y con qué posición. Conéctese a MySQL en server2:
mysql -u root -p
Ejecute (reemplace los valores de MASTER_LOG_FILE y MASTER_LOG_POS por los que obtuvo del maestro):
CHANGE MASTER TO
MASTER_HOST='server1.example.com',
MASTER_USER='slave_user',
MASTER_PASSWORD='slave_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=3096416,
MASTER_SSL=1,
MASTER_SSL_CA='/etc/mysql/newcerts/ca-cert.pem',
MASTER_SSL_CERT='/etc/mysql/newcerts/client-cert.pem',
MASTER_SSL_KEY='/etc/mysql/newcerts/client-key.pem';
START SLAVE;
Nota: la disponibilidad exacta de las opciones MASTERSSL* depende de la versión de MySQL; si su versión no las reconoce, puede confiar en REQUIRE SSL (en el usuario del maestro) y simplemente usar START SLAVE tras configurar host/user/password/position. Otra alternativa es crear un túnel SSL/SSH o VPN (ver sección de alternativas).
Comprobar el estado del slave:
SHOW SLAVE STATUS\G
Verifique que Slave_IO_Running y Slave_SQL_Running estén en Yes y que Seconds_Behind_Master sea un valor razonable. En caso de errores, revise Last_IO_Error y Last_SQL_Error.
quit;
5 Comprobaciones y pruebas
- En el maestro cree una tabla de prueba o inserte una fila en exampledb y confirme que aparece en el esclavo.
- Compruebe logs de MySQL (/var/log/mysqld.log) en ambos servidores ante problemas.
- Verifique permisos y propiedades del directorio de certificados (client-key.pem debe ser legible solo para el propietario).
- Asegúrese de que el puerto 3306 esté accesible entre maestro y esclavo (si usa REQUIRE SSL no se permite conexión sin cifrado desde una red no confiable).
6 Alternativas si SSL nativo no está disponible o no funciona
- Túnel SSH: cifre la conexión de replicación mediante un túnel SSH (ssh -L 3306:localhost:3306) desde el esclavo al maestro; el tráfico MySQL circulará cifrado por SSH.
- VPN: establecer una VPN entre los dos hosts y permitir replicación solo a través de la interfaz de la VPN.
- IPsec: cifrado en capa de red para enlaces dedicados.
Cada alternativa tiene sus trade-offs: SSH y VPN son rápidas de desplegar; IPsec o TLS nativo suelen escalar mejor en infraestructuras más grandes.
7 Resolución de problemas comunes
Problema: Slave_IO_Running = No y Last_IO_Error indica “SSL error” o “SSL connection error”.
- Compruebe que los ficheros de certificado están presentes, rutas correctas y permisos adecuados.
- Verifique que el maestro tenga ssl-ca, ssl-cert y ssl-key configurados y que have_ssl = YES.
- Si la versión de MySQL no soporta MASTERSSL*, use REQUIRE SSL en el usuario maestro y asegúrese de que la conexión cliente (del esclavo) utilice los certificados.
Problema: Error 1045 (Access denied) al iniciar replicación.
- Verifique usuario/contraseña, y la cláusula de host (‘slave_user’@’%’). Use SHOW GRANTS FOR ‘slave_user’@’%’ en el maestro.
Problema: El esclavo se queda retrasado (Seconds_Behind_Master alto).
- Verifique recursos CPU/disk de esclavo, índices, y carga en maestro; analice consultas largas.
8 Buenas prácticas y heurísticos
- Mental model: la replicación es envío de un registro de cambios (binlog) del maestro al esclavo; cifrar el canal protege los binlogs en tránsito.
- Mínimo viable: habilite SSL y REQUIRE SSL en el usuario de replicación; si no es posible, use túnel SSH o VPN.
- Permisos: mantenga la CA en read-only y las claves privadas con permisos 600.
- Testing: pruebe la replicación con tablas de prueba antes de replicar datos en producción.
9 Checklist por rol
Administrador (configuración inicial):
- Instalar MySQL en maestro y esclavo.
- Habilitar SSL en /etc/my.cnf en ambos nodos.
- Generar CA, server, client certificados en maestro.
- Transferir ca-cert.pem + client cert/key a esclavo.
- Configurar server-id y binlogs en maestro.
- Crear usuario de replicación con REQUIRE SSL.
- Obtener File y Position con SHOW MASTER STATUS.
- Generar volcado y transferir al esclavo.
Operador (pruebas y producción):
- Importar snapshot en esclavo.
- Configurar CHANGE MASTER TO con parámetros SSL/pos.
- START SLAVE y comprobar SHOW SLAVE STATUS\G.
- Monitorizar logs y latencia Seconds_Behind_Master.
- Revisar backups: replicación no sustituye backup.
10 Mini metodología: pasos resumidos (SOP rápido)
- Instalar MySQL y habilitar ssl en /etc/my.cnf.
- En maestro: generar CA, server y client certificados.
- Copiar ca-cert.pem y client cert/key al esclavo.
- Configurar parámetros ssl-* y binlog en maestro y reiniciar.
- Crear usuario slave_user con REQUIRE SSL en maestro.
- LOCK, SHOW MASTER STATUS y mysqldump de exampledb.
- Copiar snapshot al esclavo, importar en ejemplo.
- Configurar /etc/my.cnf del esclavo (server-id distinto, ssl-* apuntando a client certs) y reiniciar.
- CHANGE MASTER TO … MASTER_SSL=1 y START SLAVE.
- Verificar replicación con SHOW SLAVE STATUS\G y pruebas funcionales.
11 Criterios de aceptación
- El esclavo muestra Slave_IO_Running = Yes y Slave_SQL_Running = Yes.
- Las pruebas de inserción/actualización en el maestro se reflejan en el esclavo en un tiempo razonable.
- La sesión de replicación utiliza SSL (ver Last_IO_Error o comprobaciones de conexión si aplica). Si se usa REQUIRE SSL, intentos de conexión no cifrados deben fallar.
12 Mapa de decisión (Mermaid)
flowchart TD
A[¿MySQL soporta SSL nativo?] -->|Sí| B[Generar certificados en maestro]
A -->|No| C[¿Puede usar VPN/SSH?]
C -->|Sí| D[Configurar túnel/VPN]
C -->|No| E[Actualizar MySQL o usar soluciones de red]
B --> F[Configurar ssl-* en maestro y crear usuario REQUIRE SSL]
F --> G[Realizar mysqldump y transferir]
G --> H[Configurar ssl-* en esclavo y CHANGE MASTER TO MASTER_SSL]
H --> I[START SLAVE y verificar]
13 Plantilla de comandos (cheat sheet)
- Instalar:
yum install mysql mysql-devel mysql-server
- Habilitar servicio:
chkconfig --levels 235 mysqld on /etc/init.d/mysqld start
- Generar certificados (resumen):
openssl genrsa 2048 > ca-key.pem openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem > server-req.pem openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem > client-req.pem openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
- Volcado e importación:
mysqldump -u root -pyourrootsqlpassword --opt exampledb > snapshot.sql scp snapshot.sql [email protected]:/tmp mysql -u root -p exampledb < /tmp/snapshot.sql
- Configurar maestro->esclavo (ejemplo):
CHANGE MASTER TO MASTER_HOST='server1.example.com', MASTER_USER='slave_user', MASTER_PASSWORD='slave_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=3096416, MASTER_SSL=1, MASTER_SSL_CA='/etc/mysql/newcerts/ca-cert.pem', MASTER_SSL_CERT='/etc/mysql/newcerts/client-cert.pem', MASTER_SSL_KEY='/etc/mysql/newcerts/client-key.pem'; START SLAVE; SHOW SLAVE STATUS\G
14 Notas de seguridad y privacidad
- No transfiera ca-key.pem al esclavo ni a terceros; mantenga la CA privada segura.
- Asegure los permisos de los ficheros de clave privada con chmod 600.
- Considere rotación periódica de certificados y procedimientos de revocación si se compromete una clave.
15 Contras y casos en los que puede fallar esta aproximación
- Si su versión de MySQL es demasiado antigua y no soporta opciones MASTERSSL*, la configuración exacta puede variar. En ese caso use REQUIRE SSL en el usuario o una solución de red cifrada.
- Si la red entre maestro y esclavo atraviesa equipos que inspeccionan o terminan TLS, podrían bloquearse las conexiones.
- Replicación no reemplaza backups: errores humanos o corrupciones se replican.
16 Resumen final
La replicación de MySQL con SSL añade una capa importante de seguridad: evita que credenciales y binlogs en tránsito sean capturados. Los pasos clave son habilitar SSL en MySQL, generar una CA/servidor/cliente, transferir certificados necesarios, configurar el maestro y crear un usuario que requiera SSL, volcar e importar los datos, y configurar el esclavo para usar SSL en la conexión de replicación. Si la versión de MySQL limita opciones SSL, opte por túnel SSH o VPN.
Puntos clave:
- Asegúrese de anotar File y Position obtenidos con SHOW MASTER STATUS.
- Mantenga las claves privadas con permisos estrictos.
- Verifique el estado de replicación con SHOW SLAVE STATUS\G y pruebe con operaciones reales.
Fin del procedimiento.
Materiales similares

Easter eggs del Estadio en Warzone: guía completa

Configurar WiKID con OpenVPN AS

Matriz de trazabilidad: guía completa

Cómo configurar y aprovechar monitores múltiples

Instalar OpenLiteSpeed, MariaDB y PHP 7.4 en CentOS 8
