Mysql安全配置

0x01 前言


不少文章中會說,數據庫的權限按最小權限爲原則,這句話自己沒有錯,可是倒是一句空話。由於最小權限,這個東西太抽象,不少時候你並弄不清楚具體他 須要哪些權限。 如今不少mysql用着root帳戶在操做,並非你們不知道用root權限太大不安全,而是不少人並不知道該給予什麼樣的權限既安全又能保證正常運行。 因此,本文更多的是考慮這種狀況下,咱們該如何簡單的配置一個安全的mysql。注:本文測試環境爲mysql-5.6.4 mysql

0x02 Mysql權限介紹


mysql中存在4個控制權限的表,分別爲user表,db表,tables_priv表,columns_priv表。 linux

mysql權限表的驗證過程爲: web

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有哪些權限


權限 sql

權限級別 數據庫

權限說明 windows

CREATE 安全

數據庫、表或索引 服務器

建立數據庫、表或索引權限 ide

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 user@localhost identified by 'passwd';

grant all privileges on database.* to user@localhost 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"
相關文章
相關標籤/搜索