ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

ProxySQL 密码管理

2022-06-21 12:34:00  阅读:171  来源: 互联网

标签:hash users 管理 ProxySQL 密码 mysql password


ProxySQL是一个协议感知的proxy。由于ProxySQL基于流量进行路由,当一个客户端连接ProxySQL时,它还无法识别它的目标主机组,因此ProxySQL需要对该客户端进行认证。基于此,需要为用户提供相关的密码信息以便完成认证。

ProxySQL还需要这些信息来和后端MySQL建立连接,或者在已建立的连接上执行CHANGE_USER。(译注:也就是说,这些用户负责客户端到ProxySQL的连接,也复制ProxySQL到后端节点的连接)

密码配置也使用用户的配置表mysql_users,所以也使用多层配置系统进行管理:

  • runtime数据结构中使用MySQL_Authentication()对象来存储认证相关的信息;
  • 内存数据库中使用main.mysql_users表存储认证相关信息;
  • 磁盘数据库中使用disk.mysql_users表存储认证相关信息。
  • 在内存数据库和磁盘数据库的mysql_users表中,和用户认证凭据相关的字段为username和password。

密码格式

无论是内存数据库,还是磁盘数据库,mysql_users.password都支持明文密码格式和hash加密的密码格式:

  • plain text
  • hashed password

明文密码很简单,从字面即可直到密码内容。如果磁盘数据库和传统的配置文件处于一个安全的路径下,即使需要考虑安全问题,但也没有那么严格。
加密的hash密码和MySQL中存放在mysql.user.password字段中的hash密码格式是一样的。
当密码以*开头时,ProxySQL就认为这是一个加密的hash密码。

加密的hash密码以及认证

在MySQL和ProxySQL中,使用SHA1(SHA1('clear_password'))对clear_password进行加密。无法根据加密的hash密码推导回原始的明文密码。
当客户端连接到ProxySQL时,ProxySQL将使用该加密的密码对用户进行认证。如果该客户端是第一次认证,则ProxySQL会推导出一部分的hash密码SHA1('clear_password')。推导出的信息会存储到runtime的内部数据结构中,以便ProxySQL连接后端MySQL时使用。

如何设置新密码

ProxySQL的Admin管理接口没有PASSWORD()函数,这意味着:

  • 无论是明文还是hash加密的密码,都会以插入时的格式进行存储(译注:其实是句废话,意思是设置明文密码,就以明文存储,设置加密密码,就以加密后的结果存储);
  • 当在Admin管理接口输入密码时,无法从明文密码推导出加密的hash密码。(可以在MySQL Server上执行select password('password')得到hash密码,并粘贴到管理接口)。

admin-hash_passwords变量

为了方便支持hash密码,ProxySQL 1.2.3引入了一个全局布尔值变量admin-hash_passwords,默认已开启。

当该变量值为true时,执行LOAD MYSQL USERS TO RUNTIME会自动将密码进行hash处理并存储到RUNTIME数据结构中。

mysql_users表中的密码不会自动hash。但要对内存数据库、磁盘数据库中mysql_users中的密码进行hash也很容易。只需从RUNTIME数据结构中拷贝到内存数据库或磁盘数据库中即可。

例如,在执行了LOAD MYSQL USERS TO RUNTIME后,再执行SAVE MYSQL USERS FROM RUNTIME即可保存到内存数据库的mysql_users表中,再执行SAVE MYSQL USERS TO DISK即可保存到磁盘数据库的mysql_users表中。

例如:

Admin> SELECT * FROM mysql_users;
Empty set (0.00 sec)

Admin> INSERT INTO mysql_users(username,password) VALUES ('user1','password1'), ('user2','password2');
Query OK, 2 rows affected (0.00 sec)

Admin> SELECT username,password FROM mysql_users;
+----------+-----------+
| username | password  |
+----------+-----------+
| user1    | password1 |
| user2    | password2 |
+----------+-----------+
2 rows in set (0.00 sec)

Admin> LOAD MYSQL USERS TO RUNTIME;
Query OK, 0 rows affected (0.00 sec)

Admin> SELECT username,password FROM mysql_users;
+----------+-----------+
| username | password  |
+----------+-----------+
| user1    | password1 |
| user2    | password2 |
+----------+-----------+
2 rows in set (0.00 sec)

执行完上面的语句后,runtime中的密码已经是被hash过的,但内存数据库中的mysql_users表中仍然是明文。所以执行下面的操作,将mysql_users表中的密码修改为hash密码:

Admin> SAVE MYSQL USERS FROM RUNTIME;
Query OK, 0 rows affected (0.00 sec)

Admin> SELECT username,password FROM mysql_users;
+----------+-------------------------------------------+
| username | password                                  |
+----------+-------------------------------------------+
| user1    | *668425423DB5193AF921380129F465A6425216D0 |
| user2    | *DC52755F3C09F5923046BD42AFA76BD1D80DF2E9 |
+----------+-------------------------------------------+
2 rows in set (0.00 sec)

Admin> SAVE MYSQL USERS TO DISK;

然后就可以执行SAVE MYSQL USERS TO DISK将内存数据库中hash后的密码持久化到磁盘数据库的mysql_users表中。

注意:admin-hash_passwords是以admin-开头的变量,不是mysql-开头。这是因为它影响的是Admin接口的行为。

这个细节很重要,因为修改该变量后要使其生效,你要执行的是LOAD ADMIN VARIABLES TO RUNTIME,而不是LOAD MYSQL VARIABLES TO RUNTIME

另外,明文存储的密码查询的时候只有一个,但是hash后的密码存储后查询的时候会显示两个:

标签:hash,users,管理,ProxySQL,密码,mysql,password
来源: https://www.cnblogs.com/sanduzxcvbnm/p/16396422.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有