Windows下MySQL配置及安全加固總結
在網管的實際使用過程中,MySQL數據庫在安裝后的配置及安全加固內容,在客戶中逐漸要求越來越高。從反饋的問題看,一般都是由第三方軟件公司的軟件掃描整個系統,mysql的相關內容不符合要求測試肯定不能通過。自動檢測的軟件,主要使用兩種判斷方式:一、根據mysql官方發布的信息判斷當前版本是否有已知的嚴重bug;二、進入mysql數據庫,通過執行各種查詢命令,檢查相應的功能開關是否打開。對於第一種,需要我們從mysql的官方網站更新當前最新版本來解決;第二種,由於目前流行的mysql加固很多都是在linux\unix系統,與windows系統的操作有所不同,所以需要與檢驗人員進行協商,采用windows下的操作方式,達到該安全加固目的即可。
本文檔中的mysql數據庫都是基於mysql-5.5.33-win32.msi版本。
1. 網管相關
背景信息
網管相關的修改內容是為了提高網管的性能。該部分內容對CS網管有實際意義,EzView使用中即使不添加,也沒有出現過異常。但是遷移恢復CS數據時,一定要增加該部分內容,否則有可能數據恢復不完全。
該部分實際與安全加固內容沒有關系。
操作步驟
修改mysql安裝路徑(如:C:\Program Files\MySQL\MySQL Server 5.5)下的my.ini文件,在文件最后增加如下信息:
skip-name-resolve
back_log=200
innodb_file_per_table=1 innodb_file_format='Barracuda'
字段解釋
Skip-name-resolve
--該項為“禁用DNS反向解析”,可以消除MySQL進行DNS解析的時間,目的是為了提高mysql的遠程連接速度;
Back_log=200
--該項為在MySQL暫時停止響應新請求之前的短時間內多少個請求可以被存放在堆棧中;
innodb_file_per_table=1
--該項為 修改InnoDB為獨立表空間模式,每個數據庫的每個表都會生成一個數據空間;
innodb_file_format=’Barracuda’
--該項為 設置innodb文件類型為Barracuda
后兩項的作用是啟用壓縮格式,緊縮數據庫表的大小。
2.安全加固
背景信息
該部分內容主要是通過深圳移動測試反饋的內容進行總結,主要涉及用戶、權限、日志、遠程等方面。
此處說明一下mysql命令行的進入方式。
完全按照操作手冊安裝完mysql后,在cmd命令行可輸入如下命令進入本地mysql:
mysql -u root -p
輸入密碼后回車即可。
登錄到遠程主機的mysql,輸入如下命令:
mysql -h 172.18.10.160 -u root -p
輸入密碼后回車即可。
或者進入“開始>所有程序>mysql>MySQL Server 5.5>MySQL 5.5 Command Line Client”,輸入root用戶密碼回車即可。
加固內容
2.1 Mysql root用戶的密碼
安全加固測試時,密碼絕對不能用root! 目前安裝手冊中默認都是“Admin_123456”。
加固測試會檢查密碼是否為空或者弱密碼。
Mysql命令行修改root用戶密碼方法:
mysql> update user set password=password('test!p3') where user='root'; mysql> flush privileges;
2.2 防止文件注入
說明:mysql默認是允許文件注入的。
比如在mysql命令行輸入 load data local infile ‘D:\pet.txt’ into table tmp;
該命令意為將本地D盤的pet.txt文件寫入表tmp,利用這個功能是可以做很多很多事的,有興趣的可以研究下。
解決辦法:
在my.ini中 最后添加
local_infile=0
保存文件,重啟mysql服務。
驗證方法:
再輸一遍剛才的命令,出現錯誤提示,則說明設置成功。
mysql> LOAD DATA LOCAL INFILE 'D:\pet.txt'INTO TABLE TMP;
ERROR 1148 (42000): The used command is not allowed with this MySQL version
2.2 日志輸出
說明:mysql實際上默認是有error的日志文件輸出的,默認是在data文件夾下,默認路徑C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.5\data。
一般以主機名命名,后綴是.err。
安全加固要求一般要求有以下幾種日志:查詢日志、錯誤日志、二進制日志、更新日志、慢查詢日志。
在mysql 5.0及以上版本中,二進制日志取代了更新日志。
解決辦法:
在my.ini中 最后添加以下字段:
log=C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.5\data\log.log
log_err=C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.5\data\err.log
log_bin=C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.5\data\binary.bin
log_slave_updates=1
long_query_time=2
log_slow_queries=C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.5\data\slowqueries.log
這里藍色部分的路徑和文件的名稱都是可以自定義的。如果都不填寫,則系統會用默認的名稱放在默認路徑下。
保存文件,重啟mysql服務。
字段說明:
log:查詢日志
log_err:錯誤日志
log_bin:二進制日志
log_slave_updates:需啟用二進制日志后才生效,涉及到主從mysql,有興趣自查。
long_query_time:長查詢時間標准,單位秒。
Log_slow_queries:慢查詢日志。
驗證方法:
查詢\錯誤\慢查詢 日志,會在重啟后自動生成.log的文件。二進制 日志,
例如binary.bin實際上會生成binary.index和binary.0000001的文件,每次mysql服務啟動或者flush logs都會自動生成一個序號+1的文件。
安全監測的方法實際上就是檢查一下mysql中相應字段是否存在。可以在mysql中輸入如下命令自查(兩幅圖分別是填了路徑和未填路徑的情況):
2.3最大連接數
說明:實際上在安裝mysql后的設置界面中,可以設置最大連接數,但是實際操作中發現即使設置了1000,進入my.ini發現max_connections的值也不是1000.所以安全檢測有可能該項就不符合。
解決辦法:
將my.ini中max_connections=值改為1000,保存文件,重啟mysql服務。
驗證方法:
可在mysql命令行用該命令驗證
2.4mysql運行系統用戶問題 // http://www.pprar.com
說明:安全加固要求服務器所在的主機不能是最高權限的用戶(administrator)來操作mysql,一般都是建一個專門操作mysql的用戶,這個用戶除了對mysql相關的文件具有完全權限外,不能對其他文件進行操作。Linux\unix系統下處理比較方便,例如新建一個mysqluser的用戶,在my.cnf文件中mysqld下輸入user=mysqluser 就可以了,除了mysqluser這個用戶可以啟動mysql服務,即使root用戶也不能啟動mysql。Windows下操作稍微復雜一點。
解決辦法:
新建一個低權限用戶mysql,使mysql用戶可以運行mysql服務。
新建一個系統用戶mysql,例如使mysql僅具有guest用戶組的權限。
我的電腦右鍵>管理>本地用戶和組,新建用戶mysql,設置密碼Admin123,右鍵屬性>隸屬於guest。
在mysql程序的安裝路徑和數據存放路徑給mysql用戶添加權限。
進入控制面板>管理工具>服務,在mysql服務上右鍵屬性>登錄,選擇此賬戶,輸入賬戶的密碼。單擊確定,保存。
使用mysql賬戶登錄就可以在低權限的賬戶下運行mysql服務了。
2.5mysql數據庫用戶問題
說明:一般檢查是否有匿名用戶,最高權限用戶有幾個,是否可以新建賬戶。按安裝說明安裝的話,一般都是沒有匿名賬戶的,如果在設置root密碼的界面勾選了enable root access from remote machines,則執行命令select user,host from mysql.user; 會發現有兩個root用戶,root %和root localhost。
解決方法:
匿名賬戶:mysql命令行輸入select user,host from mysql.user;查看用戶即可,看是否有用戶名為空的用戶存在。
刪除匿名賬戶可采用以下命令:
mysql>use mysql; mysql>delete from user where User = ''; mysql> flush privileges;
最高權限用戶:CS網管必須要有root %用戶。Ezview網管可以不用root %用戶,對於有這項工程需求的用戶可以在安裝mysql的時候,enable root access from remote machines 不勾選。
已安裝完成的可以通過命令行執行下圖命令,刪除root %用戶。
一般不建議刪除root用戶,最好在安裝時就設置好,否則可能影響mysql的再配置。
新建賬戶:使用root localhost用戶登錄,新建用戶即可。
執行成功的話,提示如截圖。
驗證方法:輸入如下命令
使用新用戶登錄mysql。
附加說明:
假如使用新建的用戶來操作網管,可給該用戶只添加hisysdb的最高權限,避免對服務器上其他數據庫進行操作。
Flush privileges;命令是必要的,刷新權限后,dbtool就可以使用新賬戶登錄了。
為了保證網管使用,修改release\server\profile 路徑下dataSource.xml文件,將用戶名由root改為新建的用戶,如pppadmin。
property name="username" value="root"/> 注:文件有兩處地方都要改value的值。
這樣初始化數據庫才沒有問題。
2.6限制遠程連接
說明:在早期的mysql版本和linux\unix系統下,直接在my.ini或my.cnf中輸入skip_networking,保存重啟即可。這種方式限制mysql只能在本地訪問,而且禁止了TCP端口,用pipe方式訪問。安全加固測試時這項不通過,一般就是在my.ini里沒有配置該項內容,但是windows下用了該方式,mysql服務可以啟動,但是ezview網管就無法使用了。
解決辦法:
Mysql提供了新的限制只在本地訪問的方法,在my.ini中最后添加如下字段:
bind-address=127.0.0.1
保存文件,重啟mysql服務即可。
驗證方法:
可以使用root %用戶,或者新建一個host不是localhost的賬戶遠程登錄mysql服務器看是否可以成功。
例如:
添加bin-address之前,從局域網內的其他主機如172.18.10.160可以通過命令
mysql –h 172.18.10.83 –u root –p 訪問到172.18.10.83主機上的mysql,
添加bind-address=127.0.0.1之后,重啟服務
再用相同命令,就會提示登錄失敗了。