備註:文章編寫時間201904-201905期間,後續官方在github的更新沒有被寫入
~
~mysql
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
不管是內存仍是磁盤上,密碼均可以在mysql_users.password表中以2種格式存儲:
1)純文本(明文)[plain text]
2)哈希密碼[hashed password]數據庫
純文本中的密碼很簡單,很是容易閱讀。即便數據庫和配置文件保存在安全位置,則安全問題仍然存在。散列密碼與MySQL服務器
存儲在mysql.user.password列中的密碼格式相同。後端
ProxySQL認爲以*開頭的密碼具備散列密碼。安全
在MySQL和ProxySQL中,從明文到散列密碼的轉換爲SHA1[SHA1('clear_password')];而從散列密碼是沒法導出純文本密碼的。當客戶
端鏈接到ProxySQL時,可使用散列密碼對其進行身份驗證。在第一次客戶端身份驗證期間,ProxySQL能夠生成出部分哈希的密碼
SHA1('clear_password'),在運行期間,該信息將在內部進行存儲,並容許ProxySQL鏈接到後端。服務器
在ProxySQL的Admin interface界面是沒有PASSWORD()相似的函數的,這意味着:
1)密碼以插入的格式存儲,能夠是純文本或散列;
2)在Admin interface界面輸入密碼時,沒法從純文本密碼中獲取散列密碼(而在MySQL中運行SELECT PASSWORD('password')是能夠的);架構
爲了便於支持散列密碼,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。
完畢!