在实际项目中,我们在生产(环境)发布新版本或运维时,使用 mysql 、mysqladmin、mysqlimport、mysqldump、mysqlpump 等 MySQL 客户端程序时,每次都需要输入密码,一般都会采用更安全的互动输入密码模式,而不会采用暴露密码却更便捷的在命令行中直接输入密码的方式。一旦连接的服务器多了,这样便会令人感到厌烦。因而,有其他更好的方式吗?答案是肯定的,比如今天要讲的 mysql_config_editor ,它的优点是可以以一定的加密手段将登录路径选项组以非明文的形式存储在登录路径文件中,在后续使用时可以更方便快捷的使用--login-path=已定义的登录路径名称
选项来连接 MySQL 数据库;缺点是安全防护能力有限,不如使用 SSL 协议、TLS 协议的安全认证安全。
文章目录
- mysql_config_editor 简介
- 演示
- 创建登陆选项
- 打印查看已创建的登录路径
- 额外功能:复用包含多数相同登录选项的登录路径实现快速客户端连接
- 为 test 实例创建登录路径并测试
- 使用本地登录路径连接远程服务器
- 改进建议
- 更多信息
mysql_config_editor 简介
mysql_config_editor 实用程序使您能够将身份验证凭据存储在名为.mylogin.cnf
的模糊(加密)登录路径文件中。文件位置在 Windows 上为%APPDATA%\MySQL
目录,在非 Windows 系统上为当前用户的主目录。MySQL 客户端程序可以稍后读取该文件,以获取连接到 MySQL 服务器的身份验证凭据。
mylogin.cnf
登录路径文件的未加密格式由选项组组成,与其他选项文件类似。mylogin.cnf
中的每个选项组都称为**“登录路径( Login Path )”**,这是一个仅允许某些选项的组:host
,user
, password
,port
和socket
。将登录路径选项组视为一组选项,这些选项指定要连接到哪个 MySQL 服务器以及要使用哪个帐户进行身份验证。下面是一个未加密的示例:
[client]
user = mydefaultname
password = mydefaultpass
host = 127.0.0.1
[mypath]
user = myothername
password = myotherpass
host = localhost
当您调用客户端程序连接到服务器时,客户端会将.mylogin.cnf
与其他选项文件一起使用。它的优先级高于其他选项文件,但低于客户端命令行上明确指定的选项。
如果指定--login-path=mypath
,则 mysql_config_editor 会创建一个名为 mypath 的登录路径。之后,可以使用任意支持该选项的 MySQL 客户端程序,如 mysql 客户端,从其他选项文件中读取[client]
和[mysql]
,从登录路径文件中读取[client]
、[mysql]
和[mypath]
。
mysql_config_editor 采用模糊化明文文本的方式加密,因而,虽然可以避免在配置文件或命令行中键入密码产生的暴露密码或每次都要输入的繁琐问题,提供了一定的安全性,但却无法防止坚定的攻击者在获得系统管理权限后花一些功夫来破解它。
演示
在主机名为 natnet-source 的虚拟机上,我启动了两个 MySQL 服务器实例,一个名为source
,一个名为test
。由下图可知,两个实例运行正常。
创建登陆选项
此处创建一个名为root_src_3306
的登录路径,使用 TCP/IP 端口 3306
,主机名natnet-source
,root
账户连接 ;第二个登录路径名称为root_sock
,使用 Unix 套接字,root
账户连接。
mysql_config_editor set -u root -P 3306 -h natnet-source -p --login-path=root_src_3306
mysql_config_editor set -u root -S /var/lib/mysql/data/source/mysql.sock -p --login-path=root_sock
打印查看已创建的登录路径
执行下面的命令,查看我已定义的登录路径:
mysql_config_editor print --all
可见,我仅为 MySQL source
服务器实例建立了两个登录路径,并没有为test
实例创建登录路径。
额外功能:复用包含多数相同登录选项的登录路径实现快速客户端连接
将两个实例的root@localhost
的密码设置得相同,所以可以在命令行中指定--port=3307
或socket=/var/lib/mysql-test/mysql.sock
来复用本来为source
实例创建的登陆选项。
mysql --login-path=root_src_3306 -P 3307
mysql> select @@hostname,@@port,@@socket;
mysql --login-path=root_sock -S /var/lib/mysql-test/mysql.sock -e "select @@hostname,@@port,@@socket;"
可见成功了!所以,这里点出了登录路径的一个额外功能:当不同 MySQL 实例存在很多相同的选项时,可以利用**“登录路径+命令行选项”**的方式快速实现客户端连接。
为 test 实例创建登录路径并测试
mysql_config_editor set -u root -P 3307 -h natnet-source -p --login-path=root_test_3307
mysql_config_editor set -u root -S /var/lib/mysql-test/mysql.sock -p --login-path=root_test_sock
测试其可用性。
[root@natnet-source ~]# mysql --login-path=root_test_3307 -e "select @@hostname,@@port,@@socket;"
+---------------+--------+--------------------------------+
| @@hostname | @@port | @@socket |
+---------------+--------+--------------------------------+
| natnet-source | 3307 | /var/lib/mysql-test/mysql.sock |
+---------------+--------+--------------------------------+
[root@natnet-source ~]# mysql --login-path=root_test_sock -e "select @@hostname,@@port,@@socket;"
+---------------+--------+--------------------------------+
| @@hostname | @@port | @@socket |
+---------------+--------+--------------------------------+
| natnet-source | 3307 | /var/lib/mysql-test/mysql.sock |
+---------------+--------+--------------------------------+
使用本地登录路径连接远程服务器
使用root_src_3306
登录路径和-h natnet-replica1
连接到 natnet-replica1 主机。
[root@natnet-source lib]# mysql --login-path=root_src_3306 -h natnet-replica1 -e "select @@hostname,@@port,@@socket;"
+-----------------+--------+-----------------------------------------+
| @@hostname | @@port | @@socket |
+-----------------+--------+-----------------------------------------+
| natnet-replica1 | 3306 | /var/lib/mysql/data/replica1/mysql.sock |
+-----------------+--------+---
同样,我们也可以使用内网 IP (Host-Only 网络)访问 natnet-replica1 主机,此时使用-h hostonly-replica1
。
[root@natnet-source lib]# mysql --login-path=root_src_3306 -h hostonly-replica1 -e "select @@hostname,@@port,@@socket;"
+-----------------+--------+-----------------------------------------+
| @@hostname | @@port | @@socket |
+-----------------+--------+-----------------------------------------+
| natnet-replica1 | 3306 | /var/lib/mysql/data/replica1/mysql.sock |
+-----------------+--------+-----------------------------------------+
[root@natnet-source lib]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.2.1 natnet-win win.nat-net
10.0.2.2 natnet-source source.nat-net
10.0.2.3 natnet-replica1 replica1.nat-net
10.0.2.4 natnet-replica2 replica2.nat-net
192.168.56.2 hostonly-win win.host-only
192.168.56.2 hostonly-source source.host-only
192.168.56.3 hostonly-replica1 replica1.host-only
192.168.56.4 hostonly-replica2 replica2.host-only
改进建议
在实际项目中,我们以前大多在项目中将连接数据库的用户名和密码存储在配置文件中,有些以变量定义形式存在,有些以 URI 连接(字符)串形式存在。这种方法虽然常用,但使用多了,也表现出一些缺陷成为业务痛点,比如在配置文件中明文存储的安全性;数据库因密码安全策略要求需定期修改,导致后端配置文件也需要相应的修改。如果 MySQL 能做到可以让 MySQL Connector 可以识别 login-path
选项就好了,这样我们就无需在连接串中输入用户名,密码,主机名,端口号,通讯协议等信息了,而只需要指定登录路径就可以了。这样无论 DBA、操作系统运维人员如何修改密码,只要他们把.mylogin.cnf
文件同步更新了,我们在客户端服务器复制一份就可以了。
更多信息
更多信息,请参考 4.6.7 mysql_config_editor —— MySQL 配置实用程序 。