mysql 開發進階篇系列 55 權限與安全(安全事項 )
一. 操作系統層面安全
對於數據庫來說,安全很重要,本章將從操作系統和數據庫兩個層面對mysql的安全問題進行了解。
1. 嚴格控制操作系統賬號和權限
在數據庫服務器上要嚴格控制操作系統的賬號和權限,在安裝mysql時就要重視安全問題。
(1) 鎖定mysql用戶。
(2) 其它任何用戶都采取獨立的賬號登錄,管理員通過mysql專有用戶管理mysql服務,或者通過 root su到mysql用戶下進行管理。
(3) mysql用戶目錄下,除了數據文件目錄,其它文件和目錄屬主都改為root。
我本地mysql服務器上數據目錄,路徑:datadir=/usr/local/mysql/data, 屬主為mysql, 如下所示:
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地址進行訪問,導致安全隱患(這裏不再深入)。
二. 數據庫層面安全
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語句,可以讓一個正在運行的服務器再次開始使用授權表。
mysql 開發進階篇系列 55 權限與安全(安全事項 )