數據安全防范不可忽視 提升需從今日做起
2011年底,眾多席卷而來的密碼泄露事件彌漫整個網絡,當我注視著最常用的幾個密碼都在互聯網上被公開時,除了手忙腳亂的在各大網站修改密碼,剩下的就是深深的遺憾。幾乎所有從事IT行業的人,都深知安全的重要,可是放在實際執行中,又往往習慣性失明,忽視了自己周圍本應能夠達到的力所能及之安全,很多專業人士就以這樣或者那樣的僥幸心理放任了風險的存在,并一步一步走向了安全危機。
筆者從事數據庫工作超過十年,并且在一直不遺余力的推廣數據庫技術與數據庫安全知識,在此我愿意和大家分享一下我對于數據庫安全的理解。
基于對于數據安全的服務和思考,本文將數據庫安全概括為五大方面(如下圖所示),即:
軟件安全、備份安全、訪問安全、防護安全和管理安全:
在這五大安全方向中,可能出現兩種性質的安全問題,第一,由于內部管理不善而導致的數據安全問題;第二,由于外部惡意攻擊入侵所帶來的安全安問題。通常我們把安全問題狹義化為后者,這實際上是片面的,在數據安全問題上,前者造成的數據損失、數據損毀,其發生率和影響度都遠遠超過后者。
下面我們對數據安全的五大方面做一下簡要的分析和探討:
1.軟件安全是指我們選擇的數據庫產品、版本是否穩定安全;廠商所能提供的補丁集和BUG修正是否及時。很多用戶在部署數據庫軟件時,僅僅選擇了最容易獲得的初始版本發布(如Oracle Database 10.2.0.1或者Oracle Database 11.2.0.1等),遺漏了可能已經存在的補丁修正,并且在運行維護中并不能夠及時跟蹤軟件更新,也無法獲得BUG信息、補丁修正和安全告警,這就使得軟件本身的很多風險隱患得不到修正。如果軟件安全無法保證,數據庫安全的基礎也就喪失了。
2.備份安全是指用戶數據能否得到及時有效的備份保全,能否在故障災難之后獲得及時的恢復和挽救。很多企業在數據災難之后因為缺乏有效備份而一蹶不振,根據Gartner 2009年的一份調查報告顯示,在經歷了數據完全丟失而導致系統停運的企業中,有2/5再也沒能恢復運營,余下的企業也有1/3在兩年內宣告破產,由此可見,由于備份安全問題導致的企業傷害可能遠遠大于黑客攻擊。
3.訪問安全是指用戶數據庫的訪問來源和訪問方式是否安全可控。通常數據庫系統處于IT系統的核心,其安全架構涉及主機、系統、存儲、網絡等諸多方面,如果沒有明確的訪問控制,缺乏足夠的訪問分析與管理,那么數據庫的安全將是混亂和無法控制的,最基本的訪問安全要實現程序控制、網絡隔離、來源約束等。
4.安全防范是指通過主動的安全手段對數據庫安全進行增強、監控、防護、屏蔽或阻斷,諸如數據加密、審計、數據防火墻等技術都在這一范疇之內。我們必須認識到,在IT技術高度發展的今天,風險是無處不在、層出不窮的,可能我們從未思考過的安全問題,每天都在不斷涌現,所以在數據庫環境中采取主動式防護,可以幫助我們監控分析和屏蔽很多未知風險,已經有很多成熟的產品和技術可以用于安全防范。
5.管理安全是指在企業數據的日常管理維護范疇內,能否充分保證數據安全。諸如DBA的維護、文件的管理、參數或數據結構的變更等等都可能引入數據風險,管理安全要求我們通過規范、制度以及技術手段去確保維護管理安全。2011年陜西移動曾經發生過近1400萬手機用戶數據泄露的安全事故,最終查明就是因為維護人員的數據竊取導致的數據泄露,而除此之外,很多維護性誤刪除、誤更新等故障也威脅過無數用戶的數據安全。
對于數據庫安全來說,通常我們認為缺乏的并非技術手段,更多的是缺乏規范和安全認知,如果用戶都能夠嚴格的遵循安全守則并應用現有的安全技術手段,數據庫的安全性就能夠大幅增強,我們的安全事故發生率也會大大降低。
下面就讓我們以Oracle數據庫為例,探索一下Oracle數據庫的安全機制和安全實現。
Oracle數據庫自1977年肇始之初,就一直將安全置于首位,"Oracle"這個名字就是來自于美國中央情報局投資的項目代碼,而CIA也正是Oracle最早期的用戶之一。接觸過Oracle數據庫的人都應當熟悉一個類似如下圖所示的錯誤"ORA-00942:表或視圖不存在",這個簡單的錯誤提示,最初就是在CIA的要求之下作為一項安全防范設定的,這個提示的安全意義在于:避免提供任何具體的實質性提示性信息,以預防黑客的攻擊性嘗試。由此可見,安全防范可以從每一個細節入手,安全是一項全面整體的技術實現,并非孤立的存在。
接下來讓我們從Oracle數據庫的密碼機制上來深入了解一下Oracle的加密機制,雖然我們知道早在Oracle 數據庫版本8的年代,就已經提供了強大豐富的數據庫加密功能,但是直至今日,恐怕半數以上的數據庫中,仍然存放著用戶的明文密碼,并且未采用任何數據庫安全增強機制。這也就是我認為最重要的安全問題:我們并不缺乏安全防范手段,而是缺乏對于安全風險的認知。
誠然,我們對于安全的認識是隨著不斷出現的安全事故逐步增強的,但是希望大家都能夠有計劃的逐步增強對于數據庫的安全防范,主動規劃推進數據安全與從挫折中學習提高實有天壤之別。對于2011年底的密碼泄露事件,如果各大網站能夠采取基本的技術手段對用戶密碼進行一定的加密,那么這次密碼泄露的安全事件就不會顯得那么初級和惹人恐慌,想一想明文密碼和MD5加密串的區別?前者基本上意味著數據庫從未從安全角度進行過任何思考和增強。
Oracle數據庫的用戶信息及密碼存儲于一個名為USER$的數據表中(所有者為SYS用戶),我們可以通過基于USER$表建立的DBA_USERS視圖來查詢和獲得這些信息,包括加密的口令串。
在Oracle Database 11g之前,用戶口令通過DES加密算法進行加密,使用用戶名作為"Salt"(Salt指加密過程對加密數據額外使用的干擾字串,可以使用隨機或固定的Salt),密碼最長為30個字符,所有字母被強制轉換為大寫。從Oracle 7 至 Oracle 10g,加密一直使用username和password串連之后進行HASH運算,例如sys/temp1和system/p1將會獲得相同的HASH加密輸出。
從Oracle Database 11g開始,Oracle允許最多使用30個字符、大小寫混合方式作為密碼,同時支持DES和SHA-1算法進行加密(SHA-1算法支持大小寫混合,通過初始化參數SEC_CASE_SENSITIVE_LOGON開關),使用password||salt的方式進行HASH加密。
以下是Oracle 9i數據庫中口令的加密形式,DBA_USERS視圖的PASSWORD字段顯示了加密后的密鑰:
在Oracle 11g中,密碼從DBA_USERS視圖中隱藏起來,這進一步的增強了安全性,即便具有訪問視圖權限的用戶,也無法獲得口令的加密串,由此我們也可以看出Oracle數據庫軟件的安全增強歷程:
口令的加密內容存儲在底層的核心表(USER$是Oracle數據庫的元數據表之一,僅超級用戶或DBA用戶才能訪問)中,以下PASSWORD字段存儲的是DES加密值,SPARE4存儲的是SHA-1加密信息:
關于口令的維護,Oracle支持各種約束性限制(通過 utlpwdmg.sql 腳本啟用),諸如復雜程度、長度、有效期、失敗登陸次數等等,通過這些增強,Oracle的口令限制可以定制出非常穩固的安全解決方案,如果你從未接觸和研究過這些手段,那么可能就說明你的數據庫還缺乏足夠的第一層的安全防守。
如果我們能夠從Oracle的安全策略入手,學習一下Oracle的口令安全解決方案,那么就能夠構建一套較為完善的基本安全解決方案。從Oracle的第一個Internet版本 Oracle 8i(1998年發布)開始,Oracle就提供了一個加密包DBMS_OBFUSCATION_TOOLKIT 用于數據安全防護,這個加密包支持DES , 3DES 和MD5加密算法。
通過非常簡單的封裝調用,DBMS_OBFUSCATION_TOOLKIT 包就能夠實現數據加密,以下是一個簡單的示例輸出,對于給定字符串進行MD5加密,以RAW方式返回加密結果(通過創建穩固的函數,可以實現用戶登陸時的即時加密、比較、認證):
從Oracle Database 10g開始,DBMS_CRYPTO包被引入到數據庫中,該程序包支持更廣泛的加密算法,并用于替代DBMS_OBFUSCATION_TOOLKIT包,在新的版本中,諸如DES, 3DES, AES, RC4, MD5, SHA-1, MD4, HMAC_MD5, HMAC_SH1等等加密算法和加密方式都被支持。
通過選定的加密算法和加密方式,可以對重要數據進行加密和解密,我們不僅可以實現對于密碼或數值、字符數據的加密,甚至可以對類似LOB等非結構化數據進行加密。以下范例是使用DES算法CBC模式和PKCS5補碼規則的加密解密實現,示例模擬對于信用卡卡號的處理過程,金融類企業數據的安全性更為突出,需要進行安全加密的類型更為豐富:
在本文最后我想重申的是,對于不同的數據庫產品,都存在足夠成熟的安全實現手段,應用這些安全手段就能夠實現對于數據的基本保護,對于我們技術人最重要的是:認識和重視數據安全問題,并逐步推動企業或組織應用安全手段進行數據安全增強。
重視數據,保護數據,重視數據安全問題,這是每一位技術人的共同使命!