Password management

本文介绍了ProxySQL中MySQL密码的相关内容。ProxySQL需对客户端验证,将用户信息存于mysql_users表。密码有明文和hash加密两种存储形式,客户端可用hash密码认证。还说明了输入新密码的方式,以及从v1.2.3引入的全局变量admin - hash_passwords对密码加密的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL Passwords in ProxySQL

ProxySQL是一个感知协议代理 

ProxySQL是根据流量负载来路由连接的,所以连接到ProxySQL的客户端是不能通过目的主机组的认证的,因此ProxySQL需要对客户端进行验证

所以,ProxySQL需要和用户密码相关的信息:足够通过认证的信息

ProxySQL还需要与后端建立连接的信息,来对当前的连接做change_user

三层机构的配置体系同样适用于用户信息的配置.

ProxySQL存储用户信息到mysql_users表:

  • MySQL_Authentication()是负责存储用户runtime状态信息的对象
  • main.mysql_users缓存内存配置
  • disk.mysql_users持久化用户配置

不管是在内存还是磁盘,mysql_users都将认真信息存储在username和password列中。

Password formats

mysql_users.password中的密码用两种存储形式,不管在内存还是磁盘都是一样的:

  • 明文文本
  • hash加密

明文密码简单易读,如果数据库和配置文件都保存在访问受限的目录,还是可以的。hash加密的密码和MySQL server存储在mysql.user.password的密码有相同的格式。

ProxySQL会把以*开头的密码当作经过hash加密的密码。

Hashed passwords and authentication

在MySQL和ProxySQL中,密码是这样被hash的:SHA1(SHA1('clear_password'))

把一个hash密码转换为明文是根本不可能的

当客户端连接到ProxySQL时,是能通过hash密码进行认证的。

在这第一次客户端认证的过程中,ProxySQL能够获取经过一层加密的密码:SHA1('clear_password')。这个密码是被存储在runtime的,通过它ProxySQL就能够连接后端的mysql server。

How to input new passwords

ProxySQL admin接口没有PASSWORD()函数,也就是说:

  • 密码就是以他们插入的形式存储,明文或者是被hash过的
  • 当从admin输入密码的时候,他获取到的不可能是一个从明文经过加密的hash密码(但是你能在MySQL server上执行select password('password')并复制粘贴这个结果)

Variable admin-hash_passwords

为了支持hash密码加密,从ProxySQL v1.2.3开始引入了一个全局的布尔变量admin-hash_passwords,这个变量默认是启用的

当admin-hash_passwords=true时,只有在LOAD MYSQL USERS TO RUNTIME时密码会被自动加密。mysql_users表中的密码是不会被自动hash的。

但是,在mysql_users表中,密码是很容易被hash的,不管是缓存在内存中,还是持久化到磁盘。其实,从runtime状态复制就好了,比如执行LOAD MYSQL USERS TO RUNTIME后在SAVE MYSQL USERS FROM RUNTIME,然后在SAVE MYSQL USERS TO DISK

如下:

 1 Admin> SELECT * FROM mysql_users;
 2 Empty set (0.00 sec)
 3 
 4 Admin> INSERT INTO mysql_users(username,password) VALUES ('user1','password1'), ('user2','password2');
 5 Query OK, 2 rows affected (0.00 sec)
 6 
 7 Admin> SELECT username,password FROM mysql_users;
 8 +----------+-----------+
 9 | username | password  |
10 +----------+-----------+
11 | user1    | password1 |
12 | user2    | password2 |
13 +----------+-----------+
14 2 rows in set (0.00 sec)
15 
16 Admin> LOAD MYSQL USERS TO RUNTIME;
17 Query OK, 0 rows affected (0.00 sec)
18 
19 Admin> SELECT username,password FROM mysql_users;
20 +----------+-----------+
21 | username | password  |
22 +----------+-----------+
23 | user1    | password1 |
24 | user2    | password2 |
25 +----------+-----------+
26 2 rows in set (0.00 sec)
View Code

上面这一步,runtime的密码是被hash了的,但是mysql_users表中的任然没有被hash,为了是mysql_users表中的也hash:

 1 Admin> SAVE MYSQL USERS FROM RUNTIME;
 2 Query OK, 0 rows affected (0.00 sec)
 3 
 4 Admin> SELECT username,password FROM mysql_users;
 5 +----------+-------------------------------------------+
 6 | username | password                                  |
 7 +----------+-------------------------------------------+
 8 | user1    | *668425423DB5193AF921380129F465A6425216D0 |
 9 | user2    | *DC52755F3C09F5923046BD42AFA76BD1D80DF2E9 |
10 +----------+-------------------------------------------+
11 2 rows in set (0.00 sec)
View Code

然后我们就可以将他保存到磁盘:SAVE MYSQL USERS TO DISK

备注:

admin-hash_passwords是一个admin-变量,不是一个mysql-变量,这是因为他影响了admin的行为

这个细节很重要,因为你需要执行的是LOAD ADMIN VARIABLES TO RUNTIME,而不是LOAD MYSQL VARIABLES TO RUNTIME。

 

 

 

参考文档

转载于:https://www.cnblogs.com/geek-ace/p/9566969.html

### JMX Remote Password File Configuration and Usage JMX远程身份验证可以通过配置密码文件来实现更安全的身份验证机制。以下是关于如何配置和使用JMX远程密码文件的相关信息。 #### 密码文件的结构 JMX远程访问支持通过`jmxremote.password`文件定义用户名和密码对。该文件的内容通常如下所示: ```plaintext monitorRole qwerty controlRole abcdefg ``` 每行表示一个用户及其对应的密码。第一个字段是用户名,第二个字段是密码[^1]。此文件应具有严格的权限设置(通常是只读),以防止未经授权的访问。 #### 启用身份验证 为了启用基于密码的身份验证,在启动Java应用程序时需传递额外的参数。例如: ```bash -Dcom.sun.management.jmxremote.authenticate=true \ -Djava.rmi.server.hostname=<hostname> \ -Dcom.sun.management.jmxremote.password.file=/path/to/jmxremote.password ``` 其中: - `com.sun.management.jmxremote.authenticate=true` 表示启用了身份验证。 - `java.rmi.server.hostname` 设置RMI连接器绑定的主机名。 - `com.sun.management.jmxremote.password.file` 指定密码文件的位置[^5]。 #### 访问控制列表 除了密码文件外,还可以通过`jmxremote.access`文件进一步限制用户的操作权限。该文件定义了哪些角色可以执行特定的操作。其格式类似于以下内容: ```plaintext monitorRole readonly controlRole readwrite ``` 这里,“readonly”意味着用户只能查看MBeans的状态,而“readwrite”允许修改属性以及调用方法[^2]。 #### 安全注意事项 当配置JMX远程管理时,建议采取以下措施提高安全性: - 将敏感数据存储在受保护的地方,并确保只有必要的进程能够访问它们; - 使用SSL加密通信链路以防窃听攻击; - 如果可能的话,考虑部署防火墙规则仅限于可信客户端IP地址范围内的请求到达监听端口[^3]。 #### 示例代码片段 下面是一个简单的例子展示如何加载YAML格式配置并初始化JMX收集器对象: ```java public class Example { public static void main(String[] args) throws Exception { String path = "/config/jmx_exporter.yaml"; // 初始化JMX Collector实例 JmxCollector collector = new JmxCollector(new File(path)); System.out.println("Configuration loaded successfully."); } } ``` 上述程序会尝试从指定路径读取名为`jmx_exporter.yaml`的文件作为输入源创建一个新的`JmxCollector`实例[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值