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

2023年 9月 21日 75.1k 0

在这篇博客文章中,我们将看到如何在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 混合明文格式和哈希格式的表。

<code >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中

<code >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"在磁盘上以哈希密码永久存储。

<code >
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  插件。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论