【正文】
詳解MySQL數(shù)據(jù)庫安全配置.MySQL 是完全網(wǎng)絡(luò)化的跨平臺關(guān)系型數(shù)據(jù)庫系統(tǒng),同時是具有客戶機/服務(wù)器體系結(jié)構(gòu)的分布式數(shù)據(jù)庫管理系統(tǒng)?! ySQL 是完全網(wǎng)絡(luò)化的跨平臺關(guān)系型數(shù)據(jù)庫系統(tǒng),同時是具有客戶機/服務(wù)器體系結(jié)構(gòu)的分布式數(shù)據(jù)庫管理系統(tǒng)。它具有功能強、使用簡便、管理方便、運行速度快、安全可靠性強等優(yōu)點,用戶可利用許多語言編寫訪問MySQL 數(shù)據(jù)庫的程序,特別是與php更是黃金組合,運用十分廣泛?! ∮捎贛ySQL是多平臺的數(shù)據(jù)庫,它的默認配置要考慮各種情況下都能適用,所以在我們自己的使用環(huán)境下應該進行進一步的安全加固。作為一個MySQL的系統(tǒng)管理員,我們有責任維護MySQL數(shù)據(jù)庫系統(tǒng)的數(shù)據(jù)安全性和完整性。 MySQL數(shù)據(jù)庫的安全配置必須從兩個方面入手,系統(tǒng)內(nèi)部安全和外部網(wǎng)絡(luò)安全,另外我們還將簡單介紹編程時要注意的一些問題以及一些小竅門。 系統(tǒng)內(nèi)部安全 首先簡單介紹一下MySQL數(shù)據(jù)庫目錄結(jié)構(gòu)。MySQL安裝好,運行了mysql_db_install腳本以后就會建立數(shù)據(jù)目錄和初始化數(shù)據(jù)庫。如果我們用MySQL源碼包安裝,而且安裝目錄是/usr/local/mysql,那么數(shù)據(jù)目錄一般會是/usr/local/mysql/var。數(shù)據(jù)庫系統(tǒng)由一系列數(shù)據(jù)庫組成,每個數(shù)據(jù)庫包含一系列數(shù)據(jù)庫表。MySQL是用數(shù)據(jù)庫名在數(shù)據(jù)目錄建立建立一個數(shù)據(jù)庫目錄,各數(shù)據(jù)庫表分別以數(shù)據(jù)庫表名作為文件名,擴展名分別為MYD、MYI、frm的三個文件放到數(shù)據(jù)庫目錄中。 MySQL的授權(quán)表給數(shù)據(jù)庫的訪問提供了靈活的權(quán)限控制,但是如果本地用戶擁有對庫文件的讀權(quán)限的話,攻擊者只需把數(shù)據(jù)庫目錄打包拷走,然后拷到自己本機的數(shù)據(jù)目錄下就能訪問竊取的數(shù)據(jù)庫。所以MySQL所在的主機的安全性是最首要的問題,如果主機不安全,被攻擊者控制,那么MySQL的安全性也無從談起。其次就是數(shù)據(jù)目錄和數(shù)據(jù)文件的安全性,也就是權(quán)限設(shè)置問題?! 腗ySQL主站一些老的binary發(fā)行版來看,這樣非常危險,任何本地用戶都可以讀數(shù)據(jù)目錄,所以數(shù)據(jù)庫文件很不安全。,這種屬性也有些危險,本地的同組用戶既能讀也能寫,所以數(shù)據(jù)文件也不安全。,這樣就比較好,只有啟動數(shù)據(jù)庫的用戶可以讀寫數(shù)據(jù)庫文件,保證了本地數(shù)據(jù)文件的安全?!∪绻麊覯ySQL數(shù)據(jù)庫的用戶是mysql,那么象如下的目錄和文件的是安全的,請注意數(shù)據(jù)目錄及下面的屬性: shellls l /usr/local/mysql total 40 drwxrwxrx 2 root root 4096 Feb 27 20:07 bin drwxrwxrx 3 root root 4096 Feb 27 20:07 include drwxrwxrx 2 root root 4096 Feb 27 20:07 info drwxrwxrx 3 root root 4096 Feb 27 20:07 lib drwxrwxrx 2 root root 4096 Feb 27 20:07 libexec drwxrwxrx 3 root root 4096 Feb 27 20:07 man drwxrwxrx 6 root root 4096 Feb 27 20:07 mysqltest drwxrwxrx 3 root root 4096 Feb 27 20:07 share drwxrwxrx 7 root root 4096 Feb 27 20:07 sqlbench drwx 4 mysql mysql 4096 Feb 27 20:07 var shellls l /usr/local/mysql/var total 8 drwx 2 mysql mysql 4096 Feb 27 20:08 mysql drwx 2 mysql mysql 4096 Feb 27 20:08 test shellls l /usr/local/mysql/var/mysql total 104 rw 1 mysql mysql 0 Feb 27 20:08 rw 1 mysql mysql 1024 Feb 27 20:08 rw 1 mysql mysql 8778 Feb 27 20:08 rw 1 mysql mysql 302 Feb 27 20:08 rw 1 mysql mysql 3072 Feb 27 20:08 rw 1 mysql mysql 8982 Feb 27 20:08 rw 1 mysql mysql 0 Feb 27 20:08 rw 1 mysql mysql 1024 Feb 27 20:08 rw 1 mysql mysql 8641 Feb 27 20:08 rw 1 mysql mysql 0 Feb 27 20:08 rw 1 mysql mysql 1024 Feb 27 20:08 rw 1 mysql mysql 8958 Feb 27 20:08 rw 1 mysql mysql 0 Feb 27 20:08 rw 1 mysql mysql 1024 Feb 27 20:08 rw 1 mysql mysql 8877 Feb 27 20:08 rw 1 mysql mysql 428 Feb 27 20:08 rw 1 mysql mysql 2048 Feb 27 20:08 rw 1 mysql mysql 9148 Feb 27 20:08 如果這些文件的屬主及屬性不是這樣,請用以下兩個命令修正之: shellchown R /usr/local/mysql/var shellchmod R gorwx /usr/local/mysql/var 用root用戶啟動遠程服務(wù)一直是安全大忌,因為如果服務(wù)程序出現(xiàn)問題,遠程攻擊者極有可能獲得主機的完全控制權(quán)。,默認安裝后服務(wù)要用mysql用戶來啟動,不允許root用戶啟動。如果非要用root用戶來啟動,必須加上user=root的參數(shù)(./safe_mysqld user=root amp。)。因為MySQL中有LOAD DATA INFILE和SELECT ... INTO OUTFILE的SQL語句,如果是root用戶啟動了MySQL服務(wù)器,那么,數(shù)據(jù)庫用戶就擁有了root用戶的寫權(quán)限。不過MySQL還是做了一些限制的,比如LOAD DATA INFILE只能讀全局可讀的文件,SELECT ... INTO OUTFILE不能覆蓋已經(jīng)存在的文件?! ”镜氐娜罩疚募膊荒芎鲆暎╯hell的日志和MySQL自己的日志。有些用戶在本地登陸或備份數(shù)據(jù)庫的時候為了圖方便,有時會在命令行參數(shù)里直接帶了數(shù)據(jù)庫的密碼,如: shell/usr/local/mysql/bin/mysqldump uroot ptest test shell/usr/local/mysql/bin/mysql uroot ptest 這些命令會被shell記錄在歷史文件里,如果這些文件不慎被讀,那么數(shù)據(jù)庫的密碼就會泄漏。如果數(shù)據(jù)庫用戶用SQL語句修改了數(shù)據(jù)庫密碼。所以我們在shell登陸及備份的時候不要在p后直接加密碼,而是在提示后再輸入數(shù)據(jù)庫密碼?! ×硗膺@兩個文件我們也應該不讓它記錄我們的操作,以防萬一。 shellrm .bash_history .mysql_history shellln s /dev/null .bash_history shellln s /dev/null .mysql_history 上門這兩條命令把這兩個文件鏈接到/dev/null,那么我們的操作就不會被記錄到這兩個文件里了?!⊥獠烤W(wǎng)絡(luò)安全 MySQL數(shù)據(jù)庫安裝好以后,Unix平臺的user表是這樣的: mysql use mysql?! atabase changed mysql select Host,User,PassWord,Select_priv,Grant_priv from user?! ?+++++ | Host | User | Password | Select_priv | Grant_priv | ++++++ | localhost | root | | Y | Y | | redhat | root | | Y | Y | | localhost | | | N | N | | redhat | | | N | N | ++++++ 4 rows in set ( sec) Windows平臺的user表是這樣的: mysql use mysql?! atabase changed mysql select Host,User,Password,Select_priv,Grant_priv from user?! ?+++++ | Host | User | Password | Select_priv | Grant_priv | ++++++ | localhost | root | | Y | Y | | % | root | | Y | Y | | localhost | | | Y | Y | | % | | | N | N | ++++++ 4 rows in set ( sec) 我們先來看Unix平臺的user表。其中redhat只是我試驗機的機器名,所以實際上Unix平臺的MySQL默認只允許本機才能連接數(shù)據(jù)庫。但是缺省root用戶口令是空,所以當務(wù)之急是給root用戶加上口令。給數(shù)據(jù)庫用戶加口令有三種方法: 1)在shell提示符下用mysqladmin命令來改root用戶口令: shellmysqladmin uroot password test 這樣,MySQL數(shù)據(jù)庫root用戶的口令就被改成test了。(test只是舉例,我們實際使用的口令一定不能使用這種易猜的弱口令) 2)用set password修改口令: mysql set password for root@localhost=password(39。test39。)?! ∵@時root用戶的口令就被改成test了?! ?)直接修改user表的root用戶口令: mysql use mysql。 mysql update user set password=password(39。test39。) where user=39。root39?! ysql flush privileges。 這樣,MySQL數(shù)據(jù)庫root用戶的口令也被改成test了。其中最后一句命令flush privileges的意思是強制刷新內(nèi)存授權(quán)表,否則用的還是緩沖中的口令,這時非法用戶還可以用root用戶及空口令登陸,直到重啟MySQL服務(wù)器?! ∥覀冞€看到user為空的匿名用戶,雖然它在Unix平臺下沒什么權(quán)限,但為了安全起見我們應該刪除它: mysql delete from user where user=39。39。資料引用:MySQL數(shù)據(jù)庫性能優(yōu)化的關(guān)鍵參數(shù)MySQL性能優(yōu)化涉及到很多方面,本文就一些MySQL中的關(guān)鍵參數(shù)進行解說,這些參數(shù)在一定程度上是決定MySQL數(shù)據(jù)庫的性能關(guān)鍵參數(shù)。 我們在進行數(shù)據(jù)庫管理和開發(fā)中經(jīng)常會遇到性能問題,這就涉及到MySQL的性能優(yōu)化。通過在網(wǎng)絡(luò)上查找資料和筆者自己的嘗試,我認為以下系統(tǒng)參數(shù)是比較關(guān)鍵的: 關(guān)鍵參數(shù)一:back_log 要求 MySQL 能有的連接數(shù)量。當主要MySQL線程在一個很短時間內(nèi)得到非常多的連接請求,這就起作用,然后主線程花些時間(盡管很短)檢查連接并且啟動一個新線程。 back_log 值指出在MySQL暫時停止回答新請求之前的短時間內(nèi)多少個請求可以被存在堆棧中。只有如果期望在一個短時間內(nèi)有很多連接,你需要增加它,換句話說,這值 對到來的TCP/ip連接的偵聽隊列的大小。你的操作系統(tǒng)在這個隊列大小上有它自己