不少文章中會說,數據庫的權限按最小權限爲原則,這句話自己沒有錯,可是倒是一句空話。由於最小權限,這個東西太抽象,不少時候你並弄不清楚具體他 須要哪些權限。 如今不少mysql用着root帳戶在操做,並非你們不知道用root權限太大不安全,而是不少人並不知道該給予什麼樣的權限既安全又能保證正常運行。 因此,本文更多的是考慮這種狀況下,咱們該如何簡單的配置一個安全的mysql。注:本文測試環境爲mysql-5.6.4 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,以此類推。
權限 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線程權限 |
權限 |
說明 |
網站使用帳戶是否給予 |
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 |
可在此數據下建立觸發器 |
不建議給予 |
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數據庫對新建的帳戶默認有權限
通常來講,mysql的提權有這麼幾種方式:
1 udf提權 此方式的關鍵導入一個dll文件,我的認爲只要合理控制了進程帳戶對目錄的寫入權限便可防止被導入dll文件;而後若是萬一被攻破,此時只要進程帳戶的權限夠低,也沒辦執行高危操做,如添加帳戶等。
2 寫入啓動文件
這種方式同上,仍是要合理控制進程帳戶對目錄的寫入權限。
3 當root帳戶被泄露
若是沒有合理管理root帳戶致使root帳戶被入侵,此時數據庫信息確定是沒辦法保證了。可是若是對進程帳戶的權限控制住,以及其對磁盤的權限控制,服務器仍是可以保證不被淪陷的。
4 普通帳戶泄露(上述所說的,只對某個庫有全部權限的帳戶)
此處說的普通帳戶指網站使用的帳戶,我給的一個比較方便的建議是直接給予特定庫的全部權限。帳戶泄露包括存在注入及web服務器被入侵後直接拿到數據庫帳戶密碼。
此時,對應的那個數據庫數據不保,可是不會威脅到其餘數據庫。並且這裏的普通帳戶無file權限,全部不能導出文件到磁盤,固然此時仍是會對進程的帳戶的權限嚴格控制。
普通帳戶給予什麼樣的權限能夠見上表,實在不會就直接給予一個庫的全部權限。
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"