1. 程式人生 > >mysql 開發進階篇系列 55 許可權與安全(安全事項 )

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),如下:

[[email protected] ~]# chown -R  mysql.mysql /etc/my.cnf
[[email protected] ~]# chmod 600 /etc/my.cnf
[[email protected] ~]# ls -l /etc/my.cnf
-rw------- 1 mysql mysql 1072 10月 22 15:48 /etc/my.cnf
-- 下面使用test系統使用者檢視,提示許可權不夠
[[email protected] ~]# su test
[[email protected] 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等),比如:在前面章節建立的[email protected]使用者,擁有了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語句,可以讓一個正在執行的伺服器再次開始使用授權表。