如何使用混沌工程有效地“搞破壞”

本文要點:

  • 混沌工程的益處。該過程讓漏洞測試更全面和有效,最終使客戶受益。
  • 有壞處嗎?沒有,除非我們喜歡在系統於現實世界中運行時發現其弱點,不推薦這麼做。
  • 混沌工程概述。簡要分析混沌工程爲何是加強系統的最佳方法及實現它的4個步驟。
  1. 定義一個可測量的穩定狀態,該狀態代表正常情況,用作基線。
  2. 提出一個假設,即這個狀態將在控制和挑戰組中繼續存在。
  3. 把現實網絡壓力因素引入挑戰組,如服務器崩潰、硬件故障和斷開的連接。
  4. 在引入混沌後,試圖通過發現控制組和挑戰組之間的行爲差異,來推翻這個假設。
  • 通過自動化重複該過程。像Metasploit、Nmap和VPN這樣的自動化工具允許我們更改變量,並以指數級擴展測試。
  • 混沌工程最佳實踐。瞭解何時使用人工測試、如何應用容器化的混沌測試,以及如何控制爆炸半徑。
  • 測試工具和資源。隨着混沌測試越來越流行,可以預期已經令人印象深刻的工具和資源的選擇會增加。

更多的人連接到更多的服務器上,越來越依賴複雜的分佈式網絡,而開發中的應用程序的激增意味着增加了更多數據泄露和漏洞的機會。

現代的問題需要現代的解決方案,亞馬遜經歷了艱難的歷程。Netflix通過準備,用較小的不便解決了問題。

他們的做法有什麼不同?

亞馬遜基於雲的平臺AWS於2015年9月20日遇到了停電事故,造成了他們的服務器崩潰數小時,影響到很多供應商。Netflix把這個問題看成小事一樁,因爲他們在改變其服務交付模式時已經經歷過了。這促使其工程團隊爲軟件生產測試製定了獨一無二的解決方案。

解決方案?混沌可以預防災難。它基於把失敗作爲普遍現象而不是例外情況的想法,並促成了首個專用混沌工程工具的開發。它們被稱爲Simian Army,Chaos Monkey、Chaos Kong,該家族最新的成員是混沌工程自動化平臺(Chaos Automation Platform,簡稱ChAP)

DevOps中的混沌工程帶來的益處有哪些?

只關注網絡環境和相關的安全考慮(因爲混沌工程的範圍相當大),我們已經把它看作一種在已經很強大的網絡安全市場中改善業務風險緩解、培養客戶信心、爲IT團隊減少工作量的積極力量。如果我們是企業主,那麼會有幸擁有更快樂的工程師,降低收入損失的風險和更低的維護成本。

無論是B2B還是B2C,消費者將享受到更高的服務可用性,它們更可靠,更不容易受中斷。技術團隊將能夠減少故障事件,獲得對其應用程序工作原理更深入的見解。這將帶來更好的設計、對SEV更快的平均響應時間、更少的重複事故。

有壞處嗎?

評論家認爲,混沌工程只是另一個行業流行語,或主要是爲了給那些設計糟糕的應用程序打掩護。有些混沌工程的支持者認爲,這是自我驅動心態的結果。如果我們對自己的能力和工作成果有信心,那麼,對於測試它們的極限就沒什麼好擔心的。

混沌工程旨在消除8個邏輯謬誤,這8個謬誤困擾着那些還是分佈式網絡新手的很多開發人員和軟件工程師,同時,混沌工程爲更精細的測試提供一個系統。

這些錯誤的假設是:

  1. 網絡是可靠的
  2. 不存在延遲
  3. 帶寬是無限的
  4. 網絡是安全的
  5. 拓撲從不變化
  6. 每個系統只有一個管理員,並且,該管理員不會有變化
  7. 傳遞沒有成本
  8. 網絡是同質的

快速瀏覽一下世界各地的互聯網使用統計數據,該數據表明,在所有軟件開發階段都需要關注創新的網絡測試。爲了實現這一點,就意味着要對DevOps採用非傳統的方法

混沌工程及用例概述

基於雲的分佈式網絡實現了以前看不到的擴展性。由於這些網絡更復雜,並由於其功能的本質而具有內在的不確定性,因此,軟件工程師必須使用經驗方法來測試系統性和創新性的漏洞。

這可以通過控制的實驗來實現,該實驗製造混亂以確定任何給定的系統能夠承擔多少壓力。目標是觀察和識別系統性弱點。根據principlesofchaos.org的說法,該實驗應該遵循如下過程,含有4個步驟:

定義一個可測量的狀態,該狀態代表正常情況,用作基線。

提出一個假設,即該狀態將在控制組和挑戰組中持續存在。

把實際網絡壓力因素引入挑戰組,如服務器崩潰、硬件故障和服務中斷。

在引入混沌後,試圖通過發現控制組和挑戰組之間的行爲差異來推翻這個假設

這一過程背後的智慧表明,影響挑戰組的穩定狀態越難,開發人員能夠對其應用程序的強度和完整性就越有信心。暴露的漏洞爲部署前的改進提供了一個起點。

現在,讓我們更加深入地探討一下引入受控混沌如何改變軟件的設計方法。

建立並定義我們的穩定狀態和度量指標

我們的穩定狀態是應用程序正常的、預期的行爲,該應用程序沒有明顯的缺陷或漏洞。這取決於應用程序的目的和用例,因此,重要的是,在實驗開始的時候,確定我們的穩定狀態,定義用於評估性能的度量指標,並確定可接受的結果。

比如,在線購物者會被期望在裝滿購物車和結算的過程中不出現故障。用於評估結果的指標可能包含關鍵性能指標(Key Performance Indicators,簡稱KPIs),如購物車被丟棄的比率(對零售商來說,通常非常高,令人不安)或延遲,以及服務水平協議(Service level agreement,簡稱SLA)保證的正常運行時間百分比。我們可以通過評估指定時間段內收集的輸出來收集這類數據,該段時間將代表穩定狀態下的典型性能。

提出一個假設

我們應該利用數據集和其他信息,對預期輸出做出一個有根據的猜測。這些數據應該支持我們的假設,並且應該依賴於可測量的輸出而不是內部系統屬性。這迫使軟件工程師專注於驗證系統是否工作,而不是深入研究系統是如何或爲何工作的,這樣做會錯過重點。

以購物車爲例,工程師可能使用來自結算過程的數據以最優水平工作,並假設應用程序會允許消費者從產品所在頁面加載他們的購物車,進入結算頁面,彙總訂單,估計交付日期並生成發票,而沒有發生故障、重定向或其他錯誤。

迫使混亂接踵而至

有很多變量可以模擬,或以其他方式引入流程。這些應該反映應用程序在使用過程中可能發生的實際問題,並根據發生的可能性進行優先排序。可引入的問題包括與硬件相關的問題,如故障或服務器崩潰,以及與突發的流量峯值或突然增長相關的過程錯誤。

例如,在整個線上購物的過程中,如果因季節性的促銷造成大大超過預期的消費者反應,那麼可能會發生什麼事?我們還可以模擬服務器受到DDoS攻擊的效果,這種攻擊的目的是破壞網絡。任何會破壞穩定狀態的事件都是用於測試的候選項。

結果和假設的對比

把結果和最初的假設進行對比。系統是否按預期運行?或者比預計的好?還是產生了更糟的結果?這個評估不應該憑空進行,但是要包括來自團隊成員和用來進行試驗的服務的輸入。收集所有相關數據,並花時間來找出這些數據的含義,系統正常運行的位置,是否有任何地方需要改進或一個完全的改革。

通過自動化重複該過程

同樣,請記住,我們在本文中關注的是網絡安全,任何特定的軟件或工具都是從這個更狹隘的角度來討論的。

有幾種方法可以擴展該測試以增加我們的知識和找出潛在的解決方案。一旦我們解決了一個關注的地方,就要重新設置測試標準或參數,並用新的假設再次進行實驗。我們還可以通過每次測試遞增來擴大爆炸半徑,把新的或更多強大的壓力因素引入測試環境中,以便衡量系統的極限。

這個想法是,一次一個元素地,把儘可能多受控混沌引入到混合環境中,以便在系統完全崩潰前確定系統的最大極限。這可以在初始測試之後,通過引入自動化來進行。這樣,我們可以輕鬆地用新的因素或預測進行其他測試,並擴展測試或重新定義參數。

對於網絡漏洞測試,部署在這個環境中的兩個最有效的自動化工具是Metasploit和Nmap。

Metasploit是個開源框架,允許白帽黑客通過壞人的眼睛和想法來探測漏洞。由於我們在使用的工具和技術是罪犯在用的,使用的界面要求我們去掉保護措施,如反病毒軟件和防火牆,我們的VPN會允許我們自由地查找漏洞,而不會不必要地破壞數據的完整性,置系統的其他部分於危險的境地。

藉助免費的開源網絡映射器Nmap,在測試過程中,我們能夠獲得整個網絡環境更壯觀的視圖。它不斷地掃描我們的系統,記錄KPI,如正常運行時間和速度,但是,在混沌工程中,它有一個更重要的功能:遠程主機檢測。這樣一來,測試人員就不會盲目地進入這種狀況。

由於混沌工程的很大一部分涉及提出假設,然後證明或推翻它,獲取儘可能多關於遠程網絡的信息(包括OS和軟件),允許我們基於已知漏洞而不是猜測做出預測,並期望得到最好的結果。換句話說,它把測試團隊從“已知/未知”帶到“已知/已知”。

我們掃描單個網絡,或通過改變命令查看整個子網絡。

單個網絡掃描:

nmap target
# nmap target.com
# nmap 192.168.1.1

子網概覽:

nmap target/cdir
# nmap 192.168.1.1/24

掃描多個目標需要添加一個連接符以及最終目標編號,如下所示:

nmap target-50
# nmap 192.168.1.1-50

這將對直到50的IP地址範圍進行表面掃描。我們還可以簡單地在命令行的第一行中寫下target target1 target2,每個target之間用空格隔開。

由於這兩個工具都是開源的,因此,可以在任何OS或平臺上使用。

上面提到的虛擬專用網絡(virtual private network,簡稱VPN)也可以方便地用來進行這類實驗,而不僅僅是個簡單的防守角色。儘管它把軍用標準加密(AES-256)用於瀏覽器所有傳入和傳出的web流量,這通常是個很方便的事情,但是,很多面向消費者的VPN服務的標準功能是允許我們改變源IP地址和位置信息。後者是這裏的重點部分。由於VPN允許我們模擬來自其他國家或地區的用戶,添加他們爲變量,從而對去中心化的網絡進行建模,這就像我們之前討論的DDoS,它常被用於網絡攻擊,因此,VPN非常適合混沌實驗。

混沌工程最佳實踐

儘管混沌工程還沒有取代更傳統的質量保證(quality assurance,簡稱QA)測試形式,但是,它已經存在了很長時間,足以發展一些程序和最佳實踐。

我們需要關注的首要事情之一是儘量減小爆炸半徑。在生產環境中進行測試時,這尤其必要,因爲我們在這個過程中,可能會造成對實際消費者的傷害。選擇可提供有意義結果的最小可能影響點,而不會增加過度的風險。如果對我們來說,收集所需的數據和見解是必要的,那麼,我們可以用後續測試慢慢地擴展危險區域 。

如果這有助於減少我們的焦慮,那麼,我們可以在模擬環境中使用手工測試來實施預演,分析結果,然後在實時生產環境中重複或擴展,以便獲得更多相關的現實世界的結果。在我們需要回滾實驗或刪掉進程的情況下,制定一個備份計劃也是個好主意。

我們應該爲備份計劃也可能失敗的事實做好準備。我們的想法是引入受控的混沌,但我們永遠無法確定一個複雜的系統會怎樣表現,直到它完成了運行爲止。

另一個越來越常見的實踐是封裝混沌測試。容器的協調環境允許我們在服務級別單獨部署更多實驗,而不會有很高的中斷風險。我們可以一次銷燬一個容器,以創建一點點混亂,並且,該技術將創建一個新的副本,以便在我們完成後替換它。

如果由於服務器崩潰或其他問題而造成現有容器消失,容器化的環境還使實際應用程序更輕鬆地快速創建和部署新容器。它允許我們信任調度程序並實施驗證,在這種環境中勢在必行。

對於容器化的實驗,進一步是一個具有4個步驟的過程,它引導我們從測試那些我們知道的因素到那些我們不知道的,儘管,沒有法律禁止根據個人喜好轉換事物:

測試“已知/已知”或那些我們應該已經知道和了解的事物。比如,我們知道,當一個節點或副本容器關閉時,它將從節點集羣中消失。新的副本會被創建並重新添加到集羣中。

測試“已知/未知”或我們已經知道但缺乏理解的元素。這是我們瞭解上述內容的地方,但是,缺乏對在銷燬一個克隆和創建一個新克隆之間需要的時間的知識。

檢查“未知/已知”,這是我們理解但超出感知範圍的事物。在這種情況下,我們不知道在特定日期或特定環境中創建新副本的平均時間,但是,我們的確知道有多少副本和會創建多少副本來替換它們。

“未知/未知”,它們是我們不知道或沒有意識到的。例如,在整個系統關閉期間,我們不知道會發生什麼事或虛擬區域故障轉移是否有效,因爲我們沒有先前的試驗或比較基礎。

Kube Monkey是Netflix團隊的Chaos Monkey的一個版本,是特別爲在容器化的環境中進行測試而開發的。

測試工具和資源

一旦我們知道如何有效地接受混亂,那麼,就有很多部署的可行性。最好在生產環境中進行這些實驗,但是,我們可以使用很多工具來模擬真實事件,而不危害實際的系統或用戶。有很多自動化工具可用,它們在實時和模擬環境中都是有效和可靠的。

  • 如果我們在容器化的運行時環境中只運行幾個服務器,那麼,手工測試就很簡單。我們可以從管理UI中暫停隨機服務器,或把幾個SSH注入到一些容器中並銷燬它們。這也可以通過一個稱爲Pumba的仿真工具實現自動化。
  • Simian Army中的所有工具現在都已開源,使用完全免費。我們可以在這裏找到它們。
  • Git社區有一個活躍的混沌工程社區、不斷增長的知識庫和額外的資源。
  • chaostoolkit允許我們通過把策略定義爲JSON文件,把異常注入多個平臺中。

想找一些簡單的實驗試試?這裏有兩個簡單的,可以幫助我們放輕鬆並習慣混沌工程的想法和感覺。

資源枯竭的實驗

對於那些共享(通常便宜)託管平臺,或是經歷快速、出乎意料增長,導致資源緊張,挑戰CPU或RAM極限的網站所有者來說,這是個常見的問題。

這個單實例測試,涉及對磁盤、CPU和內存的攻擊,隨着系統的宕機,預期結果會產生良好的反應。但是,攻擊會在所有層上成倍增加,導致系統進入掉電模式,或在重新路由流量前發出火警警報。

不可用DNS的實驗

除了硬件可靠性,DNS服務器對保持網絡正常在線運行至關重要。模擬一個不可用的DNS服務器將允許我們擁有一個全面的恢復計劃,以備網絡可能出現這種罕見的事件。我們還可以更深入地瞭解應用程序在服務器丟失的情況下如何響應。

該攻擊模擬DNS服務器黑洞的單次出現,以便測試入站流量的減少和啓動可能無法初始化的假設。如果在現實中發生這樣的事情,我們的團隊會怎樣處理?

最後的想法

生產測試(Testing in production,簡稱TiP)是標準的軟件工程實踐。毫無疑問,DevOps團隊將在生產過程中的某些時間點上發現故障。傳統方法和混沌工程的區別在於,這些故障是作爲意外事件出現的,還是它們是故意引入的,以便衡量系統的優缺點。

混沌工程作爲大規模分佈式系統模型中特別針對和處理漏洞的方法應運而生。接受它可能需要一個文化轉變:從不惜一切代價保護應用程序,到允許我們的生活中有點兒危險。

它不會真的破壞系統。

引入受控混亂可以讓我們對它有更多的瞭解,這樣,我們可以把它構建得更具彈性。
學習更多的知識,並通過申請加入谷歌混沌社區論壇成爲一員參與討論。

作者介紹:

Sam Bocetta曾是一位安全分析師,作爲網絡工程師,爲美國海軍工作了很多年。現在,他處於半退休狀態,並從事教育公衆安全和隱私技術的工作。他的很多工作涉及突防試驗彈道系統。他分析網絡,尋找入口點,然後根據發現創建安全漏洞評估。此外,他幫助制定計劃、管理和實施複雜的“道德”黑客演習,以識別漏洞,並降低美國海軍(包括陸上和海上)所用的企業系統的風險狀況。他的大部分工作集中在識別和防止應用程序和網絡的威脅、降低攻擊維度空間、消除漏洞和一般性報告。他能夠識別弱點,制定新戰略,以加強網絡抵禦一系列網絡威脅。Sam和架構師及開發人員緊密合作,以確定跨應用程序的漏洞識別的緩解控制,並實施安全評估,以模擬各種威脅的策略、技術和過程。

原文鏈接:

How to Use Chaos Engineering to Break Things Productively

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章