Como posso saber se a replicação do mysql está ocorrendo sobre SSL

4

Temos uma replicação do servidor SQL em vigor. Eu estou tentando garantir que a replicação está ocorrendo através de canais seguros. Considerando que MASTER_SSL_Allowed é verdadeiro ("Sim"), isso sugere que as coisas estão passando por SSL / TLS?

Como posso ter certeza de que a conexão de replicação está criptografada? Como posso efetivamente proibir o tráfego não criptografado entre o mestre e a replicação?

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

    
por Rick 03.10.2014 / 16:20

1 resposta

2

Existem duas coisas que você pode fazer

SUGESTÃO # 1: Verifique o Mestre

Certifique-se de que o MySQL foi iniciado no mestre com linhas como estas em my.cnf

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

Faça login no mestre e execute

SHOW GLOBAL VARIABLES LIKE '%ssl%';

Você deve ver algo assim:

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

Se have_open_ssl e have_ssl estão desabilitados, então o mysqld no Mestre não está usando SSL.

Por favor, leia a documentação do MySQL em ssl_ca , < href="http://dev.mysql.com/doc/refman/5.6/en/ssl-options.html#option_general_ssl-capath"> ssl_capath , ssl_cert , ssl_cipher e ssl_key sobre como usá-los. Evidentemente, se nenhum deles estiver definido, mesmo se have_open_ssl e have_ssl estão habilitados, então o mysqld no Master não é usando SSL.

SUGESTÃO # 2: Verifique os subsídios do MySQL no mestre

A conexão em si deve estar usando opções SSL. Na saída SHOW SLAVE STATUS\G , vejo que você tem um usuário chamado slave_user . No mestre, por favor, execute isto:

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;

Na saída disso, você deve ver um ou mais dos seguintes itens:

REQUIRE SSL
REQUIRE SUBJECT
REQUIRE X509
REQUIRE ISSUER
REQUIRE CIPHER

Se o usuário escravo no mestre tiver pelo menos uma dessas coisas definidas em suas concessões, o comando CHANGE MASTER TO que você executa no Escravo precisa corresponder às configurações de SSL no mestre.

Para mais esclarecimentos, leia Como configurar a replicação usando o SSL da documentação do MySQL

SUGESTÃO # 3: Verifique a conexão ao vivo

Você deve usar o tcpdump e inspecionar a porta 3306 . Se você ver coisas em texto simples, o SSL não está funcionando para você. Se você não fizer isso, isso não significa que ele também esteja criptografado. Por quê ? De acordo com as diretrizes de segurança da documentação do MySQL (veja a parte inferior da página) :

Do not transmit plain (unencrypted) data over the Internet. This information is accessible to everyone who has the time and ability to intercept it and use it for their own purposes. Instead, use an encrypted protocol such as SSL or SSH. MySQL supports internal SSL connections. Another technique is to use SSH port-forwarding to create an encrypted (and compressed) tunnel for the communication.

Learn to use the tcpdump and strings utilities. In most cases, you can check whether MySQL data streams are unencrypted by issuing a command like the following:

shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings This works under Linux and should work with small modifications under other systems.

Warning If you do not see cleartext data, this does not always mean that the information actually is encrypted. If you need high security, consult with a security expert.

    
por 06.10.2014 / 22:11