4

У нас есть репликация SQL-сервера. Я пытаюсь убедиться, что репликация происходит по защищенным каналам. Учитывая, что MASTER_SSL_Allowed имеет значение true ("Да"), означает ли это, что все идет по SSL/TLS?

Как я могу быть уверен, что соединение репликации зашифровано? Как я могу эффективно запретить незашифрованный трафик между мастером и репликацией?

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

1 ответ1

2

Есть две вещи, которые вы можете сделать

ПРЕДЛОЖЕНИЕ № 1: Проверьте мастера

Убедитесь, что MySQL был запущен на Master с такими строками в my.cnf

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

Войдите в Мастер и запустите

SHOW GLOBAL VARIABLES LIKE '%ssl%';

Вы должны увидеть что-то вроде этого:

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

Если have_open_ssl и have_ssl отключены, то mysqld на Master не использует SSL.

Пожалуйста, прочтите документацию MySQL по ssl_ca, ssl_capath, ssl_cert, ssl_cipher и ssl_key, как их использовать. Очевидно, что если ни один из них не установлен, даже если включены have_open_ssl и have_ssl, mysqld на Master не использует SSL.

ПРЕДЛОЖЕНИЕ № 2: Проверьте MySQL Гранты на Мастер

Само соединение должно использовать параметры SSL. В выводе SHOW SLAVE STATUS\G я вижу, что у вас есть пользователь с именем slave_user . На Мастере, пожалуйста, запустите это:

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;

В выводе этого вы должны увидеть одно или несколько из следующего:

REQUIRE SSL
REQUIRE SUBJECT
REQUIRE X509
REQUIRE ISSUER
REQUIRE CIPHER

Если подчиненный пользователь на Master имеет хотя бы одну из этих вещей, определенных в его разрешениях, команда CHANGE MASTER TO, которую вы запускаете на Slave, должна соответствовать настройкам SSL на Master.

Для получения дополнительной информации, пожалуйста, прочитайте Настройка репликации с использованием SSL из документации MySQL.

ПРЕДЛОЖЕНИЕ № 3: Проверьте соединение в реальном времени

Вы должны использовать tcpdump и проверить порт 3306. Если вы видите вещи в виде простого текста, SSL не работает для вас. Если вы этого не сделаете, это не значит, что он также зашифрован. Зачем ? В соответствии с рекомендациями по безопасности в документации MySQL (см. Внизу страницы):

Не передавайте простые (незашифрованные) данные через Интернет. Эта информация доступна каждому, у кого есть время и возможность перехватить ее и использовать в своих целях. Вместо этого используйте зашифрованный протокол, такой как SSL или SSH. MySQL поддерживает внутренние SSL-соединения. Другой метод заключается в использовании переадресации портов SSH для создания зашифрованного (и сжатого) туннеля для связи.

Научитесь использовать утилиты tcpdump и strings. В большинстве случаев вы можете проверить, не зашифрованы ли потоки данных MySQL, выполнив следующую команду:

shell> tcpdump -l -i eth0 -w - порт src или dst 3306 | strings Это работает под Linux и должно работать с небольшими модификациями под другими системами.

Предупреждение Если вы не видите данные в виде открытого текста, это не всегда означает, что информация фактически зашифрована. Если вам нужен высокий уровень безопасности, проконсультируйтесь с экспертом по безопасности.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .