一、前言
很多文章中會說,數據庫的權限按最小權限為原則,這句話本身沒有錯,但是卻是一句空話。因為最小權限,這個東西太抽象,很多時候你並弄不清楚具體他需要哪 些權限。 現在很多mysql用着root賬戶在操作,並不是大家不知道用root權限太大不安全,而是很多人並不知道該給予什么樣的權限既安全又能保證正常運行。 所以,本文更多的是考慮這種情況下,我們該如何簡單的配置一個安全的mysql。注:本文測試環境為mysql-5.6.4
二、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,以此類推。
三、mysql有哪些權限
四、數據庫層面(db表)的權限分析
五、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數據庫對新建的賬戶默認有權限
六、mysql入侵提權分析及防止措施
一般來說,mysql的提權有這么幾種方式:
1 udf提權
此方式的關鍵導入一個dll文件,個人認為只要合理控制了進程賬戶對目錄的寫入權限即可防止被導入dll文件;然后如果萬一被攻破,此時只要進程賬戶的權限夠低,也沒辦執行高危操作,如添加賬戶等。
2 寫入啟動文件
這種方式同上,還是要合理控制進程賬戶對目錄的寫入權限。
3 當root賬戶被泄露
如果沒有合理管理root賬戶導致root賬戶被入侵,此時數據庫信息肯定是沒辦法保證了。但是如果對進程賬戶的權限控制住,以及其對磁盤的權限控制,服務器還是能夠保證不被淪陷的。
4 普通賬戶泄露(上述所說的,只對某個庫有所有權限的賬戶)
此處說的普通賬戶指網站使用的賬戶,我給的一個比較方便的建議是直接給予特定庫的所有權限。賬戶泄露包括存在注入及web服務器被入侵后直接拿到數據庫賬戶密碼。
此時,對應的那個數據庫數據不保,但是不會威脅到其他數據庫。而且這里的普通賬戶無file權限,所有不能導出文件到磁盤,當然此時還是會對進程的賬戶的權限嚴格控制。
普通賬戶給予什么樣的權限可以見上表,實在不會就直接給予一個庫的所有權限。
七、安全配置需要的常用命令
1.新建一個用戶並給予相應數據庫的權限
1
|
grant
select
,
insert
,
update
,
delete
,
create
,
drop
privileges
on
database
.*
to
user
@localhost identified
by
'passwd'
;
|
1
|
grant
all
privileges
on
database
.*
to
user
@localhost identified
by
'passwd'
;
|
2.刷新權限
1
|
flush
privileges
;
|
3. 顯示授權
1
|
show grants;
|
4. 移除授權
1
|
revoke
delete
on
*.*
from
'jack'
@
'localhost'
;
|
5. 刪除用戶
1
|
drop
user
'jack'
@
'localhost'
;
|
6. 給用戶改名
1
|
rename
user
'jack'
@
'%'
to
'jim'
@
'%'
;
|
7. 給用戶改密碼
1
|
SET
PASSWORD
FOR
'root'
@
'localhost'
=
PASSWORD
(
'123456'
);
|
8. 刪除數據庫
1
|
drop
database
test;
|
9. 從數據庫導出文件
1
|
select
*
from
a
into
outfile
"~/abc.sql"
|