GRANT ALL ON *.* TO ';root'@'%' 這其" />
直接通過本地網(wǎng)絡(luò)之外的計算機改變生產(chǎn)環(huán)境中的數(shù)據(jù)庫是異常危險的。有時,管理員會打開主機對數(shù)據(jù)庫的訪問:
> GRANT ALL ON *.* TO ';root'@'%'
這其實是完全放開了對root的訪問。所以,把重要的操作限制給特定主機非常重要:
> GRANT ALL ON *.* TO 'root'@'localhost';
> GRANT ALL ON *.* TO 'root'@'myip.athome'
> FLUSH PRIVILEGES
此時,你仍有完全的訪問,但只有指定的IP(不管其是否靜態(tài))可以訪問。
2、定期備份數(shù)據(jù)庫
任何系統(tǒng)都有可能發(fā)生災(zāi)難。服務(wù)器、MySQL也會崩潰,也有可能遭受入侵,數(shù)據(jù)有可能被刪除。只有為最糟糕的情況做好了充分的準備,才能夠在事后快速地從災(zāi)難中恢復(fù)。企業(yè)最好把備份過程作為服務(wù)器的一項日常工作。
3、禁用或限制遠程訪問
前面說過,如果使用了遠程訪問,要確保只有定義的主機才可以訪問服務(wù)器。這一般是通過TCP wrappers、iptables或任何其它的防火墻軟件或硬件實現(xiàn)的。
為限制打開網(wǎng)絡(luò)socket,管理員應(yīng)當(dāng)在my.cnf或my.ini的[mysqld]部分增加下面的參數(shù):
skip-networking
這些文件位于windows的C:\Program Files\MySQL\MySQL Server 5.1文件夾中,或在Linux中,my.cnf位于/etc/,或位于/etc/mysql/。這行命令在MySQL啟動期間,禁用了網(wǎng)絡(luò)連接的初始化。請注意,在這里仍可以建立與MySQL服務(wù)器的本地連接。
另一個可行的方案是,強迫MySQL僅監(jiān)聽本機,方法是在my.cnf的[mysqld]部分增加下面一行:
bind-address=127.0.0.1
如果企業(yè)的用戶從自己的機器連接到服務(wù)器或安裝到另一臺機器上的web服務(wù)器,你可能不太愿意禁用網(wǎng)絡(luò)訪問。此時,不妨考慮下面的有限許可訪問:
mysql> GRANT SELECT, INSERT ON mydb.* TO ';someuser'@'somehost'
這里,你要把someuser換成用戶名,把somehost換成相應(yīng)的主機。
4、設(shè)置root用戶的口令并改變其登錄名
在linux中,root用戶擁有對所有數(shù)據(jù)庫的完全訪問權(quán)。因而,在Linux的安裝過程中,一定要設(shè)置root口令。當(dāng)然,要改變默認的空口令,其方法如下:
Access MySQL控制臺:
$ mysql -u root -p
在MySQL控制臺中執(zhí)行:
> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');
在實際操作中,只需將上面一行的new_password換成實際的口令即可。
在Linux控制臺中更改root口令的另一種方法是使用mysqladmin工具:
$ mysqladmin -u root password new_password
此時,也是將上面一行的new_password換成實際的口令即可。
當(dāng)然,這是需要使用強口令來避免強力攻擊。
為了更有效地改進root用戶的安全性,另一種好方法是為其改名。為此,你必須更新表用戶中的mySQL數(shù)據(jù)庫。在MySQL控制臺中進行操作:
> USE mysql;
> UPDATE user SET user="another_username" WHERE user="root";
> FLUSH PRIVILEGES;
然后,通過Linux訪問MySQL控制臺就要使用新用戶名了:
$ mysql -u another_username -p
5、移除測試(test)數(shù)據(jù)庫
在默認安裝的MySQL中,匿名用戶可以訪問test數(shù)據(jù)庫。我們可以移除任何無用的數(shù)據(jù)庫,以避免在不可預(yù)料的情況下訪問了數(shù)據(jù)庫。因而,在MySQL控制臺中,執(zhí)行:
> DROP DATABASE test;
6、禁用LOCAL INFILE
另一項改變是禁用”LOAD DATA LOCAL INFILE”命令,這有助于防止非授權(quán)用戶訪問本地文件。在PHP應(yīng)用程序中發(fā)現(xiàn)有新的SQL注入漏洞時,這樣做尤其重要。
此外,在某些情況下,LOCAL INFILE命令可被用于訪問操作系統(tǒng)上的其它文件(如/etc/passwd),應(yīng)使用下現(xiàn)的命令:
mysql> LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE table1
更簡單的方法是:
mysql> SELECT load_file("/etc/passwd")
為禁用LOCAL INFILE命令,應(yīng)當(dāng)在MySQL配置文件的[mysqld]部分增加下面的參數(shù):
set-variable=local-infile=0
7、移除匿名賬戶和廢棄的賬戶
有些MySQL數(shù)據(jù)庫的匿名用戶的口令為空。因而,任何人都可以連接到這些數(shù)據(jù)庫??梢杂孟旅娴拿钸M行檢查:
mysql> select * from mysql.user where user="";
在安全的系統(tǒng)中,不會返回什么信息。另一種方法是:
mysql> SHOW GRANTS FOR ''@'localhost';
mysql> SHOW GRANTS FOR ';'@'myhost'
如果grants存在,那么任何人都可以訪問數(shù)據(jù)庫,至少可以使用默認的數(shù)據(jù)庫“test”。其檢查方法如下:
shell> mysql -u blablabla
如果要移除賬戶,則執(zhí)行命令:
mysql> DROP USER "";
從MySQL的5.0版開始支持DROP USER命令。如果你使用的老版本的MySQL,你可以像下面這樣移除賬戶:
mysql> use mysql;
mysql> DELETE FROM user WHERE user="";
mysql> flush privileges;
8、降低系統(tǒng)特權(quán)
常見的數(shù)據(jù)庫安全建議都有“降低給各方的特權(quán)”這一說法。對于MySQL也是如此。一般情況下,開發(fā)人員會使用最大的許可,不像安全管理一樣考慮許可原則,而這樣做會將數(shù)據(jù)庫暴露在巨大的風(fēng)險中。
為保護數(shù)據(jù)庫,務(wù)必保證真正存儲MySQL數(shù)據(jù)庫的文件目錄是由”mysql” 用戶和” mysql”組所擁有的。
shell>ls -l /var/lib/mysql
此外,還要確保僅有用戶”mysql”和root用戶可以訪問/var/lib/mysql目錄。
Mysql的二進制文件存在于/usr/bin/目錄中,它應(yīng)當(dāng)由root用戶或特定的”mysql”用戶所擁有。對這些文件,其它用戶不應(yīng)當(dāng)擁有“寫”的訪問權(quán):
shell>ls -l /usr/bin/my*
9、降低用戶的數(shù)據(jù)庫特權(quán)
有些應(yīng)用程序是通過一個特定數(shù)據(jù)庫表的用戶名和口令連接到MySQL的,安全人員不應(yīng)當(dāng)給予這個用戶完全的訪問權(quán)。
如果攻擊者獲得了這個擁有完全訪問權(quán)的用戶,他也就擁有了所有的數(shù)據(jù)庫。查看一個用戶許可的方法是在MySQL控制臺中使用命令SHOW GRANT
>SHOW GRANTS FOR ';user'@'localhost'
為定義用戶的訪問權(quán),使用GRANT命令。在下面的例子中,user1僅能從dianshang數(shù)據(jù)庫的billing表中選擇:
> GRANT SELECT ON billing.dianshang TO 'user1'@'localhost';
> FLUSH PRIVILEGES;
如此一來,user1用戶就無法改變數(shù)據(jù)庫中這個表和其它表的任何數(shù)據(jù)。
另一方面,如果你要從一個用戶移除訪問權(quán),就應(yīng)使用一個與GRANT命令類似的REVOKE命令:
> REVOKE SELECT ON billing.ecommerce FROM 'user1'@'localhost';
> FLUSH PRIVILEGES;
10、移除和禁用.mysql_history文件
在用戶訪問MySQL控制臺時,所有的命令歷史都被記錄在~/.mysql_history中。如果攻擊者訪問這個文件,他就可以知道數(shù)據(jù)庫的結(jié)構(gòu)。
$ cat ~/.mysql_history
為了移除和禁用這個文件,應(yīng)將日志發(fā)送到/dev/null。
$export MYSQL_HISTFILE=/dev/null
上述命令使所有的日志文件都定向到/dev/null,你應(yīng)當(dāng)從home文件夾移除.mysql_history:$ rm ~/.mysql_history,并創(chuàng)建一個到/dev/null的符號鏈接。
11、安全補丁
務(wù)必保持數(shù)據(jù)庫為最新版本。因為攻擊者可以利用上一個版本的已知漏洞來訪問企業(yè)的數(shù)據(jù)庫。
12、啟用日志
如果你的數(shù)據(jù)庫服務(wù)器并不執(zhí)行任何查詢,建議你啟用跟蹤記錄,你可以通過在/etc/my.cnf文件的[Mysql]部分添加:log =/var/log/mylogfile。
對于生產(chǎn)環(huán)境中任務(wù)繁重的MySQL數(shù)據(jù)庫,因為這會引起服務(wù)器的高昂成本。
此外,還要保證只有root和mysql可以訪問這些日志文件。
錯誤日志
務(wù)必確保只有root和mysql可以訪問hostname.err日志文件。該文件存放在mysql數(shù)據(jù)歷史中。該文件包含著非常敏感的信息,如口令、地址、表名、存儲過程名、代碼等,它可被用于信息收集,并且在某些情況下,還可以向攻擊者提供利用數(shù)據(jù)庫漏洞的信息。攻擊者還可以知道安裝數(shù)據(jù)庫的機器或內(nèi)部的數(shù)據(jù)。
MySQL日志
確保只有root和mysql可以訪問logfileXY日志文件,此文件存放在mysql的歷史目錄中。
13、改變root目錄
Unix操作系統(tǒng)中的chroot可以改變當(dāng)前正在運行的進程及其子進程的root目錄。重新獲得另一個目錄root權(quán)限的程序無法訪問或命名此目錄之外的文件,此目錄被稱為“chroot監(jiān)獄”。
通過利用chroot環(huán)境,你可以限制MySQL進程及其子進程的寫操作,增加服務(wù)器的安全性。
你要保證chroot環(huán)境的一個專用目錄,如/chroot/mysql。此外,為了方便利用數(shù)據(jù)庫的管理工具,你可以在MySQL配置文件的[client]部分改變下面的參數(shù):
[client]
socket = /chroot/mysql/tmp/mysql.sock
14、禁用LOCAL INFILE命令
LOAD DATA LOCAL INFILE可以從文件系統(tǒng)中讀取文件,并顯示在屏幕中或保存在數(shù)據(jù)庫中。如果攻擊者能夠從應(yīng)用程序找到SQL注入漏洞,這個命令就相當(dāng)危險了。下面的命令可以從MySQL控制臺進行操作:
> SELECT LOAD_FILE("/etc/passwd");
該命令列示了所有的用戶。解決此問題的最佳方法是在MySQL配置中禁用它,在CentOS中找到/etc/my.cnf或在Ubuntu中找到/etc/mysql/my.cnf,在[mysqld]部分增加下面一行:set-variable=local-infile=0。搞定。
當(dāng)然,唇亡齒寒,保護服務(wù)器的安全對于保障MySQL數(shù)據(jù)庫的安全也是至關(guān)重要的。服務(wù)器的安全對于數(shù)據(jù)庫來說可謂生死攸關(guān)。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com