MySQL 5.7 安全部署指南  /  第 14 章连接到服务器

第 14 章连接到服务器

本节介绍两种连接方法。第一种方法使用 TLS(传输层安全)协议建立加密连接。第二种方法通过未加密的连接使用基于 RSA 密钥对的密码交换。

以下过程假定mysql 客户端在远程客户端主机上可用。这些过程还假设您已将客户端证书和密钥文件分发到远程客户端,如 分发客户端证书和密钥文件中所述。

先前创建的用户帐户用于连接到服务器。请参阅第 13 章,创建用户帐户

使用加密连接

如果服务器支持加密连接,则 MySQL 客户端程序会尝试建立加密连接。在此部署中,--ssl为服务器启用了该选项,这意味着支持加密连接。

  1. 使用mysql客户端程序,为user1@203.0.113.11 您之前创建的帐户建立连接。该 user1@203.0.113.11帐户是使用该 REQUIRE X509选项创建的,该选项要求用户出示有效证书。

    $> cd /usr/local/mysql
    $> bin/mysql  --user=user1 -p --host=192.0.2.24 --ssl-mode=VERIFY_CA
           --ssl-ca=/path/to/ca.pem --ssl-cert=/path/to/client-cert.pem
           --ssl-key=/path/to/client-key.pem
    • --host选项指定运行 MySQL 服务器的主机。

    • --ssl-mode=VERIFY_CA 选项确保建立加密连接并根据配置的证书颁发机构 (CA) 证书验证 TLS 证书;它确保客户端和服务器信任一个共同的 CA,因此很可能与正确的一方进行通信。

      笔记

      理想情况下,--ssl-mode 应设置为VERIFY_IDENTITY。此选项类似VERIFY_CA,但它另外要求服务器证书与尝试连接的主机相匹配,这意味着服务器证书必须由有效的证书颁发机构 (CA) 签名,并将您的服务器主机作为通用名称 (CN ). 此部署中使用的 MySQL 生成的证书不支持此模式。

    • 、和 选项定义分发的客户端证书和密钥文件的路径,如分发客户端证书和密钥文件 --ssl-ca所述--ssl-cert--ssl-key

  2. Ssl_cipher连接成功后,通过检查状态变量 的值来验证当前连接是否使用了加密 。如果该值为空,则连接未加密。否则,连接被加密并且该值指示加密密码。例如:

    mysql> SHOW STATUS LIKE 'Ssl_cipher';
    +---------------+---------------------------+
    | Variable_name | Value                     |
    +---------------+---------------------------+
    | Ssl_cipher    | DHE-RSA-AES128-GCM-SHA256 |
    +---------------+---------------------------+
  3. 要查看所有连接的 TLS 版本和密码,请以 MySQL root 用户身份 查询Sys模式 视图:session_ssl_status

    $> cd /usr/local/mysql 
    $> bin/mysql -u root -p
    Enter password: (enter the root password here)
    mysql> SELECT * FROM sys.session_ssl_status;
    +-----------+-------------+---------------------------+---------------------+
    | thread_id | ssl_version | ssl_cipher                | ssl_sessions_reused |
    +-----------+-------------+---------------------------+---------------------+
    |        51 |             |                           | 0                   |
    |        52 | TLSv1.2     | DHE-RSA-AES128-GCM-SHA256 | 0                   |
    +-----------+-------------+---------------------------+---------------------+

有关加密连接的更多信息,请参阅 配置 MySQL 以使用加密连接

在未加密的连接上使用基于 RSA 密钥对的密码交换

对于使用 OpenSSL 编译的 MySQL 版本,使用插件进行身份验证的客户端sha256_password可以使用基于 RSA 密钥对的密码交换通过未加密的连接连接到服务器。(客户端和服务器都必须使用 OpenSSL 进行编译。)

为了支持RSA加密,服务端在数据目录下生成RSA公私钥文件:

$> cd /usr/local/mysql/data
$> ls *_key.pem
private_key.pem  public_key.pem

默认情况下,服务器还公开用于定义 RSA 私钥和公钥路径的变量:

如果 RSA 公钥和私钥文件位于 MySQL 数据目录中并命名为 private_key.pemand public_key.pem,因为它们在此部署中, 默认情况下会配置sha256_password_private_key_path and sha256_password_public_key_path 选项。

当使用sha256_passsword 插件的客户端尝试未加密的连接时, 插件会向客户端发送 RSA 公钥,但如果将 RSA 公钥分发给客户端主机并且使用when 选项sha256_passsword定义其位置,则可以避免密钥传输 --server-public-key-path建立连接。避免密钥传输可以节省客户端/服务器协议中的往返行程。该选项在随后的说明中使用。有关分发密钥文件的信息,请参阅 分发客户端证书和密钥文件

要建立使用基于 RSA 密钥对的密码交换的未加密连接,请使用mysql 客户端程序和user2@203.0.113.12 您之前创建的帐户。该 user2@203.0.113.12帐户是在没有 SSL/TLS 选项的情况下创建的,以允许该帐户与服务器建立未加密的连接。

$> cd /usr/local/mysql
$> bin/mysql  --user=user2 -p --ssl-mode=DISABLED --host=192.0.2.24
       --server-public-key-path=/path/to/public_key.pem
  • --host选项指定运行 MySQL 服务器的主机。

  • --ssl-mode=DISABLE 选项确保连接未加密。

  • --server-public-key-path 选项定义了客户端主机 ( public_key.pem) 上包含服务器使用的相同 RSA 公钥的文件的路径名。