前兩天在幫朋友整理他的主頁空間時候,發現的一點關于mysql可能大家都會忽略的問題:
我們知道,在安裝完MySQL后,它會自動創建一個root用戶和一個匿名用戶,其初始密碼都是空,對于前者,很多參考資料上都會提醒大家要注意及時設定一個密碼,而忽略了后者,大概是因為后者默認設定為只能在本機使用的緣故吧。
但如果你的mysql是要提供給web服務器作數據庫服務的,忽略這個匿名用戶的代價可能相當慘重,因為在默認設置下,這個匿名用戶在localhost上幾乎擁有和root一樣的權限,這時候,如果你的客戶擁有上傳腳本文件、腳本文件可以進行mysql數據庫操作(比如允許操作mysql的php)的權限已經可能將你的MySQL改動得面目全非了:
我今天幫朋友整理他的主頁空間的時候,試著寫了一個很簡單的執行sql語句的php文件上傳上去,其中連接字中的user,password我都試著置空,host=localhost,結果發現我的sql語句可以執行,于是執行select * from mysql.user察看用戶權限,發現這個用戶在localhost權限非常高,連grant_priv都有,(察看的時候,會發現在root用戶下有兩行用戶名、密碼為空的,但各項權限有y\n的,就是這個匿名用戶本地、遠程權限設置了)
所以我試著用這個php頁面創建一個新用戶,并grant給他較高的權限,結果一舉成功,這樣我就可以用這個新用戶通過我本機的mysql client連接到這個網站的mysql server,并用這個新建立的用戶的管理權限對這個網站的mysql server進行管理,看到自己可以進行這樣輕易獲得深入的數據庫操作,我怎么還敢把朋友的主頁空間的敏感資料放入這個mysql server呢?
改進建議:
1。在安裝完成mysql 后,不僅改變root用戶的的密碼,也同時改變匿名用戶的密碼,方法類似改變root的密碼的方式:
Mysql> UPDATE user set password=PASSWORD(@#yournewpassword@#) where user=@#@#;
Mysql>FLUSH PRIVILEGES;
2。如非必要,刪除這個匿名用戶,這樣所有人要使用mysql 都必須提供用戶名,即便日后出了問題,也容易查找問題的源頭。
3。除了root用戶外,其他用戶包括匿名用戶(如果沒有刪除這個用戶)不應該擁有grant權限,防止管理權限不受控制的擴散出去。
4。賦予用戶update\delete\alert\create\drop權限的時候,應該限定到特定的數據庫,尤其要避免普通客戶擁有對mysql數據庫做操作的權限,否則你的系統設置很可能被替換掉。
5。檢查mysql.user表,取消不必要用戶的shutdown_priv,reload_priv,process_priv和File_priv權限,這些權限可能泄漏更多的服務器信息包括非mysql的其它信息出去。
6。如果不打算讓你的用戶使用mysql數據庫,在提供諸如php這樣的腳本語言的時候,重新設置或編譯你的php,取消它們對mysql的默認支持。