如何判断 mysql 复制是否通过 SSL 进行

Ric*_*ick 5 encryption mysql

我们有一个 SQL 服务器复制到位。我试图确保复制是通过安全通道进行的。鉴于这MASTER_SSL_Allowed是真的(“是”),这是否表明事情正在通过 SSL/TLS 传输?

如何确定复制连接已加密?如何有效禁止master 和 replication 之间的未加密流量?

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

Rol*_*DBA 6

你可以做两件事

建议#1:检查大师

确保 MySQL 是在 Master 上用这样的行启动的 my.cnf

[mysqld]
ssl-ca=cacert.pem
ssl-cert=server-cert.pem
ssl-key=server-key.pem
Run Code Online (Sandbox Code Playgroud)

登录到 Master,然后运行

SHOW GLOBAL VARIABLES LIKE '%ssl%';
Run Code Online (Sandbox Code Playgroud)

您应该会看到如下内容:

+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_openssl  | DISABLED |
| have_ssl      | DISABLED |
| ssl_ca        | ...      |
| ssl_capath    | ...      |
| ssl_cert      | ...      |
| ssl_cipher    | ...      |
| ssl_key       | ...      |
+---------------+----------+
Run Code Online (Sandbox Code Playgroud)

如果has_open_sslhave_ssl被禁用,那么 Master 上的 mysqld 没有使用 SSL。

请阅读有关ssl_cassl_capathssl_certssl_cipherssl_key的 MySQL 文档,了解如何使用它们。显然,如果它们都没有设置,即使启用了have_open_sslhave_ssl,那么 Master 上的 mysqld 也没有使用 SSL。

建议 #2:检查主服务器上的 MySQL 授权

连接本身应该使用 SSL 选项。在SHOW SLAVE STATUS\G输出中,我看到您有一个名为slave_user. 在 Master 上,请运行以下命令:

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;
Run Code Online (Sandbox Code Playgroud)

在此输出中,您应该看到以下一项或多项:

REQUIRE SSL
REQUIRE SUBJECT
REQUIRE X509
REQUIRE ISSUER
REQUIRE CIPHER
Run Code Online (Sandbox Code Playgroud)

如果 Master 上的 slave 用户在其授权中至少定义了这些内容之一,则您在 Slave 上运行的 CHANGE MASTER TO 命令需要匹配 Master 上的 SSL 设置。

有关更多说明,请阅读MySQL 文档中的使用 SSL 设置复制

建议 #3:检查实时连接

您应该使用tcpdump 并检查端口 3306。如果您看到纯文本内容,则 SSL 对您不起作用。如果你不这样做,那也不意味着它也被加密了。为什么 ?根据 MySQL 文档中的安全指南(请参阅页面底部)

不要通过 Internet 传输普通(未加密)数据。任何有时间和能力拦截它并将其用于自己目的的人都可以访问这些信息。相反,请使用加密协议,例如 SSL 或 SSH。MySQL 支持内部 SSL 连接。另一种技术是使用 SSH 端口转发为通信创建加密(和压缩)隧道。

学习使用 tcpdump 和 strings 实用程序。在大多数情况下,您可以通过发出如下命令来检查 MySQL 数据流是否未加密:

shell> tcpdump -l -i eth0 -w - src 或 dst 端口 3306 | 字符串 这在 Linux 下工作,并且在其他系统下应该进行小的修改。

警告 如果您没有看到明文数据,这并不总是意味着信息实际上是加密的。如果您需要高安全性,请咨询安全专家。