如果你發(fā)現(xiàn)自己以某種方式置身于數(shù)據(jù)庫的世界中,想必你已經(jīng)對數(shù)據(jù)庫的安全和性能有了一些了解。數(shù)據(jù)庫管理系統(tǒng)確實為數(shù)據(jù)庫帶來了好處,但你是否考慮過需要從安全性和性能角度進(jìn)行權(quán)衡,以便使你的選擇最有效?這正是本文要探討的。
安全和性能是否聯(lián)系在一起?
首先要考慮一個事實,性能和安全密切相關(guān)。出現(xiàn)這種情況的主要原因是,開發(fā)人員,無論是初級的還是資深的,在其職業(yè)生涯的某個時刻開始意識到:
- 安全性提高時,實現(xiàn)性能目標(biāo)通常會變得有點困難(也就是說,開發(fā)人員通常需要“千方百計”來實現(xiàn)他們的目標(biāo))
- 提高性能時,有時會以安全為代價——比如說,放寬權(quán)限等等。
用Mark Eldridge制作的圖做下說明:
希望你能通過這種圖理解前面所要表達(dá)的意思。當(dāng)然,這個箭頭反映的是密碼管理中安全性和便利性的權(quán)衡,這與SQL中的安全性和性能沒有直接關(guān)系,但是兩者可以進(jìn)行類比。提高安全性通常意味著會把性能相關(guān)的任務(wù)變得更加困難,反之亦然。
SQL中的安全性和性能
現(xiàn)在,你可能想知道,SQL中,性能和安全性是如何融合在一起的?一句話,顯而易見——當(dāng)其中一個方面(安全性或性能)提升時,另一個則需要額外的維護(hù)措施,反之亦然。以下是數(shù)據(jù)庫管理員和開發(fā)人員在考慮安全性和性能時通常會想到的一些主要措施:
如上表所示,所有的選擇通常都有收益,或者利弊皆有。在這個領(lǐng)域,你還需要考慮另一個問題:你是否具備執(zhí)行操作所需的知識?在性能領(lǐng)域沒有必要的知識可能并不一定是壞事(學(xué)習(xí)這個領(lǐng)域的知識很快,如果有一天你的查詢表現(xiàn)不佳,一兩天后的結(jié)果可能會大不相同),但是,在安全領(lǐng)域,每件事都在改變并且會比預(yù)期更快地咬你一口:忽略了一個必要的方面或者錯誤地引入,我們可以向你保證,日后當(dāng)數(shù)據(jù)竊賊來敲門時,你會記住你的錯誤(考慮權(quán)限的例子:向一個用戶授予太多權(quán)限是危險的,應(yīng)該只授予絕對必要的權(quán)限)。
一旦出現(xiàn)性能或安全問題,你如何知道怎樣糾正錯誤?這可不像乍看起來那么簡單,所以一些額外的知識會有所幫助。
性能和安全問題的后果
SQL世界中性能主要與創(chuàng)建、讀取、更新或刪除(CRUT)的執(zhí)行性能相關(guān),而安全性通常與數(shù)據(jù)庫實例的整體安全性有關(guān),但是當(dāng)出現(xiàn)錯誤時,如何確定先前采取的哪些操作對數(shù)據(jù)庫有害,為什么?
謝天謝地,答案相當(dāng)簡單——看看你最近采取的行動的后果,再看看下表。下表將問題開始前可能采取的措施與最可能的后果做了關(guān)聯(lián):
正如你所見到的,當(dāng)確定導(dǎo)致問題的操作時,特定選項的結(jié)果應(yīng)該是一個很好的起點。每個選項都有自己的好處,但每個選項也會帶來一些影響,所以首先要了解需要采取的步驟,評估可用的選項,并謹(jǐn)慎選擇。
學(xué)習(xí)自己需要做的每件事,尤其是在處理性能和安全性方面的工作,特別是你沒有太多數(shù)據(jù)庫領(lǐng)域的背景知識時,可能會非常困難:在這種情況下,首先,弄清楚正在使用什么樣的數(shù)據(jù)庫管理系統(tǒng),然后閱讀性能或安全領(lǐng)域的文檔(或兩者都讀,取決于需要)。
一旦確定了性能和安全性的組合,就可以考慮使用SQL客戶端:查詢的性能與構(gòu)建方式密切相關(guān),SQL客戶端不僅可以幫助構(gòu)建出更好的SQL查詢,而且好的SQL客戶端通過提供一系列附加選項,比如與團(tuán)隊共享查詢結(jié)果的選項等,從而使處理數(shù)據(jù)庫實例中的數(shù)據(jù)變得輕而易舉。
SQL客戶端的安全與性能
如前所述,正確構(gòu)建的SQL客戶端包含非常廣泛的職責(zé),包括自動完成查詢、根據(jù)查詢的輸出生成圖表等。
SQL客戶端不僅使調(diào)整數(shù)據(jù)庫實例的性能更容易(例如,能密切關(guān)注表結(jié)構(gòu)以確保數(shù)據(jù)庫始終保持高性能),而且還允許執(zhí)行其他操作,比如,與同事或隊友分享編寫的查詢。就如同下面這樣:
使用恰當(dāng)?shù)腟QL客戶端時,能夠訪問一些非常有價值的信息,比如有助于你密切關(guān)注數(shù)據(jù)庫模式(請參見上文),幫你處理最寶貴的數(shù)據(jù),或者自動完成查詢,從而幫你提高數(shù)據(jù)庫性能。
當(dāng)然,數(shù)據(jù)庫實例的安全性仍然由你負(fù)責(zé):對于小型開發(fā)團(tuán)隊,通過數(shù)據(jù)庫安全檢查清單就夠了?;蛘撸匆幌滤x擇的數(shù)據(jù)庫管理系統(tǒng)的安全部分,因為許多與安全相關(guān)的選項都取決于所使用的是哪種數(shù)據(jù)庫管理系統(tǒng)。
安全性和性能的良好組合能夠充分保護(hù)你免受威脅,同時避免來自數(shù)據(jù)庫開發(fā)人員的抱怨或客戶的投訴。如果數(shù)據(jù)庫和web應(yīng)用程序協(xié)調(diào)一致,則應(yīng):
- 初始的(root)賬號使用強(qiáng)密碼鎖
- 不向用戶提供超出嚴(yán)格必要的權(quán)限(例如,只從數(shù)據(jù)庫讀取的用戶應(yīng)該只擁有SELECT權(quán)限等)
- 通過使用防火墻或開發(fā)人員遵循恰當(dāng)?shù)陌踩绦?,能夠抵御比如SQL注入等基本的安全威脅
- 能夠在不妨礙其它操作的情況下快速完成web應(yīng)用程序所需的全部查詢(SQL客戶端非常適合這種情況:客戶端通常提供完成查詢所需的毫秒級時間,因此,如果哪個查詢速度慢,就從那里開始。)
- 不會降低用戶體驗
上面給出的建議中,如果能將哪怕一小部分作為日常工作的一部分,都有助于你在SQL中找到性能和安全性的良好結(jié)合。
當(dāng)然說起來容易做起來難,但按照本文和所選數(shù)據(jù)庫管理系統(tǒng)文檔中給出的建議,一切都能變得輕而易舉。別忘了,在數(shù)據(jù)庫領(lǐng)域,事物的發(fā)展和變化日新月異,今天有用的東西明天可能就不一定有用了——為了達(dá)到精益求精,擴(kuò)展兩個領(lǐng)域的知識,并根據(jù)具體情況采用恰當(dāng)?shù)拇胧?/span>
總結(jié)
希望這篇文章能幫你深入了解數(shù)據(jù)庫世界及其性能和安全相關(guān)的權(quán)衡。
為了提高數(shù)據(jù)庫實例的性能和安全性,請務(wù)必閱讀所選數(shù)據(jù)庫管理系統(tǒng)的文檔,運行一兩次通過數(shù)據(jù)泄露搜索引擎(如BreachDirectory)的查詢,確保你的基礎(chǔ)設(shè)施不會受到黑客攻擊,并且防止身份盜用。
原文鏈接:
https://dzone.com/articles/security-vs-performance-in-the-sql-world
譯者介紹
楊曉娟,51CTO社區(qū)編輯,西安電子科技大學(xué)計算機(jī)專業(yè)碩士研究生,資深研發(fā)工程師,信息系統(tǒng)項目管理師,擁有近20年Java開發(fā)經(jīng)驗。分別在NEC、甲骨文、英方從事數(shù)據(jù)存儲、Oracle數(shù)據(jù)庫的數(shù)據(jù)遷移以及同構(gòu)/異構(gòu)數(shù)據(jù)庫復(fù)制等研發(fā)工作,尤其在數(shù)據(jù)庫、數(shù)據(jù)編碼等方面有深入鉆研和了解。