本文僅從筆者的理解來展開縱深防御,并且主題限定在大規(guī)模生產(chǎn)(服務(wù))網(wǎng)絡(luò)而不是辦公網(wǎng)絡(luò)。
縱深防御這個(gè)在安全行業(yè)被用的很爛的詞,乙方的顧問寫方案時(shí)信手捏來,筆者想大家的理解可能并不一致。其實(shí)筆者比較贊同lake2用的“河防”以及數(shù)字公司用的“塔防”的概念,這些都是比較貼近實(shí)際的。
當(dāng)下各安全公司都偏愛APT和大數(shù)據(jù)威脅情報(bào)之類的概念,在辦公網(wǎng)絡(luò)筆者想這些是他們?nèi)Φ剡\(yùn)動(dòng)的戰(zhàn)場(chǎng),不過生產(chǎn)網(wǎng)絡(luò)似乎仍然遙遠(yuǎn)。自動(dòng)化運(yùn)維的交互模 型跟大幅度人機(jī)操作的辦公網(wǎng)絡(luò)完全不同,而且現(xiàn)在號(hào)稱機(jī)器學(xué)習(xí)的方法在實(shí)操中表現(xiàn)的很一般,效果不如對(duì)攻防模型抽象后定義規(guī)則的方式。這里并不是在否定機(jī) 器學(xué)習(xí)的方法,只是表達(dá)離成熟還尚有距離(筆者不是在說QVM,請(qǐng)不要對(duì)號(hào)入座)。
先說一下互聯(lián)網(wǎng)安全的一些理念性的東西,首先沒有漏洞是不可能的,互聯(lián)網(wǎng)追求快速交付,把安全做的太厚重是“不滿足業(yè)務(wù)需求的”,為追求極致的低缺陷率而大幅增加發(fā)布成本是不切實(shí)際的,但是互聯(lián)網(wǎng)安全有幾個(gè)比較核心的需求:快速檢測(cè)、有限影響、快速溯源,快速恢復(fù)。
通俗解釋一遍就是:允許帶著一些問題上線,但是有bug或入侵筆者能快速檢測(cè)到而不是無知無覺的狀態(tài),就算發(fā)生了攻擊或入侵,筆者能做到入侵者所獲取的 權(quán)限和造成的影響盡可能的小,并且筆者有途徑或快照還原入侵過程做根因分析,安全事件能在基本不響應(yīng)不中斷業(yè)務(wù)的情況下恢復(fù)到健康狀態(tài)。當(dāng)然這個(gè)話題也太 大,這次只討論其中關(guān)于“有限影響”的部分,在談及防御之前先看一下攻擊路徑:
Plan-A: 通常路徑,從目標(biāo)系統(tǒng)正面找漏洞,遠(yuǎn)程直接rootshell在現(xiàn)代基本沒有了,大多數(shù)是從應(yīng)用為入口,先獲取上層應(yīng)用的權(quán)限,然后通過上傳 webshell等方式間接獲得系統(tǒng)shell,最后提權(quán)獲得rootshell,后面繼續(xù)擴(kuò)大戰(zhàn)果的事情就不提了,安全建設(shè)的思路自然是要反過來,阻止 你擴(kuò)大戰(zhàn)果。
Plan-B: 如果正面沒有明顯可利用的漏洞的話就需要曲折迂回,從周圍信任域開始下手,這個(gè)信任域是廣義上的,包括可arp重定向的,可嗅探的,可會(huì)話中間人的,可鏈 路劫持的,相同內(nèi)網(wǎng)的,口令滿足同一規(guī)律的,互聯(lián)互通信任關(guān)系的,災(zāi)備或鏡像站點(diǎn)等,獲取一個(gè)點(diǎn)后再折返,之后的路徑與A類似。
Plan-C:直接針對(duì)生產(chǎn)網(wǎng)絡(luò)不行的話,就需要考慮社會(huì)工程學(xué)了,針對(duì)管理員和辦公網(wǎng)絡(luò)的APT,水坑攻擊,針對(duì)應(yīng)用后臺(tái)管理員的社會(huì)工程學(xué)技巧,搞定SA自然也就搞定了所有服務(wù)器。
安全建設(shè)是反入侵視角,針對(duì)攻擊活動(dòng)中的每一步“埋點(diǎn)”,埋點(diǎn)的寓意在于筆者假設(shè)攻擊者到了這一步,筆者要阻止他進(jìn)入下一步或者不能帶著完全的火力進(jìn)入下一步還能全身而退。當(dāng)然這里只針對(duì)有限影響,入侵檢測(cè)之類的部分這里先不展開,后續(xù)會(huì)有專門的話題。
第一層安全域劃分,這個(gè)安全域是對(duì)業(yè)務(wù)的抽象,并不是對(duì)物理服務(wù)器的劃分,在大規(guī)模分布式架構(gòu)中,同一個(gè)安全域的機(jī)器可能并不一定位于同一個(gè)物理機(jī) 房,但是他們對(duì)應(yīng)相同的安全等級(jí),共享一組相同的訪問控制策略,只對(duì)其他安全域或Internet暴露有限的協(xié)議和接口,即使攻擊者滲透了其他相鄰的服務(wù) 器,也只能掃描和訪問這個(gè)安全域內(nèi)有限的幾個(gè)端口,沒辦法自由滲透,這個(gè)問題主要解決Plan-B曲線救國(guó)時(shí)被入侵者“誤傷”,以及獲得單點(diǎn)root后進(jìn) 一步滲透的擴(kuò)散,希望能把安全事件爆發(fā)的最大范圍抑制在一個(gè)安全域中,而不是直接擴(kuò)散到全網(wǎng)。
第二層是基于數(shù)據(jù)鏈路層的隔離,只有2層隔離了才能算真正隔離,否則只在3層以上做ACL也是不行的,仍然會(huì)被ARP。2層使用 VPC,vxlan,vlan等方法相當(dāng)于在安全域的基礎(chǔ)上對(duì)一組服務(wù)器以更細(xì)的粒度再畫一道圈,進(jìn)一步抑制單點(diǎn)淪陷后受害源擴(kuò)大的問題。在不是特別大的 網(wǎng)絡(luò)中可以直接跳過安全域到這一步。當(dāng)然安全域的概念在任何時(shí)候都是存在的,僅僅是在做劃分的事情但不去套這個(gè)名詞。
二層之上就是協(xié)議端口狀態(tài)過濾,這是絕大多數(shù)“防火墻”的場(chǎng)景。解決的還是對(duì)黑客暴露的攻擊面的問題,即使筆者的加固做的不到位,不必要的服務(wù)沒有清 理干凈,開放了有問題的端口,甚至有些端口上跑著的服務(wù)還有漏洞,但是因?yàn)楸环阑饓^濾了,路由不可達(dá),所以攻擊者利用不了,他只能在對(duì)外或?qū)π湃斡虮┞?的端口上去想辦法。本質(zhì)一點(diǎn)就是給攻擊者提供“窄帶”,有限的訪問通道。不過在有復(fù)雜嵌套引用關(guān)系的大規(guī)模生產(chǎn)網(wǎng)絡(luò)中,出于運(yùn)維成本的考慮,有時(shí)候訪問控制策略不會(huì)做的很細(xì)粒度,因?yàn)槟菢拥脑捜绻信_(tái)機(jī)器掛了換個(gè)ip都麻煩。這也是安全的妥協(xié),筆者之后會(huì)有單獨(dú)篇幅講做安全是否需要妥協(xié),應(yīng)該如何妥協(xié),底線是什么。
再往上一層是現(xiàn)在討論的最多的一層,其實(shí)從圖中也可以看出你平日的工作都是聚焦于哪層。這一層單獨(dú)拆開都可以再建一個(gè)縱深防御的子體系。應(yīng)用層通常 是暴露在Internet上的攻擊面,這一層主要是解決認(rèn)證鑒權(quán)、注入跨站上傳之類的應(yīng)用層漏洞,盡可能把入侵者堵在第一人口之外。如果你在開發(fā)WAF, 那你對(duì)應(yīng)的也是這一層的工作。
應(yīng)用層上方是容器、運(yùn)行時(shí)環(huán)境。這里的目標(biāo)是假設(shè)筆者的服務(wù)器上的應(yīng)用程序有漏洞,且攻擊者找到了漏洞,筆者不希望這個(gè)漏洞能被成功利用直接跳轉(zhuǎn)到系統(tǒng) 權(quán)限,而是希望能在這一步阻止他,辦法就是通過容器加固,比如阻止一些危險(xiǎn)函數(shù)的運(yùn)行,比如上傳了webshell但是不被解析執(zhí)行,比如你想執(zhí)行 eval()并用種種方法變形編碼字符竄拼接逃過了應(yīng)用層的檢測(cè),但是到了運(yùn)行時(shí)其實(shí)是相同的底層指令,那么無論你在上層多么努力的變形筆者都會(huì)希望在更底 層把你揪出來,哪怕不直接阻斷筆者也至少報(bào)個(gè)警。在絕大多數(shù)入侵活動(dòng)中,上傳或生成webshell是從應(yīng)用權(quán)限向系統(tǒng)權(quán)限轉(zhuǎn)化的關(guān)鍵一步,所以這一層的防 御也是比較重要的。以后如果有時(shí)間單獨(dú)篇幅講如何對(duì)抗webshell。
對(duì)抗攻擊
如果不幸之前的都沒阻止攻擊者,對(duì)方已經(jīng)得到了普通用戶的shell”$”,那么筆者肯定不希望你繼續(xù)得到rootshell,對(duì)抗的辦法就是大家常 見的那些系統(tǒng)加固項(xiàng),那些文章洋洋灑灑寫了一大堆主要就是用在這個(gè)場(chǎng)景的,不過最主要的還是對(duì)抗本地提權(quán)以及內(nèi)核提權(quán),攻擊免疫或稱攻擊緩解機(jī)制例如 SMEP、SMAP、DEP、各種ASLR,stack-canay,read-only .PLT .GOT等都是在這里“埋點(diǎn)”,其他的諸如umask=022等也是在這里埋點(diǎn),似乎看上去這些不太需要安全team的介入,好像都是OS默認(rèn)的機(jī)制?
其實(shí)不然,安全做到偏執(zhí)的程度還是有自己出手的地方,Android出手比標(biāo)準(zhǔn)的Linux更快一點(diǎn),也許以后就真的沒太多需要自己出手的地方了。 不過當(dāng)下各種基于LXC的容器,越來越多的multi tenant的云環(huán)境,隔離的機(jī)制完全依賴于kernel的健壯性,這些場(chǎng)景下對(duì)抗這一層的攻擊都顯得尤為重要。
如果被拿走了root自然是很令人不爽的事,但還 不是最令人不爽的。如果有一天當(dāng)你的1萬臺(tái)服務(wù)器中有500臺(tái)被人搞了,而且還不能推斷是不是裝了kernel rootkit的情況下,這種感覺是最要命的,你生了個(gè)腫瘤手術(shù)摘掉也就算了,那種情況就像你手術(shù)完都不確定摘了沒,即便500臺(tái)服務(wù)器備份數(shù)據(jù)重裝系統(tǒng) 都不徹底,而且近似于你某個(gè)子業(yè)務(wù)要處于離線狀態(tài)這種極其影響可用性的事情業(yè)務(wù)部門會(huì)把你逼瘋掉。
所以不是特別需求要干掉LKM,/dev/kmem,限制/dev/mem的全地址空間讀寫,另外kernel MAC內(nèi)核強(qiáng)制訪問控制也能限制root只能做有限的事情,盡管理論上內(nèi)核提權(quán)還是能控制一切,不過要在沒有開發(fā)環(huán)境的服務(wù)器上實(shí)現(xiàn)完整的kernel rootkit功能并保證不在用戶態(tài)留下蛛絲馬跡的概率還是比較低。這樣做還有一個(gè)好處,把入侵檢測(cè)聚焦于用戶態(tài),不要?jiǎng)硬粍?dòng)就去裝一堆內(nèi)核級(jí)別的重量級(jí) 玩意兒,大規(guī)模高并發(fā)的生產(chǎn)環(huán)境傷不起。
在云計(jì)算環(huán)境中,上面那步可能還不算是單點(diǎn)滲透的終結(jié),更底層還有hypervisor,如果攻擊者逃逸出VM那就比較狼狽了,每個(gè)廠商都需要考慮 一下VMM的保護(hù)方案,現(xiàn)在hypervisor這一層很薄不會(huì)做的很重,似乎還沒有特別成熟和通用的辦法,不過肯定會(huì)發(fā)展起來,會(huì)有更多類似于XSM這 樣的方案。
在一個(gè)真正建立縱深防御的系統(tǒng)中,入侵者一般到不 了root這一步就會(huì)被揪出來,只不過完整的縱深防御要以后的篇幅慢慢寫了,這里只是選取了其中一個(gè)維度來試圖解讀這個(gè)概念。另一方面,完整的縱深防御體 系只有大型互聯(lián)網(wǎng)公司才可能全覆蓋,因?yàn)楦踩ㄔO(shè)成本有關(guān),所以又涉及另外兩個(gè)話題:不同規(guī)模企業(yè)的安全需求和同一公司在不同安全建設(shè)階段的需求,以后 再展開