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后的密码存储后查询的时候会显示两个:

ProxySQL 密码管理的更多相关文章

  1. 你是否经常忘记网站上的各种密码?分享个密码管理软件LastPass

      现在网络那么发达,我们上网的每个人势必会在各个网站上登陆,那势必会有一堆密码需要管理,那怎么能记住那么多网站的密码呢?我之前的做法是设置几个常用的密码,好多不重要的网站用一个,重要的网站用一个,然 ...

  2. linux中用户、组的管理(密码管理、权限管理及其修改用户、组)(转)

    process(进程) 1 计算资源 权限 用户(获取资源或服务的凭证或标识) 用户,容器,关联权限:用户组(标识符),方便地指派权限 2 用户.组.权限   安全上下文(secure context ...

  3. redis密码管理

    redis 默认密码是空,在应用中,通常需要设置redis的连接密码,可通过命名方式进行密码管理: 1.连接redis: [redis@hadooptest Downloads]$ cd redis- ...

  4. 个人信息管理PIM——密码管理工具软件

    密码管理工具 以KeePass为主,结合LastPass在线浏览器网页密码.有钱银可以考虑1Password. KeePass LastPass 1Password 价格费用 免费开源 普通版:免费 ...

  5. Linux瑞士军刀:密码管理Keeweb

    导读 如今,我们依赖于越来越多的线上服务.我们每注册一个线上服务,就要设置一个密码:如此,我们就不得不记住数以百计的密码.这样对于每个人来说,都很容易忘记密码.我将在本文中介绍 Keeweb,它是一款 ...

  6. weblogic管理3 - 生产模式下免密码管理配置

    admin server免密码配置 >1.  生产模式中admin root目录下是否存在security/boot.properties文件 [weblogic@11g AdminServer ...

  7. 【C#】聊聊不需要记密码的密码管理

    密码管理(Password Management)肯定所有人都不会陌生,密码管理的来源也是来自于实际需求,当人们需要使用到密码的场景越来越多,场景也越来越复杂,密码的记录就成为了“难题”和“负担”,很 ...

  8. 用firefox 31配合KeePass密码管理器实现web帐号密码自动填写登录

    原文:http://bbs.kafan.cn/thread-1754676-1-1.html KeePass的优势:1.这是一款完全开源的密码管理器2.很多人都使用lastpass来保存密码,而这种严 ...

  9. Lastpass——密码管理工具

    Lastpass是一个优秀的在线密码管理器和页面过滤器,采用了强大的加密算法,自动登录/云同步/跨平台/支持多款浏览器. 我之前一直都在使用这个工具,不过都是在浏览器上以扩展的方式使用,在火狐浏览器上 ...

随机推荐

  1. 零基础学Java(3)运算符

    运算符 运算符用于连接值.Java提供了一组丰富的算术和逻辑运算符以及数学函数. 算术运算符 在Java中,使用算术运算符+.-.*./表示加.减.乘.除运算.当参与/运算的两个操作数都是整数时,表示 ...

  2. PTA(BasicLevel)-1018 锤子剪刀布

    一.问题定义 大家应该都会玩"锤子剪刀布"的游戏:两人同时给出手势,胜负规则如下:         剪刀 > 布, 锤子 > 剪刀, 布 > 锤子 现给出两人的交 ...

  3. 【炼丹Trick】EMA的原理与实现

    在进行深度学习训练时,同一模型往往可以训练出不同的效果,这就是炼丹这件事的玄学所在.使用一些trick能够让你更容易追上目前SOTA的效果,一些流行的开源代码中已经集成了不少trick,值得学习一番. ...

  4. 可落地的DDD(7)-战术设计上的一些误区

    背景 几年前我总结过DDD战术设计的一些落地经验可落地的DDD(5)-战术设计,和一次关于聚合根的激烈讨论最近两年有些新的落地体验,回过头来发现,当初对这些概念的理解还是没有深入,这篇文章重新阐述下. ...

  5. BUCK 电路PSIM仿真模型搭建之一 (PI模块稳定性分析)

    1.  利用PI 模块仿真BUCK 电路电流环 在调制通道上未加入延迟环节时,无论KP, KI 参数如何调整系统都是稳定的 仿真结果: 在调制通道上引入 一个开关周期的延迟 系统出现明显的震荡情况,说 ...

  6. 水电表/燃气表/压力表/传感器/仪器仪表等,超低功耗段码LCD液晶显示驱动IC-VKL144A/B 超低工作电流,36*4COM显示,替代PCF8551/MCP144/BU9792/9B92/BL55072B等

    煤气罐的使用安全隐患较大,现在大部分城市使用管道输送燃气,燃气表的计费大都是通过远程抄表的方式,或者充值的方式,为了让用户更好地了解自家燃气表的使用情况,需要一款液晶屏来显示燃气表的状态和用气量等信息 ...

  7. AtCoder Beginner Contest 248 E - K-colinear Line // 计算几何

    原题链接:E - K-colinear Line (atcoder.jp) 题意: 给出直角坐标系上N个点(N <= 300),求经过这些点中至少K个点的直线数量,若有无穷多条,则输出" ...

  8. js 设置滚动条位置为底部

     if (document.getElementById("")) {             document.getElementById("").scro ...

  9. 零基础学Java(11)自定义类

    前言   之前的例子中,我们已经编写了一些简单的类.但是,那些类都只包含一个简单的main方法.现在来学习如何编写复杂应用程序所需要的那种主力类.通常这些类没有main方法,却有自己的实例字段和实例方 ...

  10. 自定义bean对象实现序列化接口

    上一个word count的案例中,我们为了理解mapreduce的流程,写了上面的代码.现在我们要把一个实体类序列化.比如现在有这么一个文件,里面的数据格式是这样的: 第一列是时间戳,第二列是手机号 ...