MySQL的安全性/使用加密连接/加密连接TLS协议和密码

5.2加密连接TLS协议和密码

MySQL支持多种TLS协议和密码,并支持配置允许加密连接的协议和密码。还可以确定当前会话使用的协议和密码。

支持的连接TLS协议

MySQL支持使用TLSv1、TLSv1.1、TLSv1.2和TLSv1.3协议的加密连接,按安全性从低到高排列。实际允许连接的协议集受多个因素的影响:

  • MySQL配置。允许的TLS协议可以在服务器端和客户端配置,只包括支持的TLS协议的一个子集。双方的配置必须包括至少一个共同的协议,否则连接尝试不能协商使用的协议。详情请参见TLS协议协商

  • 全系统主机配置。主机系统可能只允许某些TLS协议,这意味着MySQL连接不能使用不允许的协议,即使MySQL本身允许它们:

    • 假设MySQL配置允许TLSv1、TLSv1.1和TLSv1.2,但是您的主机系统配置只允许使用TLSv1.2或更高版本的连接。在这种情况下,您不能建立使用TLSv1或TLSv1.1的MySQL连接,即使MySQL配置为允许,因为主机系统不允许。

    • 如果MySQL配置允许TLSv1、TLSv1.1和TLSv1.2,但是您的主机系统配置只允许使用TLSv1.3或更高版本的连接,那么您就完全不能建立MySQL连接,因为MySQL允许的任何协议都不允许主机系统使用。

    解决此问题的方法包括:

    • 更改系统范围的主机配置以允许附加TLS协议。有关说明,请参阅您的操作系统文档。10bet官方网站例如,您的系统可能有一个/etc/ssl/openssl.cnf包含这些行来限制TLS协议为TLSv1.2或更高:

      [system_default_section] MinProtocol = TLSv1.2

      将值更改为较低的协议版本或没有一个使系统更加宽松。这种解决方法的缺点是允许较低(不太安全)的协议可能会产生不利的安全后果。

    • 如果您不能或不愿意更改主机系统TLS配置,请更改MySQL应用程序以使用主机系统允许的更高(更安全)的TLS协议。对于只支持较低协议版本的MySQL旧版本,这可能是不可能的。例如,TLSv1是MySQL 5.6.46之前唯一支持的协议,因此,即使客户端来自支持更高协议版本的MySQL新版本,连接到5.6.46之前的服务器也会失败。在这种情况下,可能需要升级到支持其他TLS版本的MySQL版本。

  • SSL库。如果SSL库不支持特定的协议,那么MySQL也不支持,下面的讨论中指定该协议的任何部分都不适用。

    请注意

    对TLSv1.3协议的支持在MySQL 8.0.16(从Group Replication组件的MySQL 8.0.18开始)中可用。此外,要使用TLSv1.3, MySQL服务器和客户端应用程序都必须使用OpenSSL 1.1.1或更高版本编译。

TLS协议配置

的值tls_version系统变量决定MySQL服务器允许哪种TLS协议加密连接。的tls_version值适用于来自客户机的连接、此服务器实例为源的常规源/复制复制连接、Group replication组通信连接以及此服务器实例为提供者的Group replication分布式恢复连接。管理连接接口的配置与此类似,但是使用admin_tls_version系统变量(见管理连接管理).这个讨论适用于admin_tls_version

tls_versionvalue是列表中一个或多个以逗号分隔的协议版本的列表(不区分大小写):TLSv1, TLSv1.1, TLSv1.2,和(如果可用)TLSV1.3。默认情况下,该变量列出用于编译MySQL的SSL库支持的所有协议。确定…的值tls_version在运行时,使用以下语句:

查询全局变量:tls_version+---------------+-----------------------+ | Variable_name |值  | +---------------+-----------------------+ | tls_version | TLSv1、TLSv1.1 TLSv1.2  | +---------------+-----------------------+

改变…的值tls_version,在服务器启动时设置它。例如,如果允许使用TLSv1.1或TLSv1.2协议的连接,但禁止使用安全性较低的TLSv1协议的连接,则在服务器中使用这些行my.cnf文件:

(mysqld) tls_version = TLSv1.1 TLSv1.2

如果要更加严格,只允许TLSv1.2连接,请设置tls_version是这样的:

(mysqld) tls_version = TLSv1.2

从MySQL 8.0.16开始,tls_version也可以在运行时更改。看到加密连接的服务器端运行时配置和监视

请注意

从MySQL 8.0.26开始,TLSv1和TLSv1.1连接协议已被弃用,在MySQL的未来版本中可能会删除对它们的支持。看到弃用的TLS协议

在客户端——tls版本option指定客户端程序允许连接到服务器的TLS协议。选项值的格式与tls_version前面描述的系统变量(一个或多个以逗号分隔的协议版本的列表)。

对于此服务器实例为副本的源/副本复制连接,则SOURCE_TLS_VERSION|MASTER_TLS_VERSION选项。将复制源更改为语句(从MySQL 8.0.23)或将master更改为语句(在MySQL 8.0.23之前)指定副本允许连接到源的TLS协议。选项值的格式与tls_version前面描述的系统变量。看到设置复制以使用加密连接

可以指定的协议SOURCE_TLS_VERSION|MASTER_TLS_VERSION依赖于SSL库。此选项与服务器无关,也不受服务器的影响tls_version价值。例如,可以配置作为副本的服务器tls_version设置为TLSv1.3,只允许使用TLSv1.3的传入连接,但也配置了SOURCE_TLS_VERSION|MASTER_TLS_VERSION设置为TLSv1.2,只允许TLSv1.2的副本连接到源端。

对于组复制分布式恢复连接,其中此服务器实例是发起分布式恢复的加入成员(即客户机)group_replication_recovery_tls_version系统变量指定客户端允许哪些协议。此选项与服务器无关,也不受服务器的影响tls_version值,当此服务器实例是提供者时应用该值。Group Replication服务器在其组成员关系的过程中,通常同时作为提供者和加入成员参与分布式恢复,因此应该设置这两个系统变量。看到使用安全套接字层(SSL)保护组通信连接

TLS协议配置会影响给定连接使用的协议,详见TLS协议协商

应该选择允许的协议,比如不离开在列表中。例如,这些服务器配置值没有洞:

tls_version=TLSv1,TLSv1.1,TLSv1.2,TLSv1.3 tls_version=TLSv1.1,TLSv1.2,TLSv1.3 tls_version=TLSv1.2,TLSv1.3

这些值确实有漏洞,不应该使用:

tls_version = TLSv1 TLSv1.2(TLSv1.1缺失)tls_version = TLSv1.1 TLSv1.3(TLSv1.2缺失)

对漏洞的禁止也适用于其他配置上下文中,例如客户机或副本。

除非打算禁用加密连接,否则允许的协议列表不应为空。如果将TLS版本参数设置为空字符串,则无法建立加密连接:

弃用的TLS协议

从MySQL 8.0.26开始,TLSv1和TLSv1.1连接协议已被弃用,在未来的MySQL版本中可能会删除对它们的支持。(关于背景,请参考IETF备忘录弃用TLSv1.0和TLSv1.1)。建议使用更安全的TLSv1.2和TLSv1.3协议进行连接。TLSv1.3要求MySQL服务器和客户端应用程序都使用OpenSSL 1.1.1或更高版本编译。

在服务器端,这种弃用有以下影响:

  • 如果tls_versionadmin_tls_version系统变量在服务器启动时被分配一个包含已弃用TLS协议的值,服务器会对每个已弃用的TLS协议产生一个警告:

    • 如果在服务器启动期间发生分配,则在错误日志中显示警告。

    • 如果在运行时发生赋值,则将警告添加到执行更改实例重新加载TLS声明。

  • 如果客户端使用已弃用的TLS协议成功连接,服务器将向错误日志中写入警告。

在客户端,弃用没有明显的影响。如果配置为允许已弃用的TLS协议,则客户端不会发出警告。这包括:

连接密码配置

默认密码集应用于加密连接,可以通过显式配置允许的密码来覆盖该密码集。在建立连接的过程中,连接的双方必须允许某种通用密码,否则连接将失败。在允许的双方通用的密码中,SSL库选择提供的证书所支持的具有最高优先级的密码。

指定一个或多个密码,适用于使用TLSv1.2以下TLS协议的加密连接。

对于使用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

要显式配置允许的TLSv1.3加密套件,请设置以下参数。在每种情况下,配置值都是一个由零个或多个冒号分隔的密码套件名称组成的列表。

  • 在服务器端,使用tls_ciphersuites系统变量。如果不设置该变量,则默认值为,这意味着服务器允许默认的密码套件集。如果将该变量设置为空字符串,则不启用任何加密套件,无法建立加密连接。

  • 在客户端,使用——tls-ciphersuites选择。如果未设置此选项,则客户端允许默认的密码套件集。如果该选项设置为空字符串,则不启用加密套件,无法建立加密连接。

  • 对于常规的源/副本复制连接,其中此服务器实例是源,请使用tls_ciphersuites系统变量。在此服务器实例是副本的地方,使用SOURCE_TLS_CIPHERSUITES|MASTER_TLS_CIPHERSUITES选项。将复制源更改为语句(从MySQL 8.0.23)或将master更改为语句(在MySQL 8.0.23之前)。看到设置复制以使用加密连接

  • 对于组复制组成员、组复制组通信连接以及此服务器实例为提供者的组复制分布式恢复连接,请使用tls_ciphersuites系统变量。对于此服务器实例是加入成员的组复制分布式恢复连接,请使用group_replication_recovery_tls_ciphersuites系统变量。看到使用安全套接字层(SSL)保护组通信连接

请注意

密码套件支持从MySQL 8.0.16开始可用,但要求MySQL服务器和客户端应用程序都使用OpenSSL 1.1.1或更高版本编译。

在MySQL 8.0.16到8.0.18中group_replication_recovery_tls_ciphersuites系统变量和SOURCE_TLS_CIPHERSUITES|MASTER_TLS_CIPHERSUITES选项。将复制源更改为语句(从MySQL 8.0.23)或将master更改为语句(MySQL 8.0.23之前)不可用。在这些版本中,如果TLSv1.3用于源/副本复制连接,或者在Group replication中用于分布式恢复(MySQL 8.0.18支持),复制源或Group replication提供服务器必须允许使用至少一个默认启用的TLSv1.3密码套件。从MySQL 8.0.19中,您可以使用选项来配置客户端对任意密码套件的支持,如果需要的话,只包括非默认密码套件。

给定的密码可能只适用于特定的TLS协议,这将影响TLS协议的协商过程。看到TLS协议协商

的会话值,以确定给定服务器支持的密码Ssl_cipher_list状态变量:

查询会话状态:Ssl_cipher_list

Ssl_cipher_liststatus变量列出可能的SSL密码(非SSL连接为空)。如果MySQL支持TLSv1.3,则包括可能使用的TLSv1.3加密套件。

对于使用TLS.v1.3的加密连接,MySQL使用SSL库默认密码套件列表。

对于使用TLSv1.2以下TLS协议的加密连接,MySQL将以下默认密码列表传递给SSL库。

ECDHE-ECDSA-AES128-GCM-SHA256 ECDHE-ECDSA-AES256-GCM-SHA384 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES256-GCM-SHA384 ECDHE-ECDSA-AES128-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-ECDSA-AES256-SHA384 ECDHE-RSA-AES256-SHA384 DHE-RSA-AES128-GCM-SHA256 DHE-DSS-AES128-GCM-SHA256 DHE-RSA-AES128-SHA256 DHE-DSS-AES128-SHA256 DHE-DSS-AES256-GCM-SHA384 DHE-RSA-AES256-SHA256 DHE-DSS-AES256-SHA256 ECDHE-RSA-AES128-SHA ECDHE-ECDSA-AES128-SHA ECDHE-RSA-AES256-SHA ECDHE-ECDSA-AES256-SHA DHE-DSS-AES128-SHADHE-RSA-AES128-SHA TLS_DHE_DSS_WITH_AES_256_CBC_SHA DHE-RSA-AES256-SHA AES128-GCM-SHA256 DH-DSS-AES128-GCM-SHA256 ECDH-ECDSA-AES128-GCM-SHA256 AES256-GCM-SHA384 DH-DSS-AES256-GCM-SHA384 ECDH-ECDSA-AES256-GCM-SHA384 AES128-SHA256 DH-DSS-AES128-SHA256 ECDH-ECDSA-AES128-SHA256 AES256-SHA256 DH-DSS-AES256-SHA256 ECDH-ECDSA-AES256-SHA384 AES128-SHA DH-DSS-AES128-SHA ECDH-ECDSA-AES128-SHA AES256-SHA DH-DSS-AES256-SHA ECDH-ECDSA-AES256-SHA DHE-RSA-AES256-GCM-SHA384 DH-RSA-AES128-GCM-SHA256ECDH-RSA-AES128-GCM-SHA256 DH-RSA-AES256-GCM-SHA384 ECDH-RSA-AES256-GCM-SHA384 DH-RSA-AES128-SHA256 ECDH-RSA-AES128-SHA256 DH-RSA-AES256-SHA256 ECDH-RSA-AES256-SHA384 ECDHE-RSA-AES128-SHA ECDHE-ECDSA-AES128-SHA ECDHE-RSA-AES256-SHA ECDHE-ECDSA-AES256-SHA DHE-DSS-AES128-SHA DHE-RSA-AES128-SHA TLS_DHE_DSS_WITH_AES_256_CBC_SHA DHE-RSA-AES256-SHA AES128-SHA DH-DSS-AES128-SHA ECDH-ECDSA-AES128-SHA AES256-SHA DH-DSS-AES256-SHA ECDH-ECDSA-AES256-SHA DH-RSA-AES128-SHA ECDH-RSA-AES128-SHADh-rsa-aes256-sha ecdh-rsa-aes256-sha des-cbc3-sha

存在以下密码限制:

  • 以下密码是永久限制的:

    ecdh-ecdsa-des-cbc3-sha ! ecdh-rsa-des-cbc3-sha ! ecdh-ecdsa-des-cbc3-sha ! ecdh-ecdsa-des-cbc3-sha ! ecdh-ecdsa-des-cbc3-sha
  • 以下类别的密码是永久限制的:

    !aNULL !eNULL !EXPORT !LOW !MD5 !DES !RC2 !RC4 !PSK !SSLv3

参数启动服务器ssl_cert如果将系统变量设置为使用上述任何受限制的密码或密码类别的证书,则服务器在启动时禁用对加密连接的支持。

TLS协议协商

MySQL中的连接尝试协商使用双方可用的最高TLS协议版本,双方可用协议兼容的加密密码。协商过程取决于诸如用于编译服务器和客户端的SSL库、TLS协议和加密密码配置以及使用哪种密钥大小等因素:

  • 为了使连接尝试成功,服务器和客户端TLS协议配置必须允许一些公共协议。

  • 类似地,服务器和客户端加密密码配置必须允许一些共同的密码。给定的密码可能只适用于特定的TLS协议,因此除非也有兼容的密码,否则不会选择协商过程可用的协议。

  • 如果有TLSv1.3可用,则尽可能使用。(这意味着服务器和客户端配置都必须允许TLSv1.3,并且都必须允许一些与TLSv1.3兼容的加密密码。)否则,MySQL将继续使用可用协议列表,如果可能的话使用TLSv1.2,以此类推。协商从更安全的协议发展到更不安全的协议。协商顺序与协议的配置顺序无关。例如,协商顺序是相同的,无论是否tls_version值为TLSv1、TLSv1.1 TLSv1.2 TLSv1.3TLSv1.3、TLSv1.2 TLSv1.1 TLSv1

  • TLSv1.2并不适用于密钥大小不超过512位的所有密码。若要对这样的密钥使用此协议,请设置ssl_cipher的系统变量或使用——ssl cipher显式指定密码名的客户端选项:

    Aes128-sha aes128-sha256 aes256-sha256 camellia128-sha camellia256-sha des-cbc3-sha dhi - rsa - aes256-sha rc4-md5 rc4-sha seed-sha
  • 为了提高安全性,请使用RSA密钥大小至少为2048位的证书。

如果服务器和客户端没有共同允许的协议,也没有共同的协议兼容密码,服务器将终止连接请求。例子:

  • 如果服务器配置了tls_version = TLSv1.1 TLSv1.2

    • 调用的客户端连接尝试失败——tls = TLSv1,以及仅支持TLSv1的老客户端。

    • 类似地,配置的副本的连接尝试失败MASTER_TLS_VERSION = 'TLSv1',以及只支持TLSv1的旧副本。

  • 如果服务器配置了tls_version = TLSv1或者是只支持TLSv1的旧服务器:

    • 调用的客户端连接尝试失败——tls = TLSv1.1 TLSv1.2

    • 类似地,配置的副本的连接尝试失败MASTER_TLS_VERSION = 'TLSv1.1,TLSv1.2'

MySQL允许指定要支持的协议列表。该列表直接向下传递到底层SSL库,并最终由该库从提供的列表中实际启用什么协议。请参考MySQL源代码和OpenSSLSSL_CTX_new来()10bet官方网站有关SSL库如何处理此问题的信息的文档。

监视当前客户端会话TLS协议和密码

的会话值,以确定当前客户端会话使用哪种加密TLS协议和密码Ssl_version而且Ssl_cipher状态变量:

SELECT * FROM performance_schema。session_status WHERE变量_name IN ('Ssl_version','Ssl_cipher');+---------------+---------------------------+ | VARIABLE_NAME | VARIABLE_VALUE  | +---------------+---------------------------+ | Ssl_cipher | DHE-RSA-AES128-GCM-SHA256 | | Ssl_version | TLSv1.2  | +---------------+---------------------------+

如果连接未加密,则两个变量都有空值。