MySQL安全配置學習筆記

遠程訪問

將端口3306添加到防火牆:

Centos 7爲firewall

firewall-cmd --permanent --add-port=13306/tcp #親測可用

開啓centos 6 防火牆3306端口方法

1)打開防火牆配置文件

vi /etc/sysconfig/iptables

2)增加下面一行

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

service iptables restart

 

安全配置

mysql中存在4個控制權限的表,分別爲

1. mysql.USER表

2. mysql.DB表

3. mysql.TABLES_PRIV表

4. mysql.COLUMNS_PRIV表

要注意的是,Mysql中有一個數據庫”information_schema”,似乎裏面保存的也是一些權限信息,但是要明白的是,這個數據庫”information_schema”是爲系統管理員提供元數據的一個簡便方式,它實際上是一個視圖,可以理解爲對Mysql中的一個信息的封裝,對於Mysql主程序來說,身份認證和授權的信息的來源只有一個,就是”mysql”。登錄的時候,mysql權限表的驗證過程爲:

1. 先從user表中的:         

1) Host         

2) User         

3) Password 這3個字段中判斷連接的ip、用戶名、密碼是否存在,存在則通過驗證。

2. 通過身份認證後,進行權限分配,按照:         

1) user         

2) db         

3) tables_priv         

4) columns_priv 的順序進行驗證。 即先檢查全局權限表user,如果user中對應的權限爲Y,則此用戶對所有數據庫的權限都爲Y,將不再檢查db,tables_priv,columns_priv 如果全局權限表user對應的權限爲N,則到db表中檢查此用戶對應的具體數據庫,並得到db中爲Y的權限 如果db中爲N,則檢查tables_priv中此數據庫對應的具體表,取得表中的權限Y,以此類推。逐級下降

 

Mysql的賬戶權限優先級順序是:

user->db->tables_priv->columns_pri

對於Mysql中的賬戶權限相關的安全配置,總結如下:

1. 針對每個網站建立一個單獨的賬戶

2. 爲每個網站單獨建立一個專屬數據庫(雖然DEDE、DZ普通採用表前綴的方法來實現"一庫多站",但好的做法還是"一庫一站") 

3. 按照user->db->tables_priv->columns_pri的順序進行細粒度的權限控制

4. 爲每個用戶單獨配置一個專屬數據庫,保證當前用戶的所有操作只能發生在它自己的數據庫中,防止SQL注入發生後,黑客通過注入點訪問到系統表

 

對Mysql的訪問IP的限制,可以從應用層和主機層來分別達到目的

1. 主機層:         

1) windows可以通過windows防火牆         

2) Linux下可以通過iptables //Centos 6及以下爲iptables 來限制允許訪問mysql端口的IP地址 //只允許指定的IP進行訪問 iptables -A INPUT -p tcp -s xxxx.xxxx.xxxx.xxxx/24 --dport 3306 -j ACCEPT iptables -A INPUT -p tcp -s xxxx.xxxx.xxxx.xxxx/24 --dport 3306 -j ACCEPT .. iptables -P INPUT DROP

可以看到,這種方法的缺點是硬編碼導致靈活性低,如果mysql的默認端口3306被修改了(例如8890),則這條iptables規則也需要相應的修改

對於mysql運行賬號的磁盤ACL配置,我們可以遵循以下原則

1. mysql運行賬號需要給予程序所在目錄的讀取權限,以及data目錄的讀取和寫入權限,保證mysql的正常運行

2. 不容許給予其他目錄的寫入和執行權限,特別是有網站的,這可以有效防禦針對mysql的提權、或者webshell提權         

1) udf提權         

2) 系統關鍵目錄、註冊表寫入啓動文件 

3. 取消mysql運行賬戶對於cmd,sh等一些程序的執行權限,這可以防禦當mysql核心帳號被黑客獲取後進一步提權         

1) root賬戶被泄露     由於對cmd、sh等關鍵程序進行了權限控制,黑客無法繼續深入操作系統提權

所以針對mysql程序帳號進行磁盤ACL控制,防止mysql越權讀/寫/執行非mysql目錄下的文件。

目前基於SQL注入檢測、防禦的的數據庫防火牆大概有以下幾個:

1. 安華金和數據庫防火牆系統(Xsecure-DBFirewall)

2. Snort入侵檢測系統 能針對指定端口進行正則特徵匹配方式的SQL注入檢測

3. Java/J2EE 過濾器 對於J2ee的WEB應用來說,可以在HTTP請求上部署過濾器,並將SQL注入檢測規律寫在過濾器中

4. druid-sql-wall開源SQL檢測、阻斷系統

mysqld安全相關啓動選項

1. --local-infile[={0|1}] 如果用–local-infile=0啓動服務器,則客戶端不能使用LOCAL in LOAD DATA語句,防止基於注入的直接文件讀取數據泄漏 

2. --old-passwords 強制服務器爲新密碼生成短(pre-4.1)密碼哈希。當服務器必須支持舊版本客戶端程序時,爲了保證兼容性這很有用。

3. (OBSOLETE) –safe-show-database         

1) 在MySQL 5.1以前版本的MySQL中,該選項使SHOW DATABASES語句只顯示用戶具有部分權限的數據庫名         

2) 在MySQL 5.1中,該選項不再作爲現在的 默認行爲使用,有一個SHOW DATABASES權限可以用來控制每個賬戶對數據庫名的訪問。

4. --safe-user-create 如果啓用,用戶不能用GRANT語句創建新用戶,除非用戶有mysql.user表的INSERT權限。如果你想讓用戶具有授權權限來創建新用戶,你應給用戶授予下面的權限: mysql> GRANT INSERT(user) ON mysql.user TO "user_name"@"host_name";這樣確保用戶不能直接更改權限列,必須使用GRANT語句給其它用戶授予該權限。

5. --secure-auth 不允許鑑定有舊(pre-4.1)密碼的賬戶。

6. --skip-grant-tables 這個選項導致服務器根本不使用權限系統。這給每個人以完全訪問所有的數據庫的權力,這個選項常常在發生了忘記了msyql密碼的情況使用這個方式在本機"無密碼登錄mysql"通過執行mysqladmin flush-privileges或mysqladmin eload命令,或執行FLUSH PRIVILEGES語句,你能告訴一個正在運行的服務器再次開始使用授權表。

忘記密碼操作流程:

a:kill mysql 進行, ps -ef |grep mysql 或是在數據目錄下localhost.localdomain.pid的文件中查看進程號

b:在mysql/bin下啓動mysqld_safe -uroot --skip-grant-tables

c:update mysql.user set password=passwrod('123456') where user='root' and host='%'

d:flush privileges 因是爲直接更新的表,所以需要重新加載權限表

 

7. --skip-name-resolve 主機名不被解析。所有在授權表的Host的列值必須是IP號或localhost 8. --skip-networking 在網絡上不允許TCP/IP連接。所有到mysqld的連接必須經由Unix套接字進行 9. --skip-show-database 使用該選項,只允許有SHOW DATABASES權限的用戶執行SHOW DATABASES語句,該語句顯示所有數據庫名。不使用該選項,允許所有用戶執行SHOW DATABASES,但只顯示用戶有SHOW DATABASES權限或部分數據庫權限的數據庫名。請注意全局權限指數據庫的權限。

10.--ssl

允許SSL連接,還必須指定--ssl-ca、--ssl-cert 和--ssl-key選項,如果不想啓用,則可以指定爲--skip-ssl或--ssl=0,例如:

grant select on *.* to 'user'@'host' require ssl;

--ssl-ca=file_name含可信ssl ca的清單文件的路徑

--ssl-cert=file_name ssl證書文件名,用於建立安全連接

--ssl-key=file_name ssl密鑰文件名,用於建立安全連接

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章