前兩天在幫朋友整理他的主頁空間時候,發現的一點關於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的默認支持。