摘要:處在局域網(wǎng)之內(nèi)的,由于有局域網(wǎng)出入口的網(wǎng)絡(luò)設(shè)備的基本保護(hù),相對(duì)于暴露在廣域網(wǎng)中要安全不少,主要威脅對(duì)象基本控制在了可以接入局域網(wǎng)的內(nèi)部潛在威脅者,和極少數(shù)能夠突破最外圍防線局域網(wǎng)出入口的安全設(shè)備的入侵者。
前言
對(duì)于任何一個(gè)企業(yè)來(lái)說(shuō),其數(shù)據(jù)庫(kù)系統(tǒng)中所保存數(shù)據(jù)的安全性無(wú)疑是非常重要的,尤其是公司的有些商業(yè)數(shù)據(jù),可能數(shù)據(jù)就是公司的根本。
失去了數(shù)據(jù),可能就失去了一切
本章將針對(duì)mysql的安全相關(guān)內(nèi)容進(jìn)行較為詳細(xì)的介紹。
數(shù)據(jù)庫(kù)系統(tǒng)安全相關(guān)因素 1、外圍網(wǎng)絡(luò)Mysql的大部分應(yīng)用場(chǎng)景都是基于網(wǎng)絡(luò)環(huán)境的,而網(wǎng)絡(luò)本身是一個(gè)充滿各種入侵危險(xiǎn)的環(huán)境
所以要保護(hù)他的安全,在條件允許的情況下,就應(yīng)該從最外圍的網(wǎng)絡(luò)環(huán)境開(kāi)始布防,因?yàn)檫@一層防線可以從最大范圍內(nèi)阻止可能存在的威脅。
在網(wǎng)絡(luò)環(huán)境中,任意兩點(diǎn)之間都可能存在無(wú)窮無(wú)盡的道路可以抵達(dá),是一條真正“條條道路通羅馬”的環(huán)境。
在那許許多多的道路中,只要有一條道路不安全,就可能被入侵者利用。
當(dāng)然由于所處環(huán)境不同,潛在危險(xiǎn)的來(lái)源也會(huì)不一樣。
有些mysql所處環(huán)境是暴露在廣域網(wǎng)中,可以說(shuō)是完全裸露在任何可以接入網(wǎng)絡(luò)環(huán)境的潛在威脅者面前。
而有些mysql是在一個(gè)環(huán)境相對(duì)小一些的局域網(wǎng)之內(nèi),相對(duì)來(lái)說(shuō),潛在威脅者也會(huì)少很多。
處在局域網(wǎng)之內(nèi)的mysql,由于有局域網(wǎng)出入口的網(wǎng)絡(luò)設(shè)備的基本保護(hù),相對(duì)于暴露在廣域網(wǎng)中要安全不少,主要威脅對(duì)象基本控制在了可以接入局域網(wǎng)的內(nèi)部潛在威脅者,和極少數(shù)能夠突破最外圍防線(局域網(wǎng)出入口的安全設(shè)備)的入侵者。
所以盡可能的讓我們的mysql處在一個(gè)有保護(hù)的局域網(wǎng)之中,是非常必要的。
2、主機(jī)有了網(wǎng)絡(luò)設(shè)備的保護(hù),我們的MySQL就足夠安全了么?我想大家都會(huì)給出否定的回答。
因?yàn)榧词刮覀兙钟蚓W(wǎng)出入口的安全設(shè)備足夠的強(qiáng)大,可以攔截住外圍試圖入侵的所有威脅者,但如果威脅來(lái)自局域網(wǎng)內(nèi)部呢?
比如局域網(wǎng)中可能存在被控制的設(shè)備,某些被控制的有權(quán)限接入局域網(wǎng)的設(shè)備、以及內(nèi)部入侵者等都仍然是威脅者。
所以說(shuō),即使是在第一層防線之內(nèi),我們?nèi)匀淮嬖诎踩L(fēng)險(xiǎn),局域網(wǎng)內(nèi)部仍然會(huì)有不少的潛在威脅存在。
這個(gè)時(shí)候就需要我們部署第二層防線“主機(jī)層防線”了。
“主機(jī)層防線“主要攔截網(wǎng)絡(luò)(包括局域網(wǎng))或者直連的未授權(quán)用戶試圖入侵主機(jī)的行為。
因?yàn)橐粋€(gè)惡意入侵者在登陸主機(jī)之后,可能通過(guò)某些軟件程序竊取到那些自身安全設(shè)置不夠健壯的數(shù)據(jù)庫(kù)系統(tǒng)的登陸口令,從而達(dá)到竊取或者破壞數(shù)據(jù)的目的。
如一個(gè)主機(jī)用戶可以通過(guò)一個(gè)未刪除且未設(shè)置密碼的無(wú)用戶名本地賬戶輕易登入數(shù)據(jù)庫(kù),也可以通過(guò)mysql初始安裝好之后就存在的無(wú)密碼的“root@localhost”用戶登陸數(shù)據(jù)庫(kù)并獲得數(shù)據(jù)庫(kù)最高控制權(quán)限。
非法用戶除了通過(guò)登入數(shù)據(jù)庫(kù)獲取或破壞數(shù)據(jù)之外,還可能通過(guò)主機(jī)上面相關(guān)權(quán)限設(shè)置的漏洞,跳過(guò)數(shù)據(jù)庫(kù)而直接獲取mysql數(shù)據(jù)(或日志)文件達(dá)到竊取數(shù)據(jù)的目的,或者直接刪除(或者日志)文件達(dá)到破壞數(shù)據(jù)的目的。
3、數(shù)據(jù)庫(kù)通過(guò)第二道防線“主機(jī)層防線”的把守,我們又可以擋住很大一部分安全威脅者。
但仍然可能有極少數(shù)突破防線的入侵者。
而且即使沒(méi)有任何“漏網(wǎng)之魚”,那些有主機(jī)登入權(quán)限的使用者呢?是否真的就是完全可信任對(duì)象?No,我們不能輕易冒這個(gè)潛在風(fēng)險(xiǎn)。
對(duì)于一個(gè)有足夠安全意識(shí)的管理員來(lái)說(shuō),是不會(huì)輕易放任任何一個(gè)潛在風(fēng)險(xiǎn)存在的。
這個(gè)時(shí)候,我們的第三道防線“數(shù)據(jù)庫(kù)防線”就需要發(fā)揮作用了。
“數(shù)據(jù)庫(kù)防線“也就是mysql數(shù)據(jù)庫(kù)系統(tǒng)自身的訪問(wèn)控制授權(quán)管理相關(guān)模塊。
這道防線基本上可以說(shuō)是mysql的最后一道防線了,也是最核心最重要的防線。
他首先需要抵擋住在之前的兩層防線都沒(méi)有卒攔住的所有入侵威脅,同時(shí)還要能夠限制住擁有之前二層防線自由出入但不具備訪問(wèn)權(quán)限的潛在威脅者,以確保數(shù)據(jù)庫(kù) 自身的安全以及所保存數(shù)據(jù)的安全。
之前的兩層防線對(duì)于所有數(shù)據(jù)庫(kù)系統(tǒng)來(lái)說(shuō)基本上區(qū)別不大,都存在者基本相同的各種威脅,不論是Oracle還是mysql,以及其他的數(shù)據(jù)庫(kù)管理系統(tǒng),都需要基本一致的“布防”策略。
但是這第三層防線,也就是各自自身的“數(shù)據(jù)庫(kù)防線”對(duì)于每個(gè)數(shù)據(jù)庫(kù)系統(tǒng)來(lái)說(shuō)都存在較大差異,因?yàn)槊糠N數(shù)據(jù)庫(kù)都有各自不太一樣的專門負(fù)責(zé)訪問(wèn)授權(quán)相關(guān)的模塊。不論是權(quán)限劃分還是實(shí)現(xiàn)方式都可能不太一樣。
對(duì)mysql來(lái)說(shuō),其訪問(wèn)授權(quán)相關(guān)模塊主要是由兩部分組成。
(1)一個(gè)是基本的用戶管理模塊;另一個(gè)是訪問(wèn)授權(quán)控制模塊。 (2)用戶管理模塊相對(duì)簡(jiǎn)單,主要是負(fù)責(zé)用戶登陸連接相關(guān)的基本權(quán)限控制,但其在安全控制方面的作用不必任何環(huán)節(jié)小。 (3)他就像mysql的一個(gè)“大門門衛(wèi)”一樣,通過(guò)校驗(yàn)每一位敲門者所給的進(jìn)門“暗號(hào)”(登入口令),決定是非給敲門者開(kāi)門。 (4)而訪問(wèn)控制模塊則是隨時(shí)隨地檢查已經(jīng)進(jìn)門的訪問(wèn)者,校驗(yàn)他們是否有訪問(wèn)所發(fā)出請(qǐng)求需要訪問(wèn)的數(shù)據(jù)的權(quán)限。 (5)通過(guò)校驗(yàn)者可以順利拿到數(shù)據(jù),而未通過(guò)校驗(yàn)的訪問(wèn)者,只能收到“訪問(wèn)越權(quán)”的相關(guān)反饋。4、代碼
SQL語(yǔ)句相關(guān)安全因素:
(1)“SQL注入攻擊”指的就是攻擊者根據(jù)數(shù)據(jù)庫(kù)的SQL語(yǔ)句解析器的原理,利用程序中對(duì)客戶端所提交數(shù)據(jù)的校驗(yàn)漏洞,從而通過(guò)程序動(dòng)態(tài)提交數(shù)據(jù)接口提交非法數(shù)據(jù),達(dá)到攻擊者的入侵目的。 (2)“SQL注入攻擊“的破壞性非常大,輕者造成數(shù)據(jù)被竊取,重者數(shù)據(jù)遭到破壞,甚至可能丟失全部的數(shù)據(jù)。
程序代碼相關(guān)安全因素:
(1)程序代碼如果權(quán)限校驗(yàn)不夠仔細(xì)而存在安全漏洞,則同樣可能會(huì)被入侵者利用,達(dá)到竊取數(shù)據(jù)等目的。 (2)比如一個(gè)存在安全漏洞的信息管理系統(tǒng),很容易就可能竊取到其他一些系統(tǒng)的登入口令。之后,就能堂而皇之的輕松登陸到其他相關(guān)系統(tǒng)達(dá)到竊取相關(guān)數(shù)據(jù)的目的。 (3)甚至還可能通過(guò)應(yīng)用系統(tǒng)中保存不善的數(shù)據(jù)庫(kù)系統(tǒng)連接登陸口令,從而帶來(lái)更大的損失。mysql權(quán)限系統(tǒng)介紹 1、權(quán)限系統(tǒng)簡(jiǎn)介
msql的權(quán)限系統(tǒng)在實(shí)現(xiàn)上比較簡(jiǎn)單,相關(guān)權(quán)限信息主要存儲(chǔ)在幾個(gè)被稱為grant tables的系統(tǒng)表中,即:mysql.User,mysql.db,mysql.Host,mysql.table_priv和mysql.column_priv。
由于權(quán)限信息數(shù)據(jù)量比較小,而且訪問(wèn)比較頻繁,所以mysql在啟動(dòng)的時(shí)候,就會(huì)將所有的權(quán)限信息都load到內(nèi)存中保存在幾個(gè)特定的結(jié)構(gòu)中。
所以才有了我們每次手工修改了權(quán)限相關(guān)的表之后,都需要執(zhí)行“flush privileges”命令重新加載mysql的權(quán)限信息。
當(dāng)然,如果我們通過(guò)grant、revoke或者drop user命令來(lái)修改相關(guān)權(quán)限,則不需要手工執(zhí)行“flush privileges”命令,因?yàn)樵谑褂胓rant等來(lái)修改系統(tǒng)表的同時(shí),也會(huì)修改內(nèi)存結(jié)構(gòu)中的權(quán)限信息。
在mysql5.0.2或更高版本的時(shí)候,mysql還增加了CREATE USER命令,以此創(chuàng)建無(wú)任何特別權(quán)限(僅擁有初始USAGE權(quán)限)的用戶,通過(guò)CREATE USER命令創(chuàng)建了新用戶后,新用戶的信息也會(huì)自動(dòng)更新到內(nèi)存結(jié)構(gòu)中。
所以,建議讀者一般情況下盡量使用GRANT、REVOKE、CREATE USER以及DROP USER命令來(lái)進(jìn)行用戶和權(quán)限的變更操作,盡量減少直接修改grant tables來(lái)實(shí)現(xiàn)用戶和權(quán)限變更的操作。
2、權(quán)限授予與去除要為某個(gè)用戶授權(quán),可以使用GRANT命令,要去除某個(gè)用戶已有的權(quán)限則使用REVOKE命令。
當(dāng)然除了這兩個(gè)命令之外,還有一種比較暴力的辦法,那就是直接更新grant tables系統(tǒng)表。
當(dāng)給某個(gè)用戶授權(quán)的時(shí)候,不僅需要指定用戶名,同時(shí)還要指定來(lái)訪主機(jī)。
如果授權(quán)的時(shí)候僅指定用戶名,則mysql會(huì)自動(dòng)認(rèn)為是對(duì)“username@%”授權(quán)。
要去除某個(gè)用戶的權(quán)限同樣也需要指定來(lái)訪主機(jī)。
可能有些時(shí)候我們還需要查看某個(gè)用戶目前擁有的權(quán)限,這可以通過(guò)兩個(gè)方式實(shí)現(xiàn),首先是通過(guò)執(zhí)行“show grants for "username"@"hostname"”命令來(lái)獲取之前該用戶身上的所有授權(quán)。另一種方法是查詢grant tables里邊的權(quán)限信息。
3、權(quán)限級(jí)別
Global Level:
(1)Global Level的權(quán)限控制也叫全局權(quán)限控制,所有權(quán)限信息都保存在mysql.user表中。 (2)Global Level的所有權(quán)限都是針對(duì)整個(gè)mysqld的,對(duì)所有的數(shù)據(jù)庫(kù)下的所有表及所有字段都有效。 (3)如果一個(gè)權(quán)限是以Global Level來(lái)授予的,則會(huì)覆蓋其他所有級(jí)別的相同權(quán)限設(shè)置。 (4)比如我們首先給abc用戶授權(quán)可以u(píng)pdate指定數(shù)據(jù)庫(kù)如test的t表,然后又在全局級(jí)別REVOKE掉了abc用戶對(duì)所有數(shù)據(jù)庫(kù)的所有表的UPDATE權(quán)限,那么這時(shí)候的abc用戶將不再擁有對(duì)test.t表的更新權(quán)限。 (5)要授予Global Level的權(quán)限,則只需要在執(zhí)行GRANT命令的時(shí)候,用“*.*”來(lái)指定適用范圍是Global的即可,當(dāng)有多個(gè)權(quán)限需要授予的時(shí)候,也并不需要多次重復(fù)執(zhí)行GRANT命令,只需要一次將所有需要的權(quán)限名稱通過(guò)逗號(hào)(“,”)隔開(kāi)即可,如:GRANT SELECT,UPDATE,DELETE,INSERT ON *.* TO "def"@"localhost";
Database Level:
(1)Database Level是在Global Level之下,其他三個(gè)Level之上的權(quán)限級(jí)別,其作用域即為所指定整個(gè)數(shù)據(jù)庫(kù)中的所有對(duì)象。 (2)與Global Level相比,Database Level主要少了以下幾個(gè)權(quán)限:CREATE USER、FILE、PROCESS、RELOAD、REPLICATION CLIENT、REPLICATION SLAVE、SHOW DATABASES、SHUTDOWN、SUPER和USAGE這幾個(gè)權(quán)限,沒(méi)有增加任何權(quán)限。 (3)之前我們說(shuō)Global Level的權(quán)限會(huì)覆蓋底下其他四層的相同權(quán)限,Database Level也一樣,雖然他可能被Global Level的權(quán)限所覆蓋,但同時(shí)他也能覆蓋比他更下層的Table、Column和Routine這三層的權(quán)限。 (4)如果要授予Database Level的權(quán)限,則可以有兩種實(shí)現(xiàn)方式: 【1】在執(zhí)行GRANT命令的時(shí)候,通過(guò)“database.*”來(lái)限定權(quán)限作用域?yàn)閐atabase整個(gè)數(shù)據(jù)庫(kù):GRANT ALTER ON test.* TO "def"@"localhost"; 【2】先通過(guò)USE命令選定需要授權(quán)的數(shù)據(jù)庫(kù),然后通過(guò)“*”來(lái)限定作用域,這樣授權(quán)的作用域?qū)嶋H上就是當(dāng)前選定的數(shù)據(jù)庫(kù) (5)在授予權(quán)限的時(shí)候,如果有相同的權(quán)限需要授予多個(gè)用戶,我們也可以在授權(quán)語(yǔ)句中一次寫上多個(gè)用戶信息,用逗號(hào)分隔開(kāi)就可以了,如:grant create on perf.* to "abc"@"localhost","def"@"localhost";
Table Level:
(1)Database Level之下就是Table Level的權(quán)限了,Table Level的權(quán)限可以被Global Level 和Database Level的權(quán)限所覆蓋,同時(shí)也能覆蓋Column Level 和Routine Level 的權(quán)限。 (2)Table Level 的權(quán)限作用范圍是授權(quán)語(yǔ)句中所指定數(shù)據(jù)庫(kù)的指定表。如可以通過(guò)如下語(yǔ)句給test數(shù)據(jù)庫(kù)的t1表授權(quán):GRANT INDEX ON test.t1 TO "abc"@"%.jianzhaoyang.com"; (3)Table Level的權(quán)限由于其作用域僅限于某個(gè)特定的表,所以權(quán)限種類也比較少,僅有ALTER、CREATE、DELETE、DROP、INDEX、INSERT、SELECT、UPDATE這八種權(quán)限。
Column Level:
(1)Column Level的權(quán)限作用范圍就更小了,僅僅是某個(gè)表的指定的某個(gè)列。 (2)由于權(quán)限覆蓋的原則,Column Level的權(quán)限同樣可以被Global、Database、Table這三個(gè)級(jí)別的權(quán)限中的相同級(jí)別所覆蓋,而且由于Column Level所針對(duì)的權(quán)限和Routine Level的權(quán)限作用域沒(méi)有重合部分,所以不會(huì)有覆蓋與被覆蓋的關(guān)系。 (3)Column Level的權(quán)限只有INSERT、SELECT和UPDATE這三種。 (4)Column Level的權(quán)限授權(quán)語(yǔ)句語(yǔ)法基本和Table Level差不多,只是需要在權(quán)限名稱后面將需要授權(quán)的列名列表通過(guò)括號(hào)括起來(lái):GRANT SELECT(id,value) ON test.t2 TO "abc"@"%.jianzhaoyang.com"; (5)當(dāng)某個(gè)用戶在向某個(gè)表插入數(shù)據(jù)的時(shí)候,如果該用戶在該表中某列上面沒(méi)有INSERT權(quán)限,則該列的數(shù)據(jù)將以默認(rèn)值填充。這一點(diǎn)和很多其他的數(shù)據(jù)庫(kù)有一些區(qū)別,是mysql自己在SQL上面的擴(kuò)展。
Routine Level:
(1)Routine Level的權(quán)限主要只有EXECUTE和ALTER ROUTINE兩種,主要的針對(duì)的對(duì)象是procedure 和function這兩種對(duì)象。 (2)在授予Routine Level權(quán)限的時(shí)候,需要指定數(shù)據(jù)庫(kù)和相關(guān)對(duì)象,如:GRANT EXECUTE ON test.p1 to "abc"@"localhost";
GRANT權(quán)限:
(1)除了上述幾類權(quán)限外,還有一個(gè)非常特殊的權(quán)限GRANT,擁有GRANT權(quán)限的用戶可以將自身所擁有的任何權(quán)限全部授予其他任何用戶,所以GRANT權(quán)限是一個(gè)非常特殊也非常重要的權(quán)限。 (2)GRANT權(quán)限的授予方式也和其他任何權(quán)限都不太一樣。 (3)通常是通過(guò)在執(zhí)行GRANT授權(quán)語(yǔ)句的時(shí)候在最后添加WITH GRANT OPTION子句達(dá)到授予GRANT權(quán)限的目的。 (4)另外,我們還可以通過(guò)GRANT ALL語(yǔ)句授予某個(gè)Level的所有可用權(quán)限給某個(gè)用戶,如: grant all on test.t5 to "abc";
以上五個(gè)Level的權(quán)限中,Table、Column和Routine三者在授權(quán)中所依賴(或引用的)對(duì)象必須是已經(jīng)存在的,而不像Database Level的權(quán)限授予,可以在當(dāng)前不存在該數(shù)據(jù)庫(kù)的時(shí)候完成授權(quán)。
4、MySQL訪問(wèn)控制實(shí)現(xiàn)原理MySQL的訪問(wèn)控制實(shí)際上由兩個(gè)功能模塊共同組成,一個(gè)是負(fù)責(zé)“看守mysql大門”的用戶管理模塊,另一個(gè)就是負(fù)責(zé)監(jiān)控來(lái)訪者每一個(gè)動(dòng)作的訪問(wèn)控制模塊。
用戶管理模塊決定造訪客人能否進(jìn)門,而訪問(wèn)控制模塊則決定每個(gè)客人進(jìn)門能拿什么不能拿什么。
mysql中實(shí)現(xiàn)簡(jiǎn)單訪問(wèn)控制的流程圖如下:
用戶管理:
(1)在mysql中,用戶訪問(wèn)控制部分的實(shí)現(xiàn)比較簡(jiǎn)單,所有授權(quán)用戶都存放在一個(gè)系統(tǒng)表中:mysql.user,當(dāng)然這個(gè)表不僅存放了授權(quán)用戶的基本信息,還存放有部分細(xì)化的權(quán)限信息。 (2)用戶管理模塊需要使用的信息很少,主要就是Host、User、Password這三項(xiàng),都在mysql.user表中 (3)一個(gè)用戶想要訪問(wèn)mysql,至少需要提供上面列出的三項(xiàng)數(shù)據(jù),mysql才能判斷是否該讓它進(jìn)門。 (4)這三項(xiàng)實(shí)際是由兩部分組成:來(lái)訪者來(lái)源的主機(jī)名(或主機(jī)IP地址信息)和訪問(wèn)者的來(lái)訪“暗號(hào)”(登陸用戶名和登陸密碼),這兩部分中的任何一個(gè)沒(méi)有能夠匹配上都無(wú)法讓看守大門的用戶管理模塊乖乖開(kāi)門。 (5)其中Host信息存放的是mysql允許所對(duì)應(yīng)的User的信任主機(jī),可以是某個(gè)具體的主機(jī)名或域名,也可以是用“%”來(lái)充當(dāng)通配符的某個(gè)域名集合,也可以是一個(gè)具體的IP地址,同樣也可以是存在通配符的域名集合,還可以用“%”來(lái)代表任何主機(jī),就是不對(duì)訪問(wèn)者的主機(jī)做任何限制。
訪問(wèn)控制:
(1)當(dāng)客戶端連接通過(guò)用戶管理模塊的驗(yàn)證,可連接上mysql server之后,就會(huì)發(fā)送各種Query和Command給mysql server,以實(shí)現(xiàn)客戶端應(yīng)用的各種功能。 (2)當(dāng)mysql接收到客戶端的請(qǐng)求之后,訪問(wèn)控制模塊是需要校驗(yàn)該用戶是否滿足提交的請(qǐng)求所需要的權(quán)限。 (3)權(quán)限校驗(yàn)過(guò)程是從最大范圍往最小范圍的權(quán)限開(kāi)始依次校驗(yàn)所涉及到的每個(gè)對(duì)象的每個(gè)權(quán)限。 (4)在驗(yàn)證所需權(quán)限的時(shí)候,mysql首先會(huì)查找存儲(chǔ)在內(nèi)存結(jié)構(gòu)中的權(quán)限數(shù)據(jù),首先查找Global Level權(quán)限,如果所需權(quán)限在Global Level都有定義(GRANT或REVOKE),則完成權(quán)限校驗(yàn)(通過(guò)或者拒絕); (5)如果沒(méi)有找到所有權(quán)限的定義,則會(huì)繼續(xù)查找Database Level的權(quán)限,進(jìn)行Global Level未定義的所需權(quán)限的校驗(yàn),如果仍然沒(méi)有找到所有所需權(quán)限的定義,則會(huì)繼續(xù)往更小范圍的權(quán)限定義域查找,也就是Table Level、Column Level或者Routine Level。 (6)在前面我們了解到mysql的grant tables有mysql.user、mysql.db、mysql.host、mysql.table_priv和mysql.column_priv這五個(gè)。 (7)我想除了mysql.host之外的四個(gè)都非常容易理解,每一個(gè)表都針對(duì)mysql的一種邏輯對(duì)象,存放某一特定Leve的權(quán)限,唯獨(dú)mysql.host稍有區(qū)別。 (8)我們來(lái)看看mysql.host權(quán)限表在mysql訪問(wèn)控制中充當(dāng)了什么樣的角色? 【1】mysql.host在mysql訪問(wèn)控制模塊中所實(shí)現(xiàn)的功能比較特殊,和其他幾個(gè)grant tables不太一樣。 【2】首先mysql.host中的權(quán)限數(shù)據(jù)不是通過(guò)GRANT或REVOKE來(lái)授予或者去除,而是必須手工通過(guò)INSESRT、UPDATE和DELETE命令來(lái)修改其中的數(shù)據(jù)。 【3】其次是其中的權(quán)限數(shù)據(jù)無(wú)法多帶帶生效,必須通過(guò)和mysql.db權(quán)限表的數(shù)據(jù)一起才能生效。 【4】而且僅當(dāng)mysql.db總存在不完整的時(shí)候,才會(huì)促使訪問(wèn)控制模塊再結(jié)合mysql.host中查找是否有相應(yīng)的補(bǔ)充權(quán)限數(shù)據(jù)實(shí)現(xiàn)以達(dá)到權(quán)限校驗(yàn)的目的。 【5】在mysql.db中無(wú)法找到滿足權(quán)限校驗(yàn)的所有條件的數(shù)據(jù),則說(shuō)明在mysql.db中無(wú)法完成權(quán)限校驗(yàn),所以也不會(huì)直接校驗(yàn)db.select_priv的值是否是Y。 (9)mysql的權(quán)限授予至少需要用戶名和主機(jī)名二者才能確定一個(gè)訪問(wèn)者的權(quán)限。 (10)mysql如何確定權(quán)限信息?實(shí)際上,mysql永遠(yuǎn)優(yōu)先考慮更精確范圍的權(quán)限。 (11)在mysql內(nèi)部會(huì)按照username和hostname做一個(gè)排序,對(duì)于相同username的權(quán)限,其host信息越接近訪問(wèn)者的來(lái)源host,則排序位置越靠前,則越早被校驗(yàn)使用到。 (12)而且mysql在權(quán)限校驗(yàn)過(guò)程中,只要找到匹配的權(quán)限之后,就不會(huì)再繼續(xù)往后查找是否還有匹配的權(quán)限信息,而直接完成校驗(yàn)過(guò)程。mysql訪問(wèn)授權(quán)策略 1、mysql訪問(wèn)權(quán)限策略——前言
在我們了解了數(shù)據(jù)庫(kù)系統(tǒng)安全的相關(guān)因素和mysql權(quán)限系統(tǒng)的工作原理之后,就需要為我們的系統(tǒng)設(shè)計(jì)一個(gè)安全合理的授權(quán)策略。
我想,每個(gè)人都清楚,想要授權(quán)最簡(jiǎn)單最簡(jiǎn)便方便,維護(hù)工作量最少,那自然是將所有權(quán)限都授予所有的用戶來(lái)的最簡(jiǎn)單方便了。
但是,一個(gè)用戶所擁有的權(quán)限越大,那么他給我們的系統(tǒng)所帶來(lái)的潛在威脅也就越大。
所以從安全方面考慮,權(quán)限自然是授予的越小越好。一個(gè)有足夠安全意識(shí)的管理員在授權(quán)的時(shí)候,都會(huì)只授權(quán)必要的權(quán)限,而不會(huì)授予任何多余的權(quán)限。
2、授權(quán)策略:我們從安全的角度來(lái)考慮如何設(shè)計(jì)一個(gè)更為安全合理的授權(quán)策略。
首先需要了解來(lái)訪主機(jī):
(1)由于mysql數(shù)據(jù)庫(kù)登陸驗(yàn)證用戶的時(shí)候是除了用戶名和密碼之外,還要驗(yàn)證來(lái)源主機(jī),所以我們還需要了解每個(gè)用戶可能從哪些主機(jī)發(fā)起連接。 (2)當(dāng)然,我們也可以通過(guò)授權(quán)的時(shí)候直接通過(guò)“%”通配符來(lái)給所有主機(jī)授予都有訪問(wèn)的權(quán)限,但是這樣就違背了我們安全策略的原則,帶來(lái)了潛在風(fēng)險(xiǎn),所以并不可取。 (3)尤其是在沒(méi)有局域網(wǎng)防火墻保護(hù)的情況下,更是不能輕易允許可以從任何主機(jī)登陸的用戶存在。 (4)能通過(guò)具體主機(jī)名和IP地址指定的盡量通過(guò)使用具體的主機(jī)名和IP地址來(lái)限定來(lái)訪主機(jī),不能用具體的主機(jī)名和IP地址限定的也需要用盡可能小的通配范圍來(lái)限定。
其次,了解用戶需求:
(1)既然要做到僅授予必要的權(quán)限,那么我們必須了解每個(gè)用戶所擔(dān)當(dāng)?shù)慕巧簿褪钦f(shuō),我們充分了解每個(gè)用戶需要連接到數(shù)據(jù)庫(kù)上完成什么工作。 (2)了解用戶是一個(gè)只讀應(yīng)用的用戶,還是一個(gè)讀寫都有的用戶,是一個(gè)備份作業(yè)的用戶還是一個(gè)日常管理的用戶,是只需要訪問(wèn)特定的數(shù)據(jù)庫(kù),還是需要訪問(wèn)所有的數(shù)據(jù)庫(kù)。 (3)只有了解了需要做什么,才能準(zhǔn)確的了解需要授予什么樣的權(quán)限。 (4)因?yàn)槿绻麢?quán)限過(guò)低,會(huì)造成工作無(wú)法正常完成,而權(quán)限過(guò)高,則存在潛在的安全風(fēng)險(xiǎn)。
再次,要為工作分類:
(1)為了做到各司其職,我們需要將需要做的工作分門別類,不同類別的工作使用不同的用戶,做好用戶分離。 (2)雖然這樣可能會(huì)帶來(lái)管理成本方面的部分工作量增加,但是基于安全方面的考慮,這部分管理工作量的增加是非常值得的。 (3)而且我們所要做的分離也只是適度的分離。比如將執(zhí)行備份工作、復(fù)制工作、常規(guī)應(yīng)用訪問(wèn)、只讀應(yīng)用訪問(wèn)和日常管理工作分別分理出多帶帶的特定賬戶來(lái)授予各自所需權(quán)限。 (4)這樣,既可以讓安全風(fēng)險(xiǎn)盡量降低,也可以讓同類同級(jí)別的相似權(quán)限合并在一起,不互相交織在一起。 (5)對(duì)于PROCESS、FILE和SUPER這樣的特殊權(quán)限,僅僅只有管理類賬號(hào)才需要,不應(yīng)該授予其他非管理賬號(hào)。
最后,確保只有絕對(duì)必要者擁有GRANT OPTION權(quán)限:
(1)之前在權(quán)限系統(tǒng)介紹的時(shí)候我們已經(jīng)了解到GRANT OPTION權(quán)限的特殊性,和擁有該權(quán)限之后的潛在風(fēng)險(xiǎn),所以在這里就不贅述了。 (2)總之,為了安全考慮,擁有GRANT OTPION權(quán)限的用戶越少越好,盡可能只讓擁有超級(jí)權(quán)限的用戶才擁有GRANT OPTION權(quán)限。安全設(shè)置注意事項(xiàng)
使用私有局域網(wǎng)。我們可以通過(guò)使用私有局域網(wǎng),通過(guò)網(wǎng)絡(luò)設(shè)備,統(tǒng)一私有局域網(wǎng)的出口,并通過(guò)網(wǎng)絡(luò)防火墻設(shè)備控制出口的安全。
使用SSL加密通道。如果我們對(duì)數(shù)據(jù)保密要求非常嚴(yán)格,可以啟用mysql提供的ssl訪問(wèn)接口,將傳輸數(shù)據(jù)進(jìn)行加密。使網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)即使被截獲,也無(wú)法輕易使用。
訪問(wèn)授權(quán)限定來(lái)訪主機(jī)信息。我們可以在授權(quán)的時(shí)候,通過(guò)指定主機(jī)的主機(jī)名、域名或IP地址信息來(lái)限定來(lái)訪主機(jī)的范圍。
OS安全方面。關(guān)閉mysql Server主機(jī)上面任何不需要的服務(wù),這不僅能從安全方面減少潛在隱患,還能減少主機(jī)的部分負(fù)擔(dān),盡可能提高性能。
使用網(wǎng)絡(luò)掃描工具(如nmap等)掃描主機(jī)端口,檢查除了mysql需要監(jiān)聽(tīng)的端口3306之外,還有哪些端口是打開(kāi)正在監(jiān)聽(tīng)的,并去不必要的端口。
嚴(yán)格控制OS賬號(hào)的管理,以防賬號(hào)信息外泄,尤其是root和mysql賬號(hào)。
對(duì)root和mysql等對(duì)mysql的相關(guān)文件有特殊操作權(quán)限的OS賬號(hào)登陸后做出比較顯眼的提示,并在Terminal的提示信息中輸出當(dāng)前用戶信息,以防止操作的時(shí)候經(jīng)過(guò)多次用戶切換后出現(xiàn)人為誤操作。
用非root用戶運(yùn)行mysql。因?yàn)槿绻褂胷oot運(yùn)行mysql,那么myslqd的進(jìn)程就會(huì)擁有root用戶所擁有的權(quán)限,任何具有FILE權(quán)限的用戶就可以在mysql中向系統(tǒng)中的任何位置寫入文件。
文件和進(jìn)程安全。合理設(shè)置文件的權(quán)限屬性,mysql的相關(guān)數(shù)據(jù)和日志和所在文件夾屬主和所屬組都設(shè)置為mysql,且禁用其他所有用戶的讀寫權(quán)限。以防止數(shù)據(jù)或者日志文件被竊取或破壞。
確保mysql server所在的主機(jī)上所必要運(yùn)行的其他應(yīng)用或服務(wù)足夠安全,避免因?yàn)槠渌麘?yīng)用或者服務(wù)存在安全漏洞而被入侵者攻破防線。
用戶設(shè)置。我們必須確保任何可以訪問(wèn)數(shù)據(jù)庫(kù)的用戶都有一個(gè)比較復(fù)雜的內(nèi)容作為密碼,而不是非常簡(jiǎn)單或者比較有規(guī)律的字符,以防止被使用字典破解程序攻破。
在 MySQL初始安裝完成之后,系統(tǒng)中可能存在一個(gè)不需要任何密碼的root用戶,有些版本安裝完成之后還會(huì)存在一個(gè)可以通過(guò)localhost登錄的沒(méi)有用戶名和密碼的帳號(hào)。這些帳號(hào)會(huì)給系統(tǒng)帶來(lái)極大的安全隱患,所以我們必須在正式啟用之前盡早刪除,或者設(shè)置一個(gè)比較安全的密碼。
對(duì)于密碼數(shù)據(jù)的存放,也不要存放在簡(jiǎn)單的文本文件之中,而應(yīng)該使用專業(yè)密碼管理軟件來(lái)管理(如KeePass)。
安全參數(shù)。不需要使用的功能模塊盡量都不要啟用。例如,如果不需要使用用戶自定義函數(shù),就不要在啟動(dòng)的時(shí)候使用“--allow-suspicious-udfs”參數(shù)選項(xiàng),以防止被別有居心的潛在威脅者利用此功能而對(duì)MySQL的安全造成威脅;
不需要從本地文件中Load數(shù)據(jù)到數(shù)據(jù)庫(kù)中,就使用“--local-infile=0”禁用掉可以從客戶端機(jī)器上Load文件到數(shù)據(jù)庫(kù)中
參考鏈接https://www.cnblogs.com/jesse...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/11416.html
閱讀 1422·2021-11-15 11:38
閱讀 3566·2021-11-09 09:47
閱讀 1969·2021-09-27 13:36
閱讀 3211·2021-09-22 15:17
閱讀 2547·2021-09-13 10:27
閱讀 2862·2019-08-30 15:44
閱讀 1158·2019-08-27 10:53
閱讀 2702·2019-08-26 14:00