Mysql安全知識

1、避免從互聯網訪問MySQL數據庫,確保特定主機才擁有訪問特權

直接通過本地網絡之外的計算機改變生產環境中的數據庫是異常危險的。有時,管理員會打開主機對數據庫的訪問:

> GRANT ALL ON *.* TO ‘root’@’%’;

這其實是完全放開了對root的訪問。所以,把重要的操作限制給特定主機非常重要:

> GRANT ALL ON *.* TO ‘root’@’localhost’;

> GRANT ALL ON *.* TO ‘root’@’myip.athome’

> FLUSH PRIVILEGES

此時,你仍有完全的訪問,但只有指定的IP(不管其是否靜態)可以訪問。

2、定期備份數據庫

任何系統都有可能發生災難。服務器、MySQL也會崩潰,也有可能遭受***,數據有可能被刪除。只有爲最糟糕的情況做好了充分的準備,才能夠在事後快速地從災難中恢復。企業最好把備份過程作爲服務器的一項日常工作。

3、禁用或限制遠程訪問

前面說過,如果使用了遠程訪問,要確保只有定義的主機纔可以訪問服務器。這一般是通過TCP wrappers、iptables或任何其它的防火牆軟件或硬件實現的。

爲限制打開網絡socket,管理員應當在my.cnf或my.ini的[mysqld]部分增加下面的參數:

skip-networking

這些文件位於windows的C:\Program Files\MySQL\MySQL Server 5.1文件夾中,或在Linux中,my.cnf位於/etc/,或位於/etc/mysql/。這行命令在MySQL啓動期間,禁用了網絡連接的初始化。請注意,在這裏仍可以建立與MySQL服務器的本地連接。

另一個可行的方案是,強迫MySQL僅監聽本機,方法是在my.cnf的[mysqld]部分增加下面一行:

bind-address=127.0.0.1

如果企業的用戶從自己的機器連接到服務器或安裝到另一臺機器上的web服務器,你可能不太願意禁用網絡訪問。此時,不妨考慮下面的有限許可訪問:

mysql> GRANT SELECT, INSERT ON mydb.* TO ‘someuser’@’somehost’;

這裏,你要把someuser換成用戶名,把somehost換成相應的主機。

4、設置root用戶的口令並改變其登錄名

在linux中,root用戶擁有對所有數據庫的完全訪問權。因而,在Linux的安裝過程中,一定要設置root口令。當然,要改變默認的空口令,其方法如下:

Access MySQL控制檯:$ mysql -u root -p

在MySQL控制檯中執行:

> SET PASSWORD FOR ‘root’@’localhost’ = PASSWORD(‘new_password’);

在實際操作中,只需將上面一行的new_password換成實際的口令即可。

在Linux控制檯中更改root口令的另一種方法是使用mysqladmin工具:

$ mysqladmin -u root password new_password

此時,也是將上面一行的new_password換成實際的口令即可。

當然,這是需要使用強口令來避免強力***。

爲了更有效地改進root用戶的安全性,另一種好方法是爲其改名。爲此,你必須更新表用戶中的mySQL數據庫。在MySQL控制檯中進行操作:

> USE mysql;

> UPDATE user SET user=”another_username” WHERE user=”root”;

> FLUSH PRIVILEGES;

然後,通過Linux訪問MySQL控制檯就要使用新用戶名了:

$ mysql -u another_username -p

5、移除測試(test)數據庫

在默認安裝的MySQL中,匿名用戶可以訪問test數據庫。我們可以移除任何無用的數據庫,以避免在不可預料的情況下訪問了數據庫。因而,在MySQL控制檯中,執行:

> DROP DATABASE test;

6、禁用LOCAL INFILE

另一項改變是禁用”LOAD DATA LOCAL INFILE”命令,這有助於防止非授權用戶訪問本地文件。在PHP應用程序中發現有新的SQL注入漏洞時,這樣做尤其重要。

此外,在某些情況下,LOCAL INFILE命令可被用於訪問操作系統上的其它文件(如/etc/passwd),應使用下面的命令:

mysql> LOAD DATA LOCAL INFILE ‘/etc/passwd’ INTO TABLE table1

更簡單的方法是:

mysql> SELECT load_file(“/etc/passwd”)

爲禁用LOCAL INFILE命令,應當在MySQL配置文件的[mysqld]部分增加下面的參數:

set-variable=local-infile=0

7、移除匿名賬戶和廢棄的賬戶

有些MySQL數據庫的匿名用戶的口令爲空。因而,任何人都可以連接到這些數據庫。可以用下面的命令進行檢查:

mysql> select * from mysql.user where user=””;

在安全的系統中,不會返回什麼信息。另一種方法是:

mysql> SHOW GRANTS FOR ”@’localhost’;

mysql> SHOW GRANTS FOR ”@’myhost’;

如果grants存在,那麼任何人都可以訪問數據庫,至少可以使用默認的數據庫“test”。其檢查方法如下:

shell> mysql -u blablabla

如果要移除賬戶,則執行命令:

mysql> DROP USER “”;

從MySQL的5.0版開始支持DROP USER命令。如果你使用的老版本的MySQL,你可以像下面這樣移除賬戶:

mysql> use mysql;

mysql> DELETE FROM user WHERE user=””;

mysql> flush privileges;

8、降低系統特權

常見的數據庫安全建議都有“降低給各方的特權”這一說法。對於MySQL也是如此。一般情況下,開發人員會使用最大的許可,不像安全管理一樣考慮許可原則,而這樣做會將數據庫暴露在巨大的風險中。

爲保護數據庫,務必保證真正存儲MySQL數據庫的文件目錄是由”mysql” 用戶和” mysql”組所擁有的。

shell>ls -l /var/lib/mysql

此外,還要確保僅有用戶”mysql”和root用戶可以訪問/var/lib/mysql目錄。

Mysql的二進制文件存在於/usr/bin/目錄中,它應當由root用戶或特定的”mysql”用戶所擁有。對這些文件,其它用戶不應當擁有“寫”的訪問權:

shell>ls -l /usr/bin/my*

9、降低用戶的數據庫特權

有些應用程序是通過一個特定數據庫表的用戶名和口令連接到MySQL的,安全人員不應當給予這個用戶完全的訪問權。

如果***者獲得了這個擁有完全訪問權的用戶,他也就擁有了所有的數據庫。查看一個用戶許可的方法是在MySQL控制檯中使用命令SHOW GRANT

>SHOW GRANTS FOR ‘user’@’localhost’;

爲定義用戶的訪問權,使用GRANT命令。在下面的例子中,user1僅能從dianshang數據庫的billing表中選擇:

> GRANT SELECT ON billing.dianshang TO ‘user1’@’localhost’;

> FLUSH PRIVILEGES;

如此一來,user1用戶就無法改變數據庫中這個表和其它表的任何數據。

另一方面,如果你要從一個用戶移除訪問權,就應使用一個與GRANT命令類似的REVOKE命令:

> REVOKE SELECT ON billing.ecommerce FROM ‘user1’@’localhost’;

> FLUSH PRIVILEGES;

10、移除和禁用.mysql_history文件

在用戶訪問MySQL控制檯時,所有的命令歷史都被記錄在~/.mysql_history中。如果***者訪問這個文件,他就可以知道數據庫的結構。

$ cat ~/.mysql_history

爲了移除和禁用這個文件,應將日誌發送到/dev/null。

$export MYSQL_HISTFILE=/dev/null

上述命令使所有的日誌文件都定向到/dev/null,你應當從home文件夾移除.mysql_history:$ rm ~/.mysql_history,並創建一個到/dev/null的符號鏈接。

11、安全補丁

務必保持數據庫爲最新版本。因爲***者可以利用上一個版本的已知漏洞來訪問企業的數據庫。

12、啓用日誌

如果你的數據庫服務器並不執行任何查詢,建議你啓用跟蹤記錄,你可以通過在/etc/my.cnf文件的[Mysql]部分添加:log =/var/log/mylogfile。

對於生產環境中任務繁重的MySQL數據庫,因爲這會引起服務器的高昂成本。

此外,還要保證只有root和mysql可以訪問這些日誌文件。

錯誤日誌

務必確保只有root和mysql可以訪問hostname.err日誌文件。該文件存放在mysql數據歷史中。該文件包含着非常敏感的信息,如口令、地址、表名、存儲過程名、代碼等,它可被用於信息收集,並且在某些情況下,還可以向***者提供利用數據庫漏洞的信息。***者還可以知道安裝數據庫的機器或內部的數據。

MySQL日誌

確保只有root和mysql可以訪問logfileXY日誌文件,此文件存放在mysql的歷史目錄中。

13、改變root目錄

Unix操作系統中的chroot可以改變當前正在運行的進程及其子進程的root目錄。重新獲得另一個目錄root權限的程序無法訪問或命名此目錄之外的文件,此目錄被稱爲“chroot監獄”。

通過利用chroot環境,你可以限制MySQL進程及其子進程的寫操作,增加服務器的安全性。

你要保證chroot環境的一個專用目錄,如/chroot/mysql。此外,爲了方便利用數據庫的管理工具,你可以在MySQL配置文件的[client]部分改變下面的參數:

[client]

socket = /chroot/mysql/tmp/mysql.sock

14、禁用LOCAL INFILE命令

LOAD DATA LOCAL INFILE可以從文件系統中讀取文件,並顯示在屏幕中或保存在數據庫中。如果***者能夠從應用程序找到SQL注入漏洞,這個命令就相當危險了。下面的命令可以從MySQL控制檯進行操作:

> SELECT LOAD_FILE(“/etc/passwd”);

該命令列示了所有的用戶。解決此問題的最佳方法是在MySQL配置中禁用它,在CentOS中找到/etc/my.cnf或在Ubuntu中找到/etc/mysql/my.cnf,在[mysqld]部分增加下面一行:set-variable=local-infile=0。


待添加

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章