备注:文章编写时间201904-201905期间,后续官方在github的更新没有被写入
~
~mysql
ProxySQL是一种协议感知代理。
因为ProxySQL基于流量执行路由,所以当客户端链接时,它没法识别目标HostGroup,所以ProxySQL须要对客户端进行身份验证。
所以,它须要具备与用户密码相关的一些信息:一些足以容许身份验证的信息。git
ProxySQL也须要这些信息与后端创建链接,或在已创建的链接中发出CHANGE_USER。github
3层配置架构也适用于用户信息。
ProxySQL将用户信息存储在表mysql_users中:
1)对象MySQL_Authentication()负责在RUNTIME层存储这些信息;
2)main.mysql_users是MEMORY层的数据库;
3)disk.mysql_users是DISK层上的数据库。sql
不管是内存仍是磁盘上,密码均可以在mysql_users.password表中以2种格式存储:
1)纯文本(明文)[plain text]
2)哈希密码[hashed password]数据库
纯文本中的密码很简单,很是容易阅读。即便数据库和配置文件保存在安全位置,则安全问题仍然存在。散列密码与MySQL服务器
存储在mysql.user.password列中的密码格式相同。后端
ProxySQL认为以*开头的密码具备散列密码。安全
在MySQL和ProxySQL中,从明文到散列密码的转换为SHA1[SHA1('clear_password')];而从散列密码是没法导出纯文本密码的。当客户
端链接到ProxySQL时,可使用散列密码对其进行身份验证。在第一次客户端身份验证期间,ProxySQL能够生成出部分哈希的密码
SHA1('clear_password'),在运行期间,该信息将在内部进行存储,并容许ProxySQL链接到后端。服务器
在ProxySQL的Admin interface界面是没有PASSWORD()相似的函数的,这意味着:
1)密码以插入的格式存储,能够是纯文本或散列;
2)在Admin interface界面输入密码时,没法从纯文本密码中获取散列密码(而在MySQL中运行SELECT PASSWORD('password')是能够的);架构
为了便于支持散列密码,ProxySQL v1.2.3引入了一个新的全局布尔参数admin-hash_passwords,默认状况下是启用的。
当admin-hash_passwords=true时,仅当执行LOAD MYSQL USERS TO RUNTIME时,密码才会在RUNTIME自动散列。mysql_users表中的密码
不会自动被散列。尽管如此,但对内存和磁盘上的mysql_users表中密码进行散列仍是很容易的,只须要从RUNTIME层复制用户配置就足够
了:
例如,在LOAD MYSQL USERS TO RUNTIME以后再运行SAVE MYSQL USERS FROM RUNTIME,而后SAVE MYSQL USERS TO DISK ,这样就将哈希
后的密码信息保存到了内存和磁盘(推荐)。ide
示例:
Admin> SELECT username,password FROM mysql_users; +----------+------------+ | username | password | +----------+------------+ | user01 | password01 | | user02 | password02 | +----------+------------+ 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 | +----------+------------+ | user01 | password01 | | user02 | password02 | +----------+------------+ 2 rows in set (0.00 sec)
在此阶段,密码在RUNTIME层已经作了哈希处理,但mysql_users中的名为仍然没有进行哈希处理。
对MEMORY层mysql_users表上的密码进行散列:
Admin> SAVE MYSQL USERS FROM RUNTIME; Query OK, 0 rows affected (0.00 sec) Admin> SELECT username,password FROM mysql_users; +----------+-------------------------------------------+ | username | password | +----------+-------------------------------------------+ | user01 | *F9A4855A538E726D743CAE9D5D28240B20CC69C1 | | user02 | *8B4C9476A1542A79AA4AE86926B0344C4C4E2082 | +----------+-------------------------------------------+ 2 rows in set (0.00 sec)
此时,MEMORY层中的密码已是哈希值了,如今能够经过运行 SAVE MYSQL USERS TO DISK 便可将散列密码保存到磁盘上。
Admin> SAVE MYSQL USERS TO DISK; Query OK, 0 rows affected (0.01 sec)
注意:admin-hash_passwords是一个admin参数,而不是一个mysql参数。这是由于它会影响Admin的行为。
这个细节很是重要,由于为了应用对参数admin-hash_passwords的更改,须要运行LOAD ADMIN VARIABLES TO RUNTIME而不是LOAD MYSQL VARIABLES TO RUNTIME。
完毕!