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

06_ProxySQL配置之密碼管理

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

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

ProxySQL是一種協議感知代理。
由於ProxySQL基於流量執行路由,因此當客戶端連接時,它無法識別目標HostGroup,因此ProxySQL需要對客戶端進行身份驗證。
因此,它需要具有與用戶密碼相關的一些信息:一些足以允許身份驗證的信息。

ProxySQL也需要這些信息與後端建立連接,或在已建立的連接中發出CHANGE_USER。

3層配置架構也適用於用戶信息。
ProxySQL將用戶信息存儲在表mysql_users中:
1)對象MySQL_Authentication()負責在RUNTIME層存儲這些信息;
2)main.mysql_users是MEMORY層的數據庫;
3)disk.mysql_users是DISK層上的數據庫。

二、密碼格式[Password formats]

無論是內存還是磁盤上,密碼都可以在mysql_users.password表中以2種格式存儲:
1)純文本(明文)[plain text]
2)哈希密碼[hashed password]

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

ProxySQL認爲以*開頭的密碼具有散列密碼。

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

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

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

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

五、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 ,這樣就將哈希
後的密碼信息保存到了內存和磁盤(推薦)。

示例:

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。

完畢!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章