Mysql安全配置

wyzsk發表於2020-08-19
作者: zhangsan · 2014/06/14 11:55

0x01 前言


很多文章中會說,資料庫的許可權按最小許可權為原則,這句話本身沒有錯,但是卻是一句空話。因為最小許可權,這個東西太抽象,很多時候你並弄不清楚具體他需要哪些許可權。 現在很多mysql用著root賬戶在操作,並不是大家不知道用root許可權太大不安全,而是很多人並不知道該給予什麼樣的許可權既安全又能保證正常執行。所以,本文更多的是考慮這種情況下,我們該如何簡單的配置一個安全的mysql。注:本文測試環境為mysql-5.6.4

0x02 Mysql許可權介紹


mysql中存在4個控制許可權的表,分別為user表,db表,tables_priv表,columns_priv表。

mysql許可權表的驗證過程為:

1,先從user表中的Host,User,Password這3個欄位中判斷連線的ip、使用者名稱、密碼是否存在,存在則透過驗證。
2,透過身份認證後,進行許可權分配,按照user,db,tables_priv,columns_priv的順序進行驗證。即先檢查全域性許可權表user,如果user中對應的許可權為Y,則此使用者對所有資料庫的許可權都為Y,將不再檢查db, tables_priv,columns_priv;如果為N,則到db表中檢查此使用者對應的具體資料庫,並得到db中為Y的許可權;如果db中為N,則檢查tables_priv中此資料庫對應的具體表,取得表中的許可權Y,以此類推。

0x03 mysql有哪些許可權


許可權

許可權級別

許可權說明

CREATE

資料庫、表或索引

建立資料庫、表或索引許可權

DROP

資料庫或表

刪除資料庫或表許可權

GRANT OPTION

資料庫、表或儲存的程式

賦予許可權選項

REFERENCES

資料庫或表

 

ALTER

更改表,比如新增欄位、索引等

DELETE

刪除資料許可權

INDEX

索引許可權

INSERT

插入許可權

SELECT

查詢許可權

UPDATE

更新許可權

CREATE VIEW

檢視

建立檢視許可權

SHOW VIEW

檢視

檢視檢視許可權

ALTER ROUTINE

儲存過程

更改儲存過程許可權

CREATE ROUTINE

儲存過程

建立儲存過程許可權

EXECUTE

儲存過程

執行儲存過程許可權

FILE

伺服器主機上的檔案訪問

檔案訪問許可權

CREATE TEMPORARY TABLES

伺服器管理

建立臨時表許可權

LOCK TABLES

伺服器管理

鎖表許可權

CREATE USER

伺服器管理

建立使用者許可權

PROCESS

伺服器管理

檢視程式許可權

RELOAD

伺服器管理

執行flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, reload等命令的許可權

REPLICATION CLIENT

伺服器管理

複製許可權

REPLICATION SLAVE

伺服器管理

複製許可權

SHOW DATABASES

伺服器管理

檢視資料庫許可權

SHUTDOWN

伺服器管理

關閉資料庫許可權

SUPER

伺服器管理

執行kill執行緒許可權

0x04 資料庫層面(db表)的許可權分析


許可權

說明

網站使用賬戶是否給予

Select   

可對其下所有表進行查詢

建議給予

Insert            

可對其下所有表進行插入

建議給予

Update               

可對其下所有表進行更新

建議給予

Delete                   

可對其下所有表進行刪除

建議給予

Create                  

可在此資料庫下建立表或者索引

建議給予

Drop                 

可刪除此資料庫,及此資料庫下的表

不建議給予

Grant               

賦予許可權選項

不建議給予

References             

未來MySQL特性的佔位符

不建議給予

Index                

可對其下的所有表進行索引

建議給予

Alter                  

可對其下的所有表進行更改

建議給予

Create_tmp_table          

建立臨時表

不建議給予

Lock_tables             

可對其下所有表進行鎖定

不建議給予

Create_view              

可在此資料下建立檢視

建議給予

Show_view             

可在此資料下檢視檢視

建議給予

Create_routine         

可在此資料下建立儲存過程

不建議給予

Alter_routine        

可在此資料下更改儲存過程

不建議給予

Execute         

可在此資料下執行儲存過程

不建議給予

Event               

可在此資料下建立事件排程器

不建議給予

Trigger

可在此資料下建立觸發器

不建議給予

0x05 mysql安全配置方案


1 限制訪問mysql埠的ip

windows可以透過windows防火牆或者ipsec來限制,linux下可以透過iptables來限制。

2 修改mysql的埠

windows下可以修改配置檔案my.ini來實現,linux可以修改配置檔案my.cnf來實現。

3 對所有使用者設定強密碼並嚴格指定對應賬號的訪問ip

mysql中可在user表中指定使用者的訪問可訪問ip

4 root特權賬號的處理

建議給root賬號設定強密碼,並指定只容許本地登入

5 日誌的處理

如需要可開啟查詢日誌,查詢日誌會記錄登入和查詢語句。

6 mysql程式執行賬號

在windows下禁止使用local system來執行mysql賬戶,可以考慮使用network service或者自己新建一個賬號,但是必須給與mysql程式所在目錄的讀取許可權和data目錄的讀取和寫入許可權; 在linux下,新建一個mysql賬號,並在安裝的時候就指定mysql以mysql賬戶來執行,給與程式所在目錄的讀取許可權,data所在目錄的讀取和寫入許可權。

7 mysql執行賬號的磁碟許可權

1)mysql執行賬號需要給予程式所在目錄的讀取許可權,以及data目錄的讀取和寫入許可權 
2)不容許給予其他目錄的寫入和執行許可權,特別是有網站的。 
3)取消mysql執行賬戶對於cmd,sh等一些程式的執行許可權。

8 網站使用的mysql賬戶的處理

新建一個賬戶,給予賬戶在所使用資料庫的所有許可權即可。這樣既能保證網站對所對應的資料庫的全部操作,也能保證賬戶不會因為許可權過高而影響安全。給予單個資料庫的所有許可權的賬戶不會擁有super, process, file等管理許可權的。 當然,如果能很明確是的知道,我的網站需要哪些許可權,還是不要多給許可權,因為很多時候釋出者並不知道網站需要哪些許可權,我才建議上面的配置。而且我指的通用的,具體到只有幾臺機器,不多的情況下,我個人建議還是給予只需要的許可權,具體可參考上面的表格的建議。

9 刪除無用資料庫

test資料庫對新建的賬戶預設有許可權

0x06 mysql入侵提權分析及防止措施


一般來說,mysql的提權有這麼幾種方式:

1 udf提權 此方式的關鍵匯入一個dll檔案,個人認為只要合理控制了程式賬戶對目錄的寫入許可權即可防止被匯入dll檔案;然後如果萬一被攻破,此時只要程式賬戶的許可權夠低,也沒辦執行高危操作,如新增賬戶等。

2 寫入啟動檔案

這種方式同上,還是要合理控制程式賬戶對目錄的寫入許可權。

3 當root賬戶被洩露

如果沒有合理管理root賬戶導致root賬戶被入侵,此時資料庫資訊肯定是沒辦法保證了。但是如果對程式賬戶的許可權控制住,以及其對磁碟的許可權控制,伺服器還是能夠保證不被淪陷的。

4 普通賬戶洩露(上述所說的,只對某個庫有所有許可權的賬戶)

此處說的普通賬戶指網站使用的賬戶,我給的一個比較方便的建議是直接給予特定庫的所有許可權。賬戶洩露包括存在注入及web伺服器被入侵後直接拿到資料庫賬戶密碼。

此時,對應的那個資料庫資料不保,但是不會威脅到其他資料庫。而且這裡的普通賬戶無file許可權,所有不能匯出檔案到磁碟,當然此時還是會對程式的賬戶的許可權嚴格控制。

普通賬戶給予什麼樣的許可權可以見上表,實在不會就直接給予一個庫的所有許可權。

0x07 安全配置需要的常用命令


1.新建一個使用者並給予相應資料庫的許可權

grant select,insert,update,delete,create,drop privileges on database.* to [email protected] identified by 'passwd';

grant all privileges on database.* to [email protected] identified by 'passwd';

2.重新整理許可權

flush privileges;

3. 顯示授權

show grants;

4. 移除授權

revoke delete on *.* from 'jack'@'localhost';

5. 刪除使用者

drop user 'jack'@'localhost';

6. 給使用者改名

rename user 'jack'@'%' to 'jim'@'%';

7. 給使用者改密碼

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');

8. 刪除資料庫

drop database test;

9. 從資料庫匯出檔案

select * from a into outfile "d:\abc.vbs"
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!