top
Loading...
5.6.1.通用安全指南
5.6.1. 通用安全指南

任何在與Internet聯網的計算機上使用MySQL的用戶都應仔細閱讀本節,以避免最常見的安全問題。

討論安全時,我們強調必須完全保護整個服務器主機的安全(而不只是MySQL服務器)防范各種類型的可能的攻擊:偷聽、修改、重放和拒絕服務。我們在這里不能覆蓋各方面的內容和措施。

MySQL根據訪問控制列表(ACL)對所有連接、查詢和其它用戶嘗試執行的操作進行安全管理。MySQL客戶端和服務器之間還支持SSL-加密連接。這兒討論的許多概念并不是MySQL專有的;該思想幾乎同樣適合所有應用程序。

運行MySQL時,應盡量遵從下面的指導:

·         不要讓任何人(除了MySQL root賬戶)訪問mysql數據庫中的user表!這很關鍵。加密的密碼才是MySQL中的真正的密碼。知道user表中所列的密碼并且能訪問該賬戶客訪問的主機的人可以很容易地用該用戶登錄

·         學習MySQL訪問權限系統。用GRANTREVOKE語句來控制對MySQL的訪問。不要授予超過需求的權限。決不能為所有主機授權。

檢查清單:

o        試試mysql -u root。如果你能夠成功連接服務器而沒有要任何密碼,則說明有問題。任何人可以作為MySQLroot用戶用它的全部權限來連接MySQL服務器!查閱MySQL安裝說明,應特別注意關于設置root密碼的信息。參見2.9.3節,“使初始MySQL賬戶安全”。

o        通過SHOW GRANTS語句檢查查看誰已經訪問了什么。然后使用REVOKE語句刪除不再需要的權限。

·         不要將純文本密碼保存到數據庫中。如果你的計算機有安全危險,入侵者可以獲得所有的密碼并使用它們。相反,應使用MD5()SHA1()或單向哈希函數。

·         不要從詞典中選擇密碼。有專門的程序可以破解它們。即使象“xfish98”這樣的密碼也很差。而“duag98”要好得多,雖然包含了相同的字“fish”,但從標準QWERTY鍵盤向左輸入。另一種方法是使用“Mhall”,來自句子“Mary had a little lamb.”中每個字的第一個字符。這樣很容易記住并輸入,但是不知道的人很難猜出來。

·         購買防火墻。這樣可以保護你防范各種軟件中至少50%的各種類型的攻擊。把MySQL放到防火墻后或隔離區(DMZ)

檢查清單:

o        試試從Internet使用nmap工具掃描端口。MySQL默認使用端口3306。不應從不可信任主機訪問該端口。另一種檢查是否MySQL端口打開的簡單方式是從遠程機器試試下面的命令,其中server_hostMySQL服務器運行的主機:

o                     shell> telnet server_host 3306

如果得到連接并得到一些垃圾字符,則端口打開著,則應從防火墻或路由器上關閉,除非你有合理的理由讓它開著。如果telnet掛起或連接被拒絕,則端口被阻塞,這是你所希望的。

不要信任應用程序的用戶輸入的任何數據。它們可以用Web形式、URL或構建的應用程序輸入特殊或逃溢字符序列來嘗試欺騙你的代碼。如果某個用戶輸入“; DROP DATABASE mysql;”等內容,應確保你的應用程序保持安全。這是特例,但當黑客使用類似技術時,如果你沒有做好準備,結果可能會出現大的安全漏洞和數據丟失。

一個常見的錯誤是只保護字符串數據值。一定要記住還應檢查數字數據。如果當用戶輸入值234時,應用程序生成查詢SELECT * FROM table WHERE ID=234用戶可以輸入值234 OR 1=1使應用程序生成查詢SELECT * FROM table WHERE ID=234 OR 1=1。結果是服務器查找表內的每個記錄。這樣會暴露每個記錄并造成過多的服務器負載。保護防范這類攻擊的最簡單的方法是使用單引號將數字常量引起來:SELECT * FROM table WHERE ID='234'。如果用戶輸入其它信息,均變為字符串的一部分。在數字部分,MySQL自動將字符串轉換為數字并剝離字符串包含的附加的非數字字符。

有時候人們會認為如果數據庫只包含供公共使用的數據,則不需要保護。這是不正確的。即使允許顯示數據庫中的任何記錄,你仍然應保護防范拒絕服務攻擊(例如,基于前面段落中所述的技術的攻擊,會使服務器浪費資源)。否則,你的服務器不再響應合法用戶。

檢查清單:

o        試試用Web形式輸入單引號和雙引號('’和‘")。如果得到任何形式的MySQL錯誤,立即分析原因。

o        試試修改動態URL,可以在其中添加%22(")%23(#)%27(')

o        試試在動態URL中修改數據類型,使用前面示例中的字符,包括數字和字符類型。你的應用程序應足夠安全,可以防范此類修改和類似攻擊。

o        試試輸入字符、空格和特殊符號,不要輸入數值字段的數字。你的應用程序應在將它們傳遞到MySQL之前將它們刪除或生成錯誤。將未經過檢查的值傳遞給MySQL是很危險的!

o        將數據傳給MySQL之前先檢查其大小。

o        用管理賬戶之外的用戶名將應用程序連接到數據庫。不要給應用程序任何不需要的訪問權限。

·         許多應用程序編程接口提供了措施逃逸數據值中的特殊字符。如果使用正確,可以防止應用程序用戶輸入使應用程序生成不期望的效果的語句的數值:

o        MySQL C API:使用mysql_real_escape_string() API調用。

o        MySQL++:查詢流使用escapequote修訂符。

o        PHP:使用mysql_escape_string()函數基于MySQL C API中的同名函數。(PHP 4.0.3之前,使用addslashes()PHP 5,可以使用mysqli擴展名,它支持改進的MySQL鑒定協議和密碼,以及用占位符編寫的語句。

o        Perl DBI:使用quote()方法或使用占位符。

o        Java JDBC:使用一個PreparedStatement對象和占位符。

其它編程接口有類似的功能。

·         不要通過Internet傳送明文(未加密的)數據。該信息可以被有足夠時間和能力來截取它并用于個人目的的任何人訪問。相反,應使用加密協議,例如SSLSSHMySQL支持內部SSL連接,例如版本 4.0.0。可以使用SSH端口映射為通信創建加密(并壓縮)的隧道。

·         學會使用tcpdumpstrings工具。在大多數情況下,你可以使用下面的命令檢查是否MySQL數據流未加密:

·                shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings

(該命令在Linux中可以工作,在其它系統中經過小小的修改后應可以工作)警告:如果你沒有看見明文數據,并不一定說明信息實際上被加密了。如果你需要較高級別的安全,你應咨詢安全專家。

作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/database-administration.html
北斗有巢氏 有巢氏北斗