MySQL 8.0 安全部署指南  /  第 12 章配置 MySQL 以使用安全连接

第 12 章配置 MySQL 以使用安全连接

本节介绍为安全连接配置服务器以及分发客户端证书和密钥文件。

为安全连接配置服务器

  1. MySQL 需要证书和密钥文件来启用安全连接。默认情况下,使用 OpenSSL 编译的 MySQL 服务器会在启动时在数据目录中生成这些文件(如果它们不存在)。(MySQL企业版是使用OpenSSL编译的。)唯一的要求是启用该 --ssl选项,默认情况下是启用的,并且没有 指定其他选项。 --ssl-*

    1. 检查 MySQL 安装的数据目录以验证是否生成了服务器和客户端证书和密钥文件:

      $> cd /usr/local/mysql/data
      $> ls *.pem
      ca-key.pem  client-cert.pem  private_key.pem  server-cert.pem
      ca.pem      client-key.pem   public_key.pem   server-key.pem
      重要的

      MySQL 生成证书文件有助于降低使用 TLS 的门槛。但是,这些证书是自签名的,不是很安全。在获得使用 MySQL 生成的文件的经验后,请考虑从注册的证书颁发机构获取 CA 证书。

    2. 这些选项标识服务器在建立安全连接时使用的证书和密钥文件:

      • ssl-ca=ca.pem

        标识证书颁发机构 (CA) 证书。

      • ssl-cert=server-cert.pem

        标识服务器公钥证书。

      • ssl-key=server-key.pem

        标识服务器私钥。

      要显式配置这些选项,请将它们添加到[mysqld]MySQL 配置文件 ( /etc/my.cnf) 中的选项组下:

      ssl_ca=ca.pem
      ssl_cert=server-cert.pem
      ssl_key=server-key.pem
  2. 默认情况下,MySQL 服务器在所有服务器主机 IPv6 和 IPv4 接口上接受来自 MySQL 用户帐户的 TCP/IP 连接。bind_address 您可以通过将配置选项设置为特定的 IPv4 或 IPv6 地址 来使此配置更具限制性,以便服务器仅接受该地址上的 TCP/IP 连接。

    例如,要让 MySQL 服务器仅接受特定 IPv4 地址上的连接,请[mysqld]在 MySQL 配置文件 ( /etc/my.cnf) 的选项组下添加一个类似于此的条目:

    bind_address=192.0.2.24

    在这种情况下,客户端可以使用 --host=192.0.2.24. 不允许连接到其他服务器主机地址。

    有关 bind_address配置的更多信息,请参阅服务器命令选项

  3. tls_version选项定义了服务器允许的用于加密连接的协议。为确保客户端使用 TLSv1.3 连接到服务器,TLSv1.3 提供比早期 TLS 版本更高的安全性,请设置 tls_version为 TLSv1.3。当使用 OpenSSL 1.1.1 或更高版本编译时,MySQL 支持 TLSv1、TLSv1.1、TLSv1.2 和 TLSv1.3 协议。

    tls_version=TLSv1.3

    使用此设置,只有支持 TLSv1.3 的客户端才能与服务器建立加密连接。对于使用 OpenSSL 1.1.1 或更高版本编译的 MySQL 服务器和客户端,从 MySQL 8.0.16 开始支持 TLSv1.3 协议。

  4. 要进一步加强您的部署,您可以使用该 tls_ciphersuites变量来限制服务器允许使用 TLSv1.3 的加密连接的密码套件。例如,要允许单个密码套件,请[mysqld]在 MySQL 配置文件 ( /etc/my.cnf) 的选项组下添加一个类似于此的条目:

    tls_ciphersuites=TLS_AES_128_GCM_SHA256

    要指定多个密码套件,请用冒号分隔密码套件名称。

    您可以通过与服务器建立加密连接并发出以下语句来检查 Ssl_cipher_list状态变量的值来确定给定服务器支持哪些密码套件:

    mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher_list'\G

    对于使用 TLSv1.3 的加密连接,OpenSSL 1.1.1 及更高版本支持以下密码套件,其中前三个默认启用:

    TLS_AES_128_GCM_SHA256
    TLS_AES_256_GCM_SHA384
    TLS_CHACHA20_POLY1305_SHA256
    TLS_AES_128_CCM_SHA256
    TLS_AES_128_CCM_8_SHA256
    笔记

    MySQL 8.0.16 中添加了 Ciphersuite 支持,用于使用 TLSv1.3 的加密连接。如果您使用 TLSv1.2 或更低版本,请使用 --ssl-cipher选项来配置特定的密码,而不是使用 tls_ciphersuites.

    或者,您可以使用该 --tls-ciphersuites选项来限制客户端程序允许使用 TLSv1.3 的加密连接的密码套件。

    有关密码和密码套件的更多信息,请参阅 加密连接 TLS 协议和密码

  5. 或者,要要求所有客户端安全地连接到服务器,您可以启用该 require_secure_transport 选项。启用此选项后,服务器仅允许使用 TLS 或使用套接字文件(在 Unix 上)或共享内存(在 Windows 上)的 TCP/IP 连接。禁止使用不安全传输的连接,包括使用基于 RSA 密钥对的密码交换的未加密连接。

    此部署中未使用该 require_secure_transport 选项,因此可以演示通过未加密连接进行的基于 RSA 密钥对的密码交换。(请参阅 在未加密的连接上使用基于 RSA 密钥对的密码交换。)

    笔记

    启用 require_secure_transport 可防止不使用 TLS 的 TCP/IP 连接。由于相关的网络和 CPU 成本,要求所有 TCP/IP 连接使用 TLS 可能会影响性能。

  6. 重新启动服务器以应用配置更改:

    $> systemctl restart mysqld

分发客户端证书和密钥文件

默认情况下,客户端证书和密钥文件创建在 MySQL 数据目录中。数据目录的权限只允许访问mysql运行 MySQL 服务器的帐户,因此客户端程序不能使用位于那里的文件。要使文件对客户端可用,请将文件分发到客户端主机或将它们放在客户端可访问的已安装分区上。这些文件应位于客户端可读(但不可写)的目录中。分发文件时使用安全通道,以确保它们在传输过程中不被篡改。

要分发的客户端证书和密钥文件包括:

  • ca.pem(CA 证书)

  • client-cert.pem(客户端证书)

  • client-key.pem(客户端私钥)

ca.pem和 文件稍后用于建立与服务器的加密连接 client-cert.pemclient-key.pem

或者,也可以分发 RSA 公钥文件 ( public_key.pem)。对于使用插件进行身份验证的 OpenSSL 编译的 mysqlsha256_password客户端,此文件用于通过未加密的连接与服务器进行基于 RSA 密钥对的密码交换。

稍后连接到服务器时需要客户端主机或安装分区上的文件位置。