ProxySQL官檔翻譯__06_ProxySQL配置之密碼管理

06_ProxySQL配置之密碼管理

備註:文章編寫時間201904-201905期間,後續官方在github的更新沒有被寫入
~
~mysql

1、ProxySQL中的MySQL密碼[MySQL Passwords in ProxySQL]

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

2、密碼格式[Password formats]

不管是內存仍是磁盤上,密碼均可以在mysql_users.password表中以2種格式存儲:
1)純文本(明文)[plain text]
2)哈希密碼[hashed password]數據庫

純文本中的密碼很簡單,很是容易閱讀。即便數據庫和配置文件保存在安全位置,則安全問題仍然存在。散列密碼與MySQL服務器
存儲在mysql.user.password列中的密碼格式相同。後端

ProxySQL認爲以*開頭的密碼具備散列密碼。安全

3、散列密碼和身份驗證[Hashed passwords and authentication]

在MySQL和ProxySQL中,從明文到散列密碼的轉換爲SHA1[SHA1('clear_password')];而從散列密碼是沒法導出純文本密碼的。當客戶
端鏈接到ProxySQL時,可使用散列密碼對其進行身份驗證。在第一次客戶端身份驗證期間,ProxySQL能夠生成出部分哈希的密碼
SHA1('clear_password'),在運行期間,該信息將在內部進行存儲,並容許ProxySQL鏈接到後端。服務器

4、如何輸入新密碼[How to input new passwords]

在ProxySQL的Admin interface界面是沒有PASSWORD()相似的函數的,這意味着:
1)密碼以插入的格式存儲,能夠是純文本或散列;
2)在Admin interface界面輸入密碼時,沒法從純文本密碼中獲取散列密碼(而在MySQL中運行SELECT PASSWORD('password')是能夠的);架構

5、admin-hash_passwords參數[Variable admin-hash_passwords]

爲了便於支持散列密碼,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。

完畢!

相關文章
相關標籤/搜索