mysql 安全改造說明--借用人家的

MySQL數據庫一向以高性能、高可性和易用性著稱,它已經成爲世界上最流行的開源數據庫。大量的我的、WEB開發者、大型公司等都在其網站、關鍵系統、軟件包中普遍使用MySQL數據庫。mysql

  一般,許多企業在部署一種產品時,安全性經常得不到應有的重視。企業最關心的是使其能夠儘快地運行,企業由此也能夠儘快贏利。linux

  但有的企業在安裝MySQL時用的是默認選項,由此形成其數據不安全,且服務器也面臨被入侵的風險,並有可能在短期內就出現性能問題。下面將提供保障MySQL安全的最佳方法。web

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

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

  > GRANT ALL ON *.* TO 'root'@'%';數據庫

  這實際上是徹底放開了對root的訪問。因此,把重要的操做限制給特定主機很是重要:windows

  > GRANT ALL ON *.* TO 'root'@'localhost';安全

  > GRANT ALL ON *.* TO 'root'@'myip.athome'服務器

  > FLUSH PRIVILEGES網絡

  此時,你仍有徹底的訪問,但只有指定的IP(無論其是否靜態)能夠訪問。

  二、按期備份數據庫

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

  三、禁用或限制遠程訪問

  前面說過,若是使用了遠程訪問,要確保只有定義的主機才能夠訪問服務器。這通常是經過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換成相應的主機。

  四、設置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

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

  在默認安裝的MySQL中,匿名用戶能夠訪問test數據庫。咱們能夠移除任何無用的數據庫,以免在不可預料的狀況下訪問了數據庫。於是,在MySQL控制檯中,執行:

  > DROP DATABASE test;

  六、禁用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

  七、移除匿名帳戶和廢棄的帳戶

  有些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;

  八、下降系統特權

  常見的數據庫安全建議都有「下降給各方的特權」這一說法。對於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*

  九、下降用戶的數據庫特權

  有些應用程序是經過一個特定數據庫表的用戶名和口令鏈接到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;

  十、移除和禁用.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的符號連接。

  十一、安全補丁

  務必保持數據庫爲最新版本。由於攻擊者能夠利用上一個版本的已知漏洞來訪問企業的數據庫。

  十二、啓用日誌

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

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

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

  錯誤日誌

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

  MySQL日誌

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

  1三、改變root目錄

  Unix操做系統中的chroot能夠改變當前正在運行的進程及其子進程的root目錄。從新得到另外一個目錄root權限的程序沒法訪問或命名此目錄以外的文件,此目錄被稱爲「chroot監獄」。

  經過利用chroot環境,你能夠限制MySQL進程及其子進程的寫操做,增長服務器的安全性。

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

  [client]

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

  1四、禁用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。搞定。

  固然,脣亡齒寒,保護服務器的安全對於保障MySQL數據庫的安全也是相當重要的。服務器的安全對於數據庫來講可謂生死攸關。

相關文章
相關標籤/搜索