MySQL資料庫安全管理
▊Outlines MySQL的安全機制 MySQL權限系統 保護使用者帳戸 系統安全管理
▊MySQL的安全機制 我們要登錄MySQL資料庫時,需要輸入帳號和密碼。但是MySQL資料庫和作業系統的帳號和密碼不一定要相同。 MySQL資料庫底下有六個主要的資料表格:columns_priv資料表、db資料表、func資料表、host資料表、tables_priv資料表和user資料表。 其中和權限有關的資料表有五個: columns_priv:和特定欄位的權限有關 db:對資料庫的權限設定有關 host:對特定連線主機和使用者組合的權限有關 tables_priv:對資料表的權限設定有關 user:和全域性的權限有關。
MySQL權限系統 MySQL在權限系統上可分為兩個階段: 檢查使用者是否擁有登入到MySQL資料庫系統的權限 (驗証階段) 透過授權資料表來判斷是否擁有足夠的特定查詢指令權限 (授權階段)
第一階段:驗証階段 檢查使用者是否擁有登入到MySQL資料庫系統的權限 當我們要連接到MySQL資料庫伺服器時,我們輸入使用者名稱(username)、連線主機(host)和密碼(password) 。這時,MySQL會檢查使用者資料表 (user table)來看看我們是否可以連線, 如果不符合即不會連結到該伺服器。
我們使用describe user來顯示我們user資料表的欄位內容。 有使用者的名稱User、密碼Password和主機Host,也有我們SQL敘述的權限,而權限的類型Type是屬於Enum(‘n’,’y’),’有’或’沒有’。 在user資料表中不允許使用者名稱出現萬用字元’%’。 一般使用者通常沒有全域性的權限。
在user資料表的記錄,記載著某一個使用者是否有全域性的權限。 右表為欄位名稱所對應的權限內容,就部份內容說明如下: Alter_priv權限允許使用者修改資料表的內容 Create_priv則設定使用者是否可以新建資料庫和資料表 Delete_priv權限設定使用者是否可以執行刪除資料(DELETE)敘述
第二階段:授權階段 透過授權資料表來判斷是否擁有足夠的特定查詢指令權限。 當使用者進入MySQL資料庫後,db、host、tables_priv、columns_priv資料表會設定使用者的各項權限。 在進行特定指令之前,MySQL會依據授權資料表來判定該使用者是否擁有足的權限。
我們使用describe db來顯示我們db資料表的欄位內容。 有使用者的名稱User、資料庫Db和主機Host,也有我們SQL敘述的權限,而權限的類型Type是屬於Enum(‘n’,’y’),’有’或’沒有’。 在db資料表中不允許使用者名稱出現萬用字元’%’。
我們使用describe host來顯示我們Host資料表的欄位內容。 在這裏有資料庫Db和主機Host,也有我們SQL敘述的權限,而權限的類型Type是屬於Enum(‘n’,’y’),’有’或’沒有’。 MySQL將db和host資料表配合使用來控制存取資料庫的權限。
我們使用describe tables_priv來顯示我們資料表tables_priv的欄位內容。 在這裏有資料庫Db、使用者User和主機Host。
我們使用describe columns_priv來顯示我們columns_priv資料表的欄位內容。
我們可以使用show grants敘述來查看使用者目前的權限。 root是超級使用者,一般我們都授與全部(ALL)的權限(PRIVILEGES)給他,localhost是我們主機的名稱。
lulu是一般使用者,localhost是我們主機的名稱。lulu的權限有select、insert、update、delete,而辨別lulu的密碼為已經加密過的’19b68057189b027f’。
保護使用者帳戸 設定root密碼 刪除匿名帳戸 危險的權限 (設定管理者層級的權限給其他人時) 不論在Windows或Linux作業系統,MySQL在安裝後,皆會產生匿名帳號,為求安全起見,可利用下列方式來刪除匿名帳號: Delete from user where user=“”; Delete from db where user=“”; 危險的權限 (設定管理者層級的權限給其他人時) Process: 允許使用者使用指令 “Show processlist” ,這樣將會揭露所有的查詢執行程序 ,等於是讓使用者資料曝光。 With Grant Option: 若給予其他使用者此權限,即准許使用者彼此分享權限,可能會導致DBA 辛辛苦苦建立的權限架構崩潰。 File: 可讓使用者藉由指令 “Load data infile”從伺服器載入檔案(密碼檔或資料庫檔等)。
管理者層級權限
▊系統安全管理 For Database Server: For System: MySQL資料庫使用存取控制列表(ACL)的方式來管理權限。 資料庫伺服器會維護一組儲存使用者權限的資料表,這組資料表所記載的權限可以針對資料庫、資料表或欄位來對不同的使用者作授權。 For System: MySQL會以常駐程式的方式來提供服務,因此我們的作業系統和網路服務的安全機制也需同時考量。 若無法控制作業系統內的檔案存取,而耗費時間去規劃MySQL的使用者權限設定,到頭來會白忙一場。所以需注意作業系統相關的檔案與目錄的存取權限。 另外,可以使用防火牆來隔絕不安全的區域。
其它注意事項: 考慮使用SSL (Secure Sockets Layer) 連線 注意主機安全 在網路上要傳送重要訊息時(ex: 資金訊息、交易訊息、信用卡資料…等),為避免駭客竊聽MySQL與用戸端之間的封包,可以使用SSL安全通訊協定來加密。 採用RC4, MD5及RSA等加密演算法。 在網上買東西,當進入輸入信用卡號碼的網頁時,若該網頁的URL是以https://開頭,那個s就是SSL的意思。 注意主機安全 資料庫是一個企業的命脈,因此資料庫主機也必須做好保全的工作 (ex: 備份)。 要防止電源被切斷、主機被竊…等事項。