風(fēng)險(xiǎn)從來(lái)都不是臆想和草木皆兵,就在你不經(jīng)意的時(shí)刻,可能風(fēng)險(xiǎn)就突然降臨到我們的身邊。
2016年年底,國(guó)內(nèi)很多用戶的 Oracle 數(shù)據(jù)庫(kù)遭遇突如其來(lái)的比特幣攻擊事件,大家種種猜測(cè)、揣摩、重試,引發(fā)了一次小小的數(shù)據(jù)恐慌。直至今日,還有用戶爆發(fā)出該問(wèn)題。現(xiàn)在我們?cè)俅位仡櫯c總結(jié),與中國(guó)的數(shù)據(jù)庫(kù)用戶們共為警醒。
我們知道,幾乎絕大多數(shù)數(shù)據(jù)庫(kù)的客戶端工具,在訪問(wèn)數(shù)據(jù)庫(kù)時(shí),都可以通過(guò)腳本進(jìn)行一定的功能定義,而這些腳本往往就是安全問(wèn)題的漏洞之一,黑客通過(guò) JOB、觸發(fā)器、存儲(chǔ)過(guò)程對(duì)數(shù)據(jù)庫(kù)進(jìn)行修改和破壞,手段非常初級(jí),但是也非常巧妙。
問(wèn)題癥狀
很多用戶在錄數(shù)據(jù)庫(kù)時(shí)發(fā)現(xiàn)該問(wèn)題,數(shù)據(jù)庫(kù)應(yīng)用彈出“鎖死”提示,并且威脅說(shuō)需要向黑客發(fā)送5個(gè)比特幣方可獲得解鎖。
在客戶端,可能獲得類似的提示信息:
除了這些警示和勒索信息,真正的攻擊是在數(shù)據(jù)庫(kù)中創(chuàng)建了大量的攻擊程序。
若攻擊的核心代碼包含以下語(yǔ)句,則會(huì) Truncate 數(shù)據(jù)表:STAT:='truncate table '||USER||'.'||I.TABLE_NAME。
我們對(duì)事件進(jìn)行了深入分析,找到問(wèn)題的根本原因是用戶從互聯(lián)網(wǎng)上下載的盜版PL/SQL Developer 工具(尤其是各種綠色版、破解版),在使用工具的過(guò)程中用戶的權(quán)限自然被附體地進(jìn)行了入侵。
受感染文件
在該軟件的安裝目錄有一個(gè)腳本文件 AfterConnect.sql, 正版軟件的這個(gè)文件為空,此時(shí) AfterConnect.sql 開(kāi)頭被偽裝成一個(gè) login.sql 的腳本內(nèi)容,有清晰的注釋代碼:
實(shí)質(zhì)內(nèi)容被加密,用戶只能通過(guò) unwrap 進(jìn)行解密(要留意解密程序也可能存在惡意代碼):
無(wú)疑,黑客是非常了解 Oracle 數(shù)據(jù)庫(kù)的,其腳本代碼的核心部分,解密后如下(做了刪減):
同時(shí),黑客非常專業(yè),在程序的開(kāi)端做了以下判斷:
也就是,判斷數(shù)據(jù)庫(kù)創(chuàng)建時(shí)間大于1200天,才開(kāi)始動(dòng)作(這個(gè)判斷相當(dāng)有見(jiàn)地,小庫(kù)和新庫(kù),數(shù)據(jù)少不重要,先放長(zhǎng)線釣大魚(yú)),如果你的數(shù)據(jù)庫(kù)還沒(méi)有爆發(fā),那可能是因?yàn)闀r(shí)間還沒(méi)有到。
如何應(yīng)對(duì)
如果數(shù)據(jù)庫(kù)遭遇到這個(gè)問(wèn)題,可以將 JOB 參數(shù) job_queue_processes 設(shè)置為 0 ,屏蔽掉 JOB 的執(zhí)行,然后重啟數(shù)據(jù)庫(kù)??梢郧宄⑷雽?duì)象,這些對(duì)象可能包括以下同名觸發(fā)器和存儲(chǔ)過(guò)程:
數(shù)據(jù)安全的十六條軍規(guī)
安全防范 請(qǐng)從今日開(kāi)始
這次數(shù)據(jù)庫(kù)安全事故,因?yàn)槭芎φ弑姸?,引發(fā)了企業(yè)的普遍關(guān)注。有的企業(yè)甚至要求停用PL/SQL Developer這一工具。但是我們知道數(shù)據(jù)庫(kù)類似的門如此之多,如何能夠從根本上提升數(shù)據(jù)庫(kù)管理的安全,減少數(shù)據(jù)運(yùn)維風(fēng)險(xiǎn)呢?
我曾在《數(shù)據(jù)安全警示錄》一書(shū)中總結(jié)了種種數(shù)據(jù)安全風(fēng)險(xiǎn),提出了很多預(yù)防措施和手段,在此整理其中一些建議供大家參考。
數(shù)據(jù)安全可以基于五個(gè)緯度來(lái)梳理:軟件安全、備份安全、訪問(wèn)安全、防護(hù)安全、管理安全。并據(jù)此建立相應(yīng)的安全防護(hù)措施。
在這五大方向中,可能出現(xiàn)兩種性質(zhì)的安全問(wèn)題,第一,由于內(nèi)部管理不善而導(dǎo)致的數(shù)據(jù)安全問(wèn)題;第二,由于外部惡意攻擊入侵所帶來(lái)的安全問(wèn)題。通常我們把安全問(wèn)題狹義化為后者,這實(shí)際上是片面的,在數(shù)據(jù)安全問(wèn)題上,前者造成的數(shù)據(jù)損失、數(shù)據(jù)損毀,其發(fā)生率和影響度都遠(yuǎn)遠(yuǎn)超過(guò)后者。
在企業(yè)數(shù)據(jù)安全中,這五大方面是相輔相成、互有交叉、共同存在的,其中軟件安全是數(shù)據(jù)庫(kù)安全的基礎(chǔ),而備份安全是最重要卻最容易被忽略的方面。有效備份才能在故障之后獲得及時(shí)的恢復(fù)和挽救。很多歷史事件表明,備份安全問(wèn)題導(dǎo)致的企業(yè)傷害可能遠(yuǎn)遠(yuǎn)大于黑客攻擊。
針對(duì)本次的比特幣勒索事件,我抽取書(shū)中的觀點(diǎn),總結(jié)提升數(shù)據(jù)庫(kù)安全的“16條軍規(guī)”供大家參考。
■備份重于一切:我曾經(jīng)在總結(jié)的DBA四大守則的第一條就指出,備份重于一切。對(duì)于重要的生產(chǎn)環(huán)境,適當(dāng)建立備庫(kù)進(jìn)行數(shù)據(jù)保護(hù),查詢分擔(dān),會(huì)減少生產(chǎn)庫(kù)的風(fēng)險(xiǎn);而在故障發(fā)生時(shí),有效備份可以保證系統(tǒng)獲得及時(shí)的恢復(fù)和挽救;
如果有什么會(huì)讓DBA們從夢(mèng)中驚醒,那就是沒(méi)有備份! 所以對(duì)于數(shù)據(jù)庫(kù)運(yùn)維來(lái)說(shuō),第一重要的是做好備份,有備方能無(wú)患;
■嚴(yán)格管控權(quán)限:在進(jìn)行用戶授權(quán)時(shí)一定要遵循最小權(quán)限授予原則,避免因?yàn)檫^(guò)度授權(quán)而帶來(lái)的安全風(fēng)險(xiǎn)。本次安全風(fēng)險(xiǎn),如果用戶不具備DDL權(quán)限,那么也不會(huì)遭到風(fēng)險(xiǎn);
■明確用戶職責(zé):明確不同的數(shù)據(jù)庫(kù)用戶能夠用于的工作范圍,職權(quán)相稱,最大限度避免錯(cuò)誤,降低風(fēng)險(xiǎn)。 即便是擁有管理員職責(zé)的用戶,也應(yīng)當(dāng)遵循以不同身份執(zhí)行不同任務(wù)的習(xí)慣;
■密碼策略強(qiáng)化:毫無(wú)疑問(wèn),數(shù)據(jù)庫(kù)用戶應(yīng)當(dāng)使用強(qiáng)化的密碼規(guī)則,確保弱口令帶來(lái)的安全風(fēng)險(xiǎn),很多數(shù)據(jù)泄露問(wèn)題來(lái)自弱口令攻擊和提權(quán);
■限制登錄工具:明確限制不同工具的使用場(chǎng)景,規(guī)定工具的準(zhǔn)確來(lái)源,或者通過(guò)堡壘機(jī)等來(lái)限制數(shù)據(jù)庫(kù)訪問(wèn)。對(duì)于工具也可以做出相應(yīng)規(guī)則和限制,以減少安全風(fēng)險(xiǎn)甚至誤操作風(fēng)險(xiǎn);
■禁止遠(yuǎn)程DDL:可以限制DDL操作僅能在數(shù)據(jù)庫(kù)服務(wù)器本地進(jìn)行,禁止遠(yuǎn)程連接執(zhí)行DDL操作,這一手段在很多公司被嚴(yán)格執(zhí)行,如果具備這一規(guī)則,此次的事故可以被直接屏蔽掉;
■使用綁定變量:在開(kāi)發(fā)過(guò)程中,嚴(yán)格使用綁定變量,可以防范SQL注入攻擊,減少數(shù)據(jù)庫(kù)安全風(fēng)險(xiǎn);這次安全事故,很多用戶一開(kāi)始都猜測(cè)是SQL注入,走了很多分析上的彎路;
■監(jiān)控監(jiān)聽(tīng)日志:監(jiān)聽(tīng)日志記錄了數(shù)據(jù)庫(kù)訪問(wèn)的來(lái)源、程序等信息,包括惡意掃描,密碼嘗試等,一定要重視監(jiān)聽(tīng)日志的作用,并對(duì)其進(jìn)行分析和監(jiān)控,以清楚的匯制數(shù)據(jù)庫(kù)訪問(wèn)圖譜;
■數(shù)據(jù)網(wǎng)絡(luò)隔離:數(shù)據(jù)庫(kù)的網(wǎng)絡(luò)環(huán)境應(yīng)該一直隱藏在最后端,避免將數(shù)據(jù)庫(kù)置于直接的訪問(wèn)連接之下,由此可以減少數(shù)據(jù)庫(kù)的訪問(wèn)風(fēng)險(xiǎn);
■測(cè)試和生產(chǎn)隔離:互通就意味著同時(shí)可以訪問(wèn),也就可能帶來(lái)很多意想不到的風(fēng)險(xiǎn),企業(yè)應(yīng)當(dāng)進(jìn)行分離部署,一方面可以降低誤操作的可能性,也可以屏蔽一些無(wú)關(guān)的訪問(wèn),從而從網(wǎng)絡(luò)鏈路上保證數(shù)據(jù)安全;
■密碼差異設(shè)置:有些測(cè)試環(huán)境或者非產(chǎn)品環(huán)境是利用產(chǎn)品環(huán)境恢復(fù)得到的,DBA在建立了測(cè)試環(huán)境后,就沒(méi)有修改數(shù)據(jù)庫(kù)用戶的登錄密碼,而也習(xí)慣在所有環(huán)境中設(shè)置通用的密碼。這些習(xí)慣為系統(tǒng)帶來(lái)了很多風(fēng)險(xiǎn)。 建議用戶在不同環(huán)境中采用不同的密碼設(shè)置,進(jìn)一步降低了DBA在錯(cuò)誤的環(huán)境下執(zhí)行命令的可能性;
■重要數(shù)據(jù)加密:很多重要數(shù)據(jù)需要加密存儲(chǔ),最典型的就是用戶和密碼信息,大量的泄密事件本質(zhì)上是因?yàn)槿狈ψ罨镜募用芊婪?,?duì)重要數(shù)據(jù)實(shí)施一定的安全防護(hù)加密,是應(yīng)當(dāng)予以適時(shí)考慮的安全方面之一;
■適時(shí)的軟件升級(jí):這里的軟件指數(shù)據(jù)庫(kù)軟件,尤其是當(dāng)Oracle已經(jīng)發(fā)布了安全補(bǔ)丁,已知的安全漏洞被黑客利用,則更可能對(duì)數(shù)據(jù)庫(kù)產(chǎn)生致命的傷害;
■防范內(nèi)部風(fēng)險(xiǎn):不可否認(rèn),絕大部分安全問(wèn)題都來(lái)自于企業(yè)內(nèi)部,來(lái)自最緊密、最輕易的接觸和訪問(wèn),企業(yè)的人員變動(dòng)、崗位變更,都可能導(dǎo)致數(shù)據(jù)安全問(wèn)題的出現(xiàn),單存依靠對(duì)管理員的信任不足以保障數(shù)據(jù)安全,必須通過(guò)規(guī)章、制度與規(guī) 范的約束才能夠規(guī)避安全風(fēng)險(xiǎn);
■樹(shù)立安全意識(shí):安全問(wèn)題最大的敵人是僥幸,很多企業(yè)因?yàn)閮e幸造成了數(shù)據(jù)的損失。一點(diǎn)一滴加強(qiáng)安全意識(shí),逐步完善安全措施;
■開(kāi)始安全審計(jì):以O(shè)racle數(shù)據(jù)庫(kù)為例,數(shù)據(jù)庫(kù)已經(jīng)提供了很多安全防范的手段和方法,我們建議用戶適當(dāng)展開(kāi)安全防范措施,開(kāi)啟部分任務(wù)審計(jì),定期分析數(shù)據(jù)庫(kù)風(fēng)險(xiǎn),由此逐步完善數(shù)據(jù)庫(kù)安全。