數據庫系統的安全性包括很多方面。由於很多情況下,數據庫服務器容許客戶機從網絡上連接,因此客戶機連接的安全對MySQL數據庫安全有很重要的影響。
不在客戶機的命令行上提供密碼
使用mysql、mysqladmin等客戶機用一個用戶身份與MySQL服務器連接時,需要為連接提供密碼。
1可以在命令行上提供密碼
shell>MySQL –u root –pmypass
注意,-p選項與密碼之間不可有空格,否則會提示你輸入密碼,並報錯。
你也可以使用長格式
shell>MySQL –user=root –passWord=mypass
現在你可以考察這樣做的後果:
在Unix上,$ps –aux | grep MySQL
在win9x上,你可以按住Ctrl+Alt+Del鍵,NT上你可以打開任務管理器。
你發現了什麼,你發現密碼清清楚楚的顯示在你的面前。所以,你無論何時也不要這麼做。
所以你需要讓客戶機提示你的密碼:
shell>MySQL –u root –p
你也可以使用選項文件提供密碼,但是注意為了安全,不能在選項文件中存儲密碼。你可以只提供passWord選項,讓客戶機提示你輸入密碼。
使用SSH加密客戶機連接
這是一個關於怎樣用SSH 得到一個安全的連接遠程MySQL服務器的注意事項(David Carlson)。
在你的Windows機器上安裝SSH客戶 - 我使用了一個來自http://www.doc.ic.ac.uk/~ci2/ssh/的免費SSH客戶。其他有用的鏈接:
http://www.npaci.edu/Security/npaci_security_software.Html
http://www.npaci.edu/Security/samples/ssh32_Windows/index.Html.
啟動SSH。設置主機名字 = 你的MySQL服務器名或IP地址,設置userid=你的用戶名登錄到你的服務器。
點擊“local forWords”。設定local port: 3306, host: localhost, remote port: 3306
保存一切,否則下次你將必須再做一遍。
用SSH登錄到你的服務器。
啟動一些ODBC應用程序(例如Access)。
創造一個新文件並且用ODBC驅動程序鏈接到MySQL,就像你通常做的一樣,除了對服務器用用戶“localhost”。
搞定。它對一個直接的因特網連接工作得很好。
不要使用Unix的root用戶運行MySQL守護進程
不要作為Unix的root用戶運行MySQL守護進程。mysqld能以任何用戶運行,你也可以創造一個新的Unix用戶mysql使一切更安全。如果你作為其它Unix用戶運行mysqld,你不需要改變在user表中的root用戶名,因為MySQL用戶名與Unix 用戶名沒關系。
你可以作為其它Unix用戶編輯mysql.server啟動腳本mysqld。或者使用選項文件。有關如何用非root用戶啟動MySQL服務器的細節,請見第二章。
數據庫目錄的安全
MySQL服務器提供了一個通過MySQL數據庫中的授權表,實現了一個十分靈活的權限系統,保證了從網絡訪問數據的安全性。但是,如果服務器主機上的其它用戶擁有對服務器目錄的直接訪問權,那麼你的服務器的數據仍舊是不安全的。
一般你可能用一個非特權的Unix用戶執行守護程序。檢查那個運行MySQLd的Unix用戶是唯一的在數據庫目錄下有讀/寫權限的用戶。
可能的安全漏洞
顯然,你不會讓服務器主機上的其它用戶擁有對數據庫目錄文件的寫訪問權,但是,僅僅是讀訪問權也非常危險。
由於象GRANT和SET PASSWORD這樣的查詢都被記錄到日志中去了,常規和更新日志文件包含了有關密碼的敏感查詢文本。如果一個攻具有對這些日志的讀訪問權,那麼他只要在日志文件中查找GRANT或PASSWord這樣的敏感單詞,就很容易找到密碼的明文。
對於表文件的讀訪問也是很危險的,竊取文件並使MySQL以及以純文本的形式顯示表的內容是微不足道的事。可以按下列步驟進行:
1、安裝一個新的MySQL分發,可以是在另一台主機上,也可以就在當前的服務器主機上安裝,使用與正式服務器不同的端口、套接字和數據文件。
2、將竊取的表的相應文件拷貝到新服務數據庫目錄中的test目錄下
3、然後就可以啟動作案服務器,可以隨意訪問所竊取表的內容。
在Unix設置合適的數據庫目錄權限
如果要消除這些安全漏洞,就要安排數據庫目錄及其中所有文件和目錄的所有權,是的只有啟動服務器的專用帳戶才可以訪問它們。操作步驟如下:
1、切換到root用戶
$su
2、設置數據庫目錄及其中所有文件目錄的所有權為運行該服務器的帳號所有,在本書中一直將這個帳號假定為MySQL,把所有的組設為root組
%chown –R MySQL:root DATADIR
3、修改數據庫目錄及其中所有文件目錄的權限為只有所有者可以讀寫
%chmod –R go-rwx DATADIR
在NT系統中設置合適的數據庫目錄權限
在NT系統中的數據庫目錄的安全性可能比較簡單:
讀者可能想到,把所有目錄文件改為只有某個帳戶administrator例如可讀寫。但是,這樣會有一個問題,就是這能在 administrator帳戶中用手動啟動獨立的服務器,如果讓MySQL系統服務自動啟動的方法也不可行,解決方法是讓數據庫目錄也可被 administrators組用戶讀寫,這樣MySQL服務器就可以用系統服務的方法自動啟動了,也可以在任何帳戶中用net start MySQL啟動。
另外一個問題是,如果你在非administrators組用戶中或者從網絡都無法建立數據庫連接,因為沒有數據庫目錄的讀的權利,如果要正常使用,還需要 寫的權利。解決方法是讓SYSTEM組用戶能夠隊數據庫目錄讀寫。
由於許可證和費用的原因,通常建議你在Linux服務器上使用MySQL,在Windows平台之用來測試或者數據錄入工作。但是,如果你要在Windows上使用的話,可以注意本小節的一些內容。
影響安全的MySQLd選項
下列MySQLd選項影響安全:
--secure
由gethostbyname()系統調用返回的IP數字被檢查,確保他們解析回到原來的主機名。這對某些外人通過模仿其它主機獲得存取權限變得更難。這個選項也增加一些聰明的主機名檢查。在MySQL3.21裡,選擇缺省是關掉的,因為它有時它花很長時間執行反向解析。MySQL 3.22緩存主機名並缺省地啟用了這個選項。
--skip-grant-tables
這個選項導致服務器根本不使用權限系統。這給每個人以完全存取所有的數據庫的權力!(通過執行MySQLadmin reload,你能告訴一個正在運行的服務器再次開始使用授權表。)
--skip-name-resolve
主機名不被解析。所有在授權表的Host的列值必須是IP數字或localhost。
--skip-networking
在網絡上不允許TCP/IP連接。所有到MySQLd的連接必須經由Unix套接字進行。這個選項對使用MIT-pthreads的系統是不合適的,因為MIT-pthreads包不支持Unix套接字。