配置 MySQL 使用加密连接
通过 MySQL 客户端和服务器之间的未加密连接,可以访问网络的人可以监视您的所有流量并检查客户端和服务器之间发送或接收的数据。
当您必须以安全的方式通过网络移动信息时,未加密的连接是不可接受的。要使任何类型的数据不可读,请使用加密。加密算法必须包含安全元素以抵御多种已知攻击,例如更改加密消息的顺序或重放数据两次。
MySQL 使用 TLS(传输层安全)协议支持客户端和服务器之间的加密连接。TLS 有时被称为 SSL(安全套接字层),但 MySQL 实际上并不使用 SSL 协议进行加密连接,因为它的加密很弱。
TLS 使用加密算法来确保通过公共网络接收的数据是可信的。它具有检测数据更改、丢失或重放的机制。TLS 还包含使用 X.509 标准提供身份验证的算法。
X.509 使得在 Internet 上识别某人成为可能。基本上,应该有一个称为“证书颁发机构”(或 CA)的实体,可以将电子证书分配给需要它们的任何人。证书依赖于具有两个加密密钥(一个公钥和一个秘密密钥)的非对称加密算法。证书所有者可以将证书出示给另一方作为身份证明。证书由其所有者的公钥组成。使用此公钥加密的任何数据只能使用相应的私钥进行解密,该私钥由证书所有者持有。
默认情况下,如果服务器支持加密连接,MySQL 程序会尝试使用加密进行连接,如果无法建立加密连接,则回退到未加密的连接。
加密连接的服务器端启动配置
在服务器端,该–ssl 选项指定服务器允许但不需要加密连接。此选项默认启用,因此无需明确指定。
要要求客户端使用加密连接进行连接,请启用 require_secure_transport系统变量。
服务器端的这些系统变量指定了服务器在允许客户端建立加密连接时使用的证书和密钥文件:
-
ssl_ca:证书颁发机构 (CA) 证书文件的路径名。(ssl_capath类似,但指定 CA 证书文件目录的路径名。)
-
ssl_cert:服务器公钥证书文件的路径名。可以将此证书发送到客户端并根据其拥有的 CA 证书进行身份验证。
-
ssl_key:服务器私钥文件的路径名。
例如,要为加密连接启用服务器,请使用my.cnf 文件中的这些行启动它,并根据需要更改文件名:
[mysqld]
ssl_ca=ca.pem
ssl_cert=server-cert.pem
ssl_key=server-key.pem
要另外指定客户端需要使用加密连接,请启用 require_secure_transport系统变量:
[mysqld]
ssl_ca=ca.pem
ssl_cert=server-cert.pem
ssl_key=server-key.pem
require_secure_transport=ON
加密连接的客户端配置
有关与建立加密连接相关的客户端选项的完整列表,请参阅加密连接的 命令选项。
默认情况下,如果服务器支持加密连接,MySQL 客户端程序会尝试建立加密连接,并通过–ssl-mode选项进一步控制 :
-
在没有–ssl-mode选项的情况下 ,客户端尝试使用加密进行连接,如果无法建立加密连接,则回退到未加密的连接。这也是具有显式–ssl-mode=PREFFERED选项的行为 。
-
使用–ssl-mode=REQUIRED,客户端需要加密连接,如果无法建立连接则失败。
-
使用–ssl-mode=DISABLED,客户端使用未加密的连接。
-
使用–ssl-mode=VERIFY_CA或 --ssl-mode=VERIFY_IDENTITY,客户端需要加密连接,并且还针对服务器 CA 证书和(使用 VERIFY_IDENTITY)针对其证书中的服务器主机名执行验证。
如果在require_secure_transport服务器端启用系统变量导致服务器需要加密连接,则尝试建立未加密的连接会失败 。请参阅将 加密连接配置为必需。
客户端的以下选项标识客户端在与服务器建立加密连接时使用的证书和密钥文件。他们是类似 ssl_ca, ssl_cert以及 ssl_key在服务器端使用的系统变量,但 --ssl-cert并 --ssl-key识别客户端公钥和私钥:
-
–ssl-ca:证书颁发机构 (CA) 证书文件的路径名。如果使用此选项,则必须指定服务器使用的相同证书。(–ssl-capath类似,但指定 CA 证书文件目录的路径名。)
-
–ssl-cert:客户端公钥证书文件的路径名。
-
–ssl-key:客户端私钥文件的路径名。
-
注意:
主机名身份验证 VERIFY_IDENTITY不适用于由服务器自动创建或使用mysql_ssl_rsa_setup手动创建的自签名证书。此类自签名证书不包含服务器名称作为 Common Name 值。
假设您要使用没有特殊加密要求的帐户或使用CREATE USER包含该REQUIRE SSL子句的语句创建的帐户进行连接 。假设服务器支持加密连接,客户端可以使用无–ssl-mode选项或显式–ssl-mode=PREFFERED 选项的加密进行连接 :
mysql
或者:
mysql --ssl-mode=PREFERRED
对于使用REQUIRE SSL 子句创建的帐户,如果无法建立加密连接,则连接尝试失败。对于没有特殊加密要求的帐户,如果无法建立加密连接,则尝试回退到未加密连接。如果无法获得加密连接,则为防止回退和失败,请按如下方式连接:
mysql --ssl-mode=REQUIRED
如果账户有更严格的安全要求,则必须指定其他选项来建立加密连接:
对于使用REQUIRE X509 子句创建的帐户,客户必须至少指定 --ssl-cert和 --ssl-key。此外, 建议使用–ssl-ca(或 --ssl-capath),以便验证服务器提供的公共证书。例如(在一行中输入命令):
mysql --ssl-ca=ca.pem
--ssl-cert=client-cert.pem
--ssl-key=client-key.pem
对于使用REQUIRE ISSUERorREQUIRE SUBJECT 子句创建的帐户,加密要求与 for 相同 REQUIRE X509,但证书必须分别与帐户定义中指定的问题或主题相匹配。
要防止使用加密并覆盖其他 选项,请使用以下命令调用客户端程序 : --ssl-xxx–ssl-mode=DISABLED
mysql --ssl-mode=DISABLED
要确定当前与服务器的连接是否使用加密,请检查Ssl_cipher状态变量的会话值 。如果该值为空,则连接未加密。否则,连接被加密并且该值指示加密密码。例如:
mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher';
+---------------+---------------------------+
| Variable_name | Value |
+---------------+---------------------------+
| Ssl_cipher | DHE-RSA-AES128-GCM-SHA256 |
+---------------+---------------------------+
对于mysql客户端,另一种方法是使用STATUSor\s 命令并检查该SSL行:
mysql> \s
...
SSL: Not in use
...
或者:
mysql> \s
...
SSL: Cipher in use is DHE-RSA-AES128-GCM-SHA256
...
将加密连接配置为必需
对于某些 MySQL 部署,使用加密连接不仅是可取的,而且是强制性的(例如,为了满足监管要求)。本节讨论使您能够执行此操作的配置设置。这些控制级别可用:
您可以将服务器配置为要求客户端使用加密连接进行连接。
您可以调用单个客户端程序来要求加密连接,即使服务器允许但不需要加密。
您可以将单个 MySQL 帐户配置为仅可通过加密连接使用。
要要求客户端使用加密连接进行连接,请启用 require_secure_transport系统变量。例如,将这些行放在服务器 my.cnf文件中:
[mysqld]
require_secure_transport=ON
与require_secure_transport 启用,到服务器的客户端连接都需要使用某种形式的安全传输,而服务器只允许TCP / IP连接,使用SSL,或使用一个套接字文件(在Unix)连接或共享内存(在Windows上)。服务器拒绝非安全连接尝试,这些尝试失败并显示 ER_SECURE_TRANSPORT_REQUIRED 错误。
调用的客户端程序,使得它需要加密的连接的服务器是否需要加密,使用 --ssl-mode的选项值 REQUIRED,VERIFY_CA或 VERIFY_IDENTITY。例如:
mysql --ssl-mode=REQUIRED
mysqldump --ssl-mode=VERIFY_CA
mysqladmin --ssl-mode=VERIFY_IDENTITY
要将 MySQL 帐户配置为仅可通过加密连接使用,请在CREATE USER创建帐户的语句中包含一个REQUIRE子句 ,在该子句中指定您需要的加密特性。例如,要要求加密连接并使用有效的 X.509 证书,请使用REQUIRE X509:
CREATE USER 'jeffrey'@'localhost' REQUIRE X509;
参考
https://dev.mysql.com/doc/refman/5.7/en/using-encrypted-connections.html