如何在ProxySQL中保持散列格式的密码

在这篇博客文章中,我们将看到如何在ProxySQL mysql_users 中保存哈希格式的密码。此外,即使有人以明文形式存储密码,我们也可以很容易地将其转换成散列格式。

纯文本密码极易受到未经授权的访问,因为任何有权访问数据库或配置文件的人都可以轻易地读取它们。虽然将这些文件存储在安全的位置可以缓解一些安全问题,但仍然存在数据泄露的风险。另一方面,散列密码与MySQL服务器中的密码以相同的格式存储" mysql.user.password "(MySQL 8.0版本之前)或者mysql.user.authentication_string"列(自MySQL 8.0版本使用mysql_native_password插件),提供了额外的安全层。

在ProxySQL中,任何以星号(*)开头的密码都被视为散列密码。

ProxySQL的管理界面缺少密码()功能。因此,存储在ProxySQL中的任何密码都以最初插入时的格式保存。这种格式可以是纯文本,也可以是哈希值。

From ProxySQL: 

在这里,我们将用户账户插入到 mysql_users 混合明文格式和哈希格式的表。

ProxySQL_Admin> INSERT INTO mysql_users(username,password) VALUES ('test1','test1'), ('test2','*7CEB3FDE5F7A9C4CE5FBE610D7D8EDA62EBE5F4E'),('test3','test3'), ('test4','*D159BBDA31273BE3F4F00715B4A439925C6A0F2D');
Query OK, 4 rows affected (0.00 sec)
 
 
ProxySQL_Admin> select distinct username,password from mysql_users where username like 'test%';
+----------+-------------------------------------------+
| username | password                                  |
+----------+-------------------------------------------+
| test1    | test1                                     |
| test2    | *7CEB3FDE5F7A9C4CE5FBE610D7D8EDA62EBE5F4E |
| test3    | test3                                     |
| test4    | *D159BBDA31273BE3F4F00715B4A439925C6A0F2D |
+----------+-------------------------------------------+
4 rows in set (0.00 sec)
 
 
ProxySQL_Admin> LOAD MYSQL USERS TO RUNTIME;
Query OK, 0 rows affected (0.00 sec)
 
 
ProxySQL_Admin> SAVE MYSQL USERS TO DISK;
Query OK, 0 rows affected (0.01 sec)
 
 
ProxySQL_Admin> select distinct username,password from mysql_users where username like 'test%';
+----------+-------------------------------------------+
| username | password                                  |
+----------+-------------------------------------------+
| test1    | test1                                     |
| test2    | *7CEB3FDE5F7A9C4CE5FBE610D7D8EDA62EBE5F4E |
| test3    | test3                                     |
| test4    | *D159BBDA31273BE3F4F00715B4A439925C6A0F2D |
+----------+-------------------------------------------+
4 rows in set (0.00 sec)

在这里上面,主要问题是我们的mysql_users表格中有一些对某些用户帐户可见的纯文本密码(test1 & test3),我们不想以明文/纯文本密码格式保存它。相反,所有密码条目都应该以哈希密码格式提供。

一种方法可以解决这个问题:删除用户账户的明文密码条目,使用PASSWORD() 函数,然后将这些实际的散列条目插入mysql_users表来修复该问题。

另外一种  admin-hash_passwords 变量将帮助我们解决这个问题,并且只在ProxySQL中以散列密码条目保存在mysql_users

ProxySQL’s admin-hash_passwords variable

ProxySQL版本1.2.3包含了一个新的全局布尔变量,名为 admin-hash_password,默认情况下启用它以支持哈希密码。如果admin-hash_passwords=true,当执行" LOAD MYSQL USERS TO RUNTIME" 时,RUNTIME态 密码将自动 hashed。但是,存储在mysql_users 表不会被自动散列。运行"SAVE MYSQL USERS FROM RUNTIME "将MYSQL用户密码以hash永久保存到磁盘

 

让我们将散列密码保存在ProxySQL中

ProxySQL_Admin> select @@admin-hash_passwords;
+------------------------+
| @@admin-hash_passwords |
+------------------------+
| true                   |
+------------------------+
1 row in set (0.00 sec)
 
 
ProxySQL_Admin> select distinct username,password from mysql_users where username like 'test%';
+----------+-------------------------------------------+
| username | password                                  |
+----------+-------------------------------------------+
| test1    | test1                                     |
| test2    | *7CEB3FDE5F7A9C4CE5FBE610D7D8EDA62EBE5F4E |
| test3    | test3                                     |
| test4    | *D159BBDA31273BE3F4F00715B4A439925C6A0F2D |
+----------+-------------------------------------------+
4 rows in set (0.00 sec)
 
 
ProxySQL_Admin> LOAD MYSQL USERS TO RUNTIME;
Query OK, 0 rows affected (0.01 sec)
 
 
ProxySQL_Admin> select distinct username,password from mysql_users where username like 'test%';
+----------+-------------------------------------------+
| username | password                                  |
+----------+-------------------------------------------+
| test1    | test1                                     |
| test2    | *7CEB3FDE5F7A9C4CE5FBE610D7D8EDA62EBE5F4E |
| test3    | test3                                     |
| test4    | *D159BBDA31273BE3F4F00715B4A439925C6A0F2D |
+----------+-------------------------------------------+
4 rows in set (0.00 sec)

目前,密码在 RUNTIME 进行哈希处理,但它们在mysql_users中not hashed 。为了在mysql_users表中hash,我们需要运行"SAVE MYSQL USERS FROM RUNTIME"命令。运行命令"SAVE MYSQL USERS TO DISK"在磁盘上以哈希密码永久存储。

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

ProxySQL_Admin> SAVE MYSQL USERS TO DISK;
Query OK, 0 rows affected (0.01 sec)
 
ProxySQL_Admin> select distinct username,password from mysql_users where username like 'test%';
+----------+-------------------------------------------+
| username | password                                  |
+----------+-------------------------------------------+
| test1    | *06C0BF5B64ECE2F648B5F048A71903906BA08E5C |
| test2    | *7CEB3FDE5F7A9C4CE5FBE610D7D8EDA62EBE5F4E |
| test3    | *F357E78CABAD76FD3F1018EF85D78499B6ACC431 |
| test4    | *D159BBDA31273BE3F4F00715B4A439925C6A0F2D |
+----------+-------------------------------------------+
4 rows in set (0.00 sec)

结论

mysql_users 有混合格式的密码条目时 ,admin-hash_passwords 功能会非常有用,我们可以很容易地简化散列密码条目的管理。此外,为了确保只有散列密码条目存储在ProxySQL中,必须使用 mysql_native_password  插件。

参考:https://www.percona.com/blog/how-to-persist-a-hashed-format-password-inside-proxysql/

posted on 2023-04-28 13:32  张冲andy  阅读(8)  评论(0编辑  收藏  举报

导航