MySQL系列之远程管理(安全)
MySQL系列之远程管理(安全)
本文主要介绍了MySQL 5.7版本的远程管理安全配置,包括远程登录的主要方式(用户名/口令、SSH、SSL/TLS)以及如何使用TLS协议加密连接。文章详细介绍了服务端和客户端的配置方法,并提供了具体的配置参数和验证方式。
远程登录的主要方式
首先来看看MySQL支持哪些登录类型:
用户名/口令
这是远程登录最常用的方式,只要提供主机、用户、密码即可,如下图所示:
使用简单,但不安全。SSH
通过SSH协议(Secure Shell)建立一个安全的加密通道,以Shell命令的方式访问远程数据库。此时数据库服务需要开通相关权限。SSL/TLS
通过SSL协议登录数据库,实现安全访问。
使用TLS协议加密连接
本文主要介绍通过TLS协议加密远程连接。各位先试想一下,如未实现传输加密,结果会怎么样?
MySQL支持使用TLS(传输层安全)协议在客户端和服务器之间进行加密。TLS使用加密算法来确保通过公共网络接收到的数据是可信的。因此为实现加密,我们通常需要围绕以下几方面完成相关配置。
服务端配置
在服务端,--ssl
选项指定服务器允许但不需要加密连接。默认情况下启用此选项,因此不需要显式指定。如果需要客户端使用加密连接,必须在服务端启用变量:require_secure_transport
。
在my.cnf
文件中,进行如下定义:
[mysqld]
require_secure_transport=ON
在此基础上,指定以下配套变量:
[mysqld]
ssl_ca=CA证书公钥文件
ssl_cert=MySQL服务证书公钥文件
ssl_key=MySQL服务证书私钥文件
客户端配置
默认情况下,如果服务器支持加密连接,MySQL客户端程序会尝试建立加密连接,并通过--ssl
不同的模式加以控制:
--ssl mode=PREFERRED
在没有--ssl
模式选项的情况下,客户端会尝试使用加密进行连接,如果无法建立加密连接,则会退回到未加密的连接。这也是显式--ssl mode=PREFERRED
选项的行为。--ssl mode=REQUIRED
客户端需要加密连接,如果无法建立连接,则会失败。--ssl mode=DISABLED
客户端使用未加密的连接。--ssl mode=VERIFY_CA
或VERIFY_IDENTITY
客户端需要加密连接,还需要对服务器CA证书进行验证,并(使用VERIFY_IENTITY
)对其证书中的服务器主机名进行验证。
提示:
如果选择默认设置--ssl mode
为PREFERRED
时,将生成加密连接。但是,客户端验证服务器的身份非常重要,因此设置--ssl mode
为VERIFY_CA
或VERIFY_IDENTITY
是比默认选项更好的选择,它可以帮助防止复杂的中间人攻击。VERIFY_CA
使客户端检查服务器的证书是否有效。VERIFY_IDENTITY
使客户端检查服务器的证书是否有效,并使客户端检查客户端使用的主机名是否与服务器证书匹配。如满足该安全要求,你必须先确保服务器的CA证书对当前环境中使用它的所有客户端都是可靠的,否则将导致可用性问题。
客户端的以下选项(或连接参数)标识了客户端在与服务器建立加密连接时使用的证书和密钥文件。它们类似于服务器端使用的ssl_ca
、ssl_cert
和ssl_key
系统变量,但--ssl-cert
和--ssl-key
标识客户端公钥和私钥:
--ssl-ca
:CA证书公钥文件,必须与服务端CA证书一致--ssl-cert
:客户端证书公钥文件--ssl-key
:客户端证书私钥文件
为了提高安全性,客户端可以提供与服务端CA证书的相同CA证书,并启用主机名身份验证。通过这种方式,服务器和客户端将信任放在同一个CA证书上。客户端验证其连接的主机是否是预期的主机:
- 要指定CA证书,请使用
--ssl-CA
(或--ssl-capath
),并指定--ssl-mode=VERIFY_CA
。 - 要同时启用主机名身份验证,请使用
--ssl mode=VERIFY_identity
,而不是--ssl mode=VERIFY_CA
。
如果要确定与服务器的当前连接是否使用加密,请检查ssl_cipher
状态变量值:
- 如果该值为空,则连接未加密。
- 否则,连接将被加密,该值表示加密密码。
结语
本文参考MySQL官方文章介绍了MySQL如何实现远程连接的安全性,包括一般配置建议。如对安全有更改的要求,可参考本文加以实践。