ProxySQL SSL 配置

后端 SSH 连接配置

从版本 v1.2.0e 开始,ProxySQL 支持对后端使用 SSL 连接。

重要提示:

    仅支持 v1.x 中的后端 SSL。在 v2.x 之前的版本中,客户端是无法使用 SSL 连接到 ProxySQL 的。
    从 v1.4.5 开始,由于 ProxySQL 使用了 mariadb-connector-c-2.3.1,所以只支持 SSL/TLSv1.0。
    在 ProxySQL v2.x 中,使用了 mariadb-connector-3.0.2,它支持 SSL/TLSv1.0、TLSv1.1 和 TLSv1.2。这些适用于前端和后端连接。

启用 SSL 的准备工作

若要启用 SSL 连接,需要做如下准备:

    对要启用 SSL 的服务器,更新其 mysqlservers.usessl 中的 SSL 值。

    更新关联的全局变量(仅在 ProxySQL v1.x 版本中需要,ProxySQL v2.x 不需要)

为服务器启用 SSL 设置

如果要使用 SSL 和非 SSL 都可以连接到同一服务器,则需要给同一个服务器配置不同的主机组,并定义访问规则。例如,要在一台服务器上配置 SSL:

mysql> SELECT * FROM mysql_servers;
+--------------+-----------+-------+--------+--------+-------------+-----------------+---------------------+---------+----------------+
| hostgroup_id | hostname  | port  | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms |
+--------------+-----------+-------+--------+--------+-------------+-----------------+---------------------+---------+----------------+
| 1            | 127.0.0.1 | 21891 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |
| 2            | 127.0.0.1 | 21892 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |
| 2            | 127.0.0.1 | 21893 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |
+--------------+-----------+-------+--------+--------+-------------+-----------------+---------------------+---------+----------------+
3 rows in set (0.00 sec)

mysql> UPDATE mysql_servers SET use_ssl=1 WHERE port=21891;
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM mysql_servers;
+--------------+-----------+-------+--------+--------+-------------+-----------------+---------------------+---------+----------------+
| hostgroup_id | hostname  | port  | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms |
+--------------+-----------+-------+--------+--------+-------------+-----------------+---------------------+---------+----------------+
| 1            | 127.0.0.1 | 21891 | ONLINE | 1      | 0           | 1000            | 0                   | 1       | 0              |
| 2            | 127.0.0.1 | 21892 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |
| 2            | 127.0.0.1 | 21893 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |
+--------------+-----------+-------+--------+--------+-------------+-----------------+---------------------+---------+----------------+
3 rows in set (0.00 sec)

mysql> LOAD MYSQL SERVERS TO RUNTIME;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM runtime_mysql_servers;
+--------------+-----------+-------+--------+--------+-------------+-----------------+---------------------+---------+----------------+
| hostgroup_id | hostname  | port  | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms |
+--------------+-----------+-------+--------+--------+-------------+-----------------+---------------------+---------+----------------+
| 1            | 127.0.0.1 | 21891 | ONLINE | 1      | 0           | 1000            | 0                   | 1       | 0              |
| 2            | 127.0.0.1 | 21892 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |
| 2            | 127.0.0.1 | 21893 | ONLINE | 1      | 0           | 1000            | 0                   | 0       | 0              |
+--------------+-----------+-------+--------+--------+-------------+-----------------+---------------------+---------+----------------+
3 rows in set (0.00 sec)

在此阶段,如果使用的是 ProxySQL v1.x,尝试连接 21891 端口,连接将不会使用 SSL,因为没有配置密钥和证书,相反会以正常的非 SSL 建立连接。 而在版本 ProxySQL v2.x,如果 use_ssl = 1,那么所有新连接都会使用 SSL(意味着使用 MySQL 的内置密钥/证书)。 为 SSL 连接配置密钥和证书

Admin> SELECT * FROM global_variables WHERE variable_name LIKE 'mysql%ssl%';
+--------------------+----------------+
| variable_name      | variable_value |
+--------------------+----------------+
| mysql-ssl_p2s_ca   | (null)         |
| mysql-ssl_p2s_cert | (null)         |
| mysql-ssl_p2s_key  | (null)         |
+--------------------+----------------+
3 rows in set (0.00 sec)

Admin> SET mysql-ssl_p2s_cert="/home/vagrant/newcerts/client-cert.pem";
Query OK, 1 row affected (0.00 sec)

Admin> SET mysql-ssl_p2s_key="/home/vagrant/newcerts/client-key.pem";
Query OK, 1 row affected (0.00 sec)

Admin> SELECT * FROM global_variables WHERE variable_name LIKE 'mysql%ssl%';
+--------------------+----------------------------------------+
| variable_name      | variable_value                         |
+--------------------+----------------------------------------+
| mysql-ssl_p2s_ca   | (null)                                 |
| mysql-ssl_p2s_cert | /home/vagrant/newcerts/client-cert.pem |
| mysql-ssl_p2s_key  | /home/vagrant/newcerts/client-key.pem  |
+--------------------+----------------------------------------+
3 rows in set (0.01 sec)

Admin> LOAD MYSQL VARIABLES TO RUNTIME;
Query OK, 0 rows affected (0.00 sec)

经过上面的配置后,所有与主机 127.0.0.1 的 21891 端口的新连接都将使用 SSL。

验证

要验证 SSL 在 ProxySQL 和 MySQL 之间是否正常工作,并检查连接到 ProxySQL 的 SSL CIPHER(SSL 密钥)是否正常,可以运行 SHOW SESSION STATUS LIKE \"Ssl_cipher\" 命令,例如:

mysql -h127.0.0.1 -P6033 -uroot -psecret -e 'SHOW SESSION STATUS LIKE "Ssl_cipher"'
+---------------+----------------------+
| Variable_name | Value                |
+---------------+----------------------+
| Ssl_cipher    | ECDHE-RSA-AES256-SHA |
+---------------+----------------------+

上面的显示表示已经生效

前端 SSH 连接配置

自 2.0 起就可用,尽管默认是禁用状态。

要为前端连接启用 SSL,需要启用 mysql-have_ssl = true。一旦启用此变量,ProxySQL 将自动在 datadir(/var/lib/proxysql)中生成以下文件:proxysql-ca.pemproxysql-cert.pemproxysql-key.pem

当然,也可以预定义这些文件。并且,变量更新后,需要执行 LOAD MYSQL VARIABLES TO RUNTIME,这样新的连接才会使用 SSL。

要验证 SSL 是否正常工作,同时检查 MySQL 客户端和 ProxySQL 之间使用的 SSL CIPHER(密钥)情况,可以连入 ProxySQL 并执行 \s 命令。例如:

mysql -h127.0.0.1 -P6033 -uroot -psecret -e's' | grep -P 'SSL|Connection'
SSL: Cipher in use is DHE-RSA-AES256-SHA
Connection: 127.0.0.1 via TCP/IP

支持如下协议: TLSv1 TLSv1.1 TLSv1.2

原来的 SSLv2 和 SSLv3 已在 2.0.6 版本中移除。 支持的密钥类型:

DHE-RSA-AES256-GCM-SHA384
DHE-RSA-AES256-SHA256
DHE-RSA-AES256-SHA
DHE-RSA-CAMELLIA256-SHA
AES256-GCM-SHA384
AES256-SHA256
AES256-SHA
CAMELLIA256-SHA
DHE-RSA-AES128-GCM-SHA256
DHE-RSA-AES128-SHA256
DHE-RSA-AES128-SHA
DHE-RSA-SEED-SHA
DHE-RSA-CAMELLIA128-SHA
AES128-GCM-SHA256
AES128-SHA256
AES128-SHA
SEED-SHA
CAMELLIA128-SHA
DES-CBC3-SHA

posted @ 2022-06-20 17:50  哈喽哈喽111111  阅读(349)  评论(0编辑  收藏  举报