一. 操做系統層面安全html
對於數據庫來講,安全很重要,本章將從操做系統和數據庫兩個層面對mysql的安全問題進行了解。mysql
1. 嚴格控制操做系統帳號和權限linux
在數據庫服務器上要嚴格控制操做系統的帳號和權限,在安裝mysql時就要重視安全問題。
(1) 鎖定mysql用戶。
(2) 其它任何用戶都採起獨立的帳號登陸,管理員經過mysql專有用戶管理mysql服務,或者經過 root su到mysql用戶下進行管理。
(3) mysql用戶目錄下,除了數據文件目錄,其它文件和目錄屬主都改成root。sql
我本地mysql服務器上數據目錄,路徑:datadir=/usr/local/mysql/data, 屬主爲mysql, 以下所示:
shell
2. 儘可能避免以root權限運行mysql數據庫
mysql安裝完畢後,通常會將數據目錄屬主設置爲mysql用戶,而將mysql軟件目錄的屬主設置爲root。這樣作的目的是當使用mysql用戶啓動數據庫時,能夠防止任何具備file權限的用戶可以用root建立文件。而若是使用root用戶啓動數據庫,則任何具備file權限的用戶均可以讀寫root用戶的文件。這樣會作系統形成嚴重的安全隱患。安全
下面給mysql系統用戶設置密碼hsrjs*2018
使用系統用戶mysql經過xshell鏈接到linux服務器,啓動mysql成功,以下所示:
下面案例:試試test系統用戶鏈接mysql服務,若是啓動成功則有安全隱患,下面是啓動失敗。
下面案例:試試test系統用戶訪問data目錄,若是訪問成功則有安全隱患,下面是訪問失敗。
服務器
3. 防止dns欺騙
建立mysql用戶時,user權限表的host能夠指定域名或者ip地址, 可是若是指定域名,就可能帶來以下安全隱患: 若是域名對應的ip址址被惡意修改,則數據庫就會被惡意的ip地址進行訪問,致使安全隱患(這裏再也不深刻)。socket
二. 數據庫層面安全spa
2.1 刪除匿名帳號
有些版本中,安裝完mysql後,會自動安裝一個帳號, 在mysql5.7 裏沒有。
2.2 給root帳號設置口令
有些版本中,安裝完mysql後,root 默認口令爲空, 在mysql 5.7中安裝後有默認密碼。
2.3 設置安全密碼
密碼的安全體如今如下兩個方面:(1) 設置安全的密碼,建議使用6位以上字母,數字,下畫線和一些特殊字符組合而成的字符串。(2) 使用密碼期間儘可能保證使用過程安全,不被別人竊取。對於第二點,在使用密碼時,平常工做中通常有幾下幾種方式。
a. 方法1 直接將密碼寫在命令行中,以下所示:
b. 方法2使用交互式輸入密碼,以下所示:
c. 方法3 將用戶名和密碼寫在配置文件裏面,鏈接的時候自動讀取,好比應用鏈接數據庫或者執行一些批處理腳本,對於這種方式,mysql提供了在my.cnf裏配置,以下所示:
對於my.cnf配置文件要進行嚴格的權限控制(先改爲mysql屬主,再設置成600),以下:
[root@hsr ~]# chown -R mysql.mysql /etc/my.cnf [root@hsr ~]# chmod 600 /etc/my.cnf [root@hsr ~]# ls -l /etc/my.cnf -rw------- 1 mysql mysql 1072 10月 22 15:48 /etc/my.cnf -- 下面使用test系統用戶查看,提示權限不夠 [root@hsr ~]# su test [test@hsr root]$ cat /etc/my.cnf cat: /etc/my.cnf: 權限不夠
以上三種方法,第1種方法最不安全,由於是明文。第2種方法安全,但要交互。第3種方便,但要將配置文件設置嚴格的存取權限。
2.4 只授予帳號必須的權限
在不少狀況下,DBA 爲了方便,給用戶all privileges權限,這個權限超過了通常應用須要的權限,好比drop_priv等,這些權限若是誤操做,將會產生嚴重後果。
2.5 除root外,任何用戶不該有mysql庫user表的存取權限。
因爲mysql中能夠經過更改mysql數據庫的user表進行權限的增長,刪除,變動等操做,所以除了root之外,任何用戶都不該該擁有對user表存取權限(select,update,insert,delete等),好比:在前面章節建立的z1@localhost用戶,擁有了all privileges 權限,就能修改user表數據,若是修改了root用戶密碼,將致使root用戶登陸mysql失敗。
2.6 不要把file, process,super權限授予管理員以處的帳號
a. file權限主要做用是:(1)將數據庫的信息經過select .. into outfile.. 寫到服務器上有寫入權限的目錄下。(2)能夠將有讀權限的文本文件經過load data infile.. 命令寫入數據庫表,若是表中存放很重要的信息,對系統形成很大安全隱患。
b. process 權限能被用來執行「show processlist」 命令,查看當前全部用戶執行查詢的明文文本。
c. super權限能執行kill命令,終掉其它用戶進程(SHOW PROCESSLIST的ID進程值)。
-- 例如kill掉進程11 SHOW PROCESSLIST kill 11
2.7 drop table 命令並不收回之前的相關訪問受權
drop表的時候,其它用戶對此表的權限並無被收回,這樣致使從新建立同名的表時,之前其它用戶對此表的權限會自動賦予,進而產生權限外流。所以在刪除表時,要同時取消其它用戶在此表的相應權限。
2.8 使用ssl
ssl 是(secure socket yayer安全套接字層)是一種安全的傳輸協議,用於保障在internet上數據傳輸的安全。要使用ssl轉輸,須要先運行mysql_ssl_rsa_setup生成證書,配置my.cnf,重啓服務,配置mysql用戶(這裏不在深刻)。
-- 判斷是否啓用ssl SHOW GLOBAL VARIABLES LIKE 'have_%ssl';
2.9 最好給每一個用戶加上訪問ip限制
在建立用戶的時候,能夠指定user表host字段的ip或者hostname, 只有符合受權的ip或者hostname才能夠進行數據庫訪問。
2.10 其它
(1) skip-grant-tables
在忘記密碼時,能夠在my.cnf中加入skip-grant-tables,mysql用戶登陸後,在設置新密碼。這個功能在mysql 開發進階篇系列 29 數據庫二進制包安裝中有講到。skip-grant-tables是個選項是使服務器不使用權限系統,給每一個mysql用戶徹底訪問全部數據庫的權力。能過執行 mysqladmin flush-privileges或 mysqladmin reload或flush privileges語句,可讓一個正在運行的服務器再次開始使用受權表。
(2) 查看mysql密碼安全級別(不一樣版本不兼容,設置能夠報錯,具體查看錯誤日誌)
能夠在my.cnf中設置 validate_password_policy=LOW | MEDIUM | STRONG
SHOW VARIABLES LIKE 'validate_password_policy'