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. 强化学习-学习笔记4 | Actor-Critic

    Actor-Critic 是价值学习和策略学习的结合.Actor 是策略网络,用来控制agent运动,可以看做是运动员.Critic 是价值网络,用来给动作打分,像是裁判. 4. Actor-Crit ...

  2. Collection子接口:List接口

    1. 存储的数据特点:存储序的.可重复的数据. 2. 常用方法:(记住)增:add(Object obj)删:remove(int index) / remove(Object obj)改:set(i ...

  3. Lambda表达式的无参数无返回值的练习和Lambda表达式有参数有返回值的练习

    使用Lambda(无参无返回) 说明:给定一个厨师(Cook)接口,内含唯一的抽象方法makeFood,且无参数.无返回值.如下: public interface Cook{ public abst ...

  4. 通过memberlist库实现gossip管理集群以及集群数据交互

    通过memberlist库实现gossip管理集群以及集群数据交互 概述 memberlist库的简单用法如下,注意下面使用for循环来执行list.Join,原因是一开始各节点都没有runing,直 ...

  5. Docker 安全及日志管理

    Docker 安全及日志管理 容器的安全性问题的根源在于容器和宿主机共享内核. 容器里的应用导致Linux内核崩溃,那么整个系统可能都会崩溃. 虚拟机并没有与主机共享内核,虚拟机崩溃一般不会导致宿主机 ...

  6. css基础04

    所有浮动都是贴着浮动的.一左一右的话就毫无联系了. 浮动元素和标准流是两个级别了,浮起来了,后面的人会补上空缺的位置,让其他标准流的盒子占有. 很容易形成叠加效果,(蓝色的标准流会上去补上浮动的位置, ...

  7. react实战系列 —— react 的第一个组件

    react 的第一个组件 写了 react 有一个半月,现在又有半个月没写了,感觉对其仍旧比较陌生. 本文分两部分,首先聊一下 react 的相关概念,然后不使用任何语法糖(包括 jsx)或可能隐藏底 ...

  8. 一个注解搞定SpringBoot接口定制属性加解密

    前言 上个月公司另一个团队做的新项目上线后大体上运行稳定,但包括研发负责人在内的两个人在项目上线后立马就跳槽了,然后又交接给了我这个「垃圾回收人员」. 本周甲方另一个厂家的监控平台扫描到我们这个项目某 ...

  9. BZOJ4580/Luogu3147 [Usaco2016 Open]248

    amazing #include <iostream> #include <cstdio> #include <cstring> #include <algo ...

  10. Pycharm5个非常有用的技巧

    PyCharm 是一款非常强大的编写 python 代码的工具.掌握一些小技巧能成倍的提升写代码的效率,本篇介绍几个经常使用的小技巧. 一.分屏展示 当你想同时看到多个文件的时候: 右击标签页: 选择 ...