¿Cómo puedo saber si la replicación mysql se produce a través de SSL

4

Tenemos una replicación del servidor SQL en su lugar. Estoy tratando de asegurarme de que la replicación se produzca a través de canales seguros. Dado que eso MASTER_SSL_Allowedes cierto ("Sí"), ¿esto sugiere que las cosas viajan a través de SSL / TLS?

¿Cómo puedo estar seguro de que la conexión de replicación está encriptada? ¿Cómo puedo prohibir efectivamente el tráfico no cifrado entre el maestro y la replicación?

mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.10.100 Master_User: slave_user Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000192 Read_Master_Log_Pos: 37748817 Relay_Log_File: mysqld-relay-bin.000032 Relay_Log_Pos: 1244 Relay_Master_Log_File: mysql-bin.000092 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: omega Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 37748817 Relay_Log_Space: 124980 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: Yes Master_SSL_CA_File: /etc/mysql/certs/omega-ca-cert.pem Master_SSL_CA_Path: Master_SSL_Cert: /etc/mysql/certs/omega-client-cert.pem Master_SSL_Cipher: Master_SSL_Key: /etc/mysql/certs/omega-client-key.pem

Almiar
fuente

Respuestas:

2

hay dos cosas que puedes hacer

SUGERENCIA # 1: Verifique al Maestro

Asegúrese de que MySQL se inició en el maestro con líneas como estas en my.cnf

[mysqld]
ssl-ca=cacert.pem
ssl-cert=server-cert.pem
ssl-key=server-key.pem

Inicie sesión en el maestro y ejecute

SHOW GLOBAL VARIABLES LIKE '%ssl%';

Debería ver algo como esto:

+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_openssl  | DISABLED |
| have_ssl      | DISABLED |
| ssl_ca        | ...      |
| ssl_capath    | ...      |
| ssl_cert      | ...      |
| ssl_cipher    | ...      |
| ssl_key       | ...      |
+---------------+----------+

Si have_open_ssl y have_ssl están deshabilitados, mysqld en el Master no está usando SSL.

Lea la documentación de MySQL sobre ssl_ca , ssl_capath , ssl_cert , ssl_cipher y ssl_key sobre cómo usarlos. Evidentemente, si ninguno de ellos está configurado, incluso si have_open_ssl y have_ssl están habilitados, entonces mysqld en el Master no está utilizando SSL.

SUGERENCIA # 2: Verifique las subvenciones MySQL en el maestro

La conexión en sí misma debería estar usando opciones SSL. En la SHOW SLAVE STATUS\Gsalida, veo que tienes un usuario llamado slave_user. En el Maestro, ejecuta esto:

SELECT CONCAT('SHOW GRANTS FOR ',QUOTE(user),'@',QUOTE(host),';')
INTO @slaveusergrants FROM mysql.user WHERE user='slave_user';
PREPARE s FROM @slaveusergrants; EXECUTE s; DEALLOCATE PREPARE s;

En el resultado de esto, debería ver uno o más de los siguientes:

REQUIRE SSL
REQUIRE SUBJECT
REQUIRE X509
REQUIRE ISSUER
REQUIRE CIPHER

Si el usuario esclavo en el maestro tiene al menos una de estas cosas definidas en sus concesiones, el comando CAMBIAR MAESTRO A que ejecute en el esclavo debe coincidir con la configuración SSL en el maestro.

Para obtener más aclaraciones, lea Configuración de la replicación con SSL de la documentación de MySQL

SUGERENCIA # 3: Verifique la conexión en vivo

Debe usar tcpdump e inspeccionar el puerto 3306 . Si ve cosas en texto plano, SSL no está funcionando para usted. Si no lo hace, eso no significa que esté encriptado tampoco. Por qué ? De acuerdo con las Pautas de seguridad en la documentación de MySQL (consulte la parte inferior de la página) :

No transmita datos simples (sin cifrar) a través de Internet. Esta información es accesible para todos los que tienen el tiempo y la capacidad de interceptarla y usarla para sus propios fines. En su lugar, use un protocolo encriptado como SSL o SSH. MySQL admite conexiones SSL internas. Otra técnica es utilizar el reenvío de puertos SSH para crear un túnel cifrado (y comprimido) para la comunicación.

Aprenda a usar las utilidades tcpdump y strings. En la mayoría de los casos, puede verificar si las secuencias de datos MySQL no están encriptadas emitiendo un comando como el siguiente:

shell> tcpdump -l -i eth0 -w - puerto src o dst 3306 | cadenas Esto funciona en Linux y debería funcionar con pequeñas modificaciones en otros sistemas.

Advertencia Si no ve datos de texto sin formato, esto no siempre significa que la información esté realmente encriptada. Si necesita alta seguridad, consulte con un experto en seguridad.

RolandoMySQLDBA
fuente
1
1 por sugerir el uso de tcpdump, Wiresharko de otro analizador de paquetes de red. Esa es la mejor manera en que puedo pensar para demostrar que la replicación está ocurriendo a través de TLS en lugar de texto sin cifrar. La técnica de "verificar el maestro" aquí no es útil, porque solo muestra si el maestro puede soportar TLS, no si realmente se está utilizando. Del mismo modo, es posible que desee asegurarse de que TLS realmente esté funcionando antes de modificar los GRANTs para que el usuario requiera TLS.
Christopher Schultz