CSSLP 學習筆記
保護軟體的核心觀念 Part 1 — CIA triad
前言
今年希望能學會資安相關知識,但因為學習經費不足,所以希望透過寫部落格直接讓社群上的專家驗證我的筆記是否正確,來完成取得認證的里程碑。
什麼是安全性?
為了能讓資安的概念能與商業價值整合起來,我們必須先知道什麼是安全性。因為安全性跟資訊安全兩個詞完全有著不同大小的範圍以及定義,同時也要考慮什麼叫做「安全」。設想一個完全不懂資安的高層主管遇到你,他要你告訴他,身為資安專家的你為公司做了什麼貢獻,你要如何告訴他你所提供的價值以保住飯碗?(笑)
所以,身為資安專家,我們要先知道資安有幾個面向:首先是保護性,我們如何保護組織的資產;安全性是很常提到的詞,我們透過多種實作方式達到安全性。其中保密性、可用性以及完整性這三個很常是重點的保護措施,也是這篇文章會提到的三個保護措施。安全性也很常跟信任綁在一起討論,我們如何取得可以信任的資料或資訊,與高層確保我們組織在資料供應、流程皆能運作正確,並且這些資料都很安全沒有被外部人士取得。
導入資安意識的挑戰
導入資安的幾個挑戰如:你的主管認為落實資安意識是浪費時間的,因為往往都有比我們更聰明的傢伙可以破解我們的系統,最重要的是這會增加他的工作,可能還要落實稽核制度;你的同事或是使用者覺得這應該是資安部門的事,他們不想參加無聊的資安研討會(其實我也會),因為這些知識可能出了研討會的門之後再也用不到了,同時落實資安政策會有很多的奇怪任務要執行,所以他們對導入資安沒有興趣,這些都是我們在提升資安意識時最常遇到的挑戰。
為了避免大家對這些工作抗拒,所以要清楚知道實踐資安的最終目標是什麼,思考著如何引起他人的關注,解釋其中困難的知識給大家,讓大家可以站在同一條線上,最後要能跟聽眾們展示組織將要如何落實這些知識到工作上,我們有什麼樣的里程碑要達成,讓資安的政策與技術在公司落地;讓大家認知到資安的重要性,保護好公司的資產也是很重要的觀念。透過倡導資安的重要性來建立企業文化,讓大家知道完成一件工作時同時也要考慮資安的事情,我們就離成功不遠了。
幾個常見的安全性策略
以下是幾個常見的安全性策略,我們探討應用程式保護策略,主要是下面幾個原因:
- 應用程式是最外層的介面,而多數的攻擊通常從這個地方發起。
- 應用程式裡面的商業邏輯通常負責取得資料,以及控制誰可以用這些資料,如果這邊被攻破會引發資料外洩災難。
- 達到運作的可靠性是最重要的商業基本要求,因此上面兩點變得很重要,一但系統被攻破,除了資料外洩,也可能造成系統無法運作,例如 2017 年的 WannaCry 會鎖定資料,用戶須付錢才能恢復檔案正常運作。
一般來說,我們常提到的安全性核心由三大要素組成:保密性、完整性、可用性,有時候又被簡稱 CIA triad。以下篇幅介紹幾個安全性策略:
保密性(Confidentiality)
保密性最主要的目的在於保護機密資料,而機密資料的定義是如果資料外洩給不對的人士,將會對企業或個人造成傷害,因此得要防止未經授權的資料揭露。但這樣的挑戰在於我們該如何讓正確人士取得對的資料,因此要來探討保密(Secrecy)。
常見要保密的資料大致有:
- 機密的交易資料
- 智慧財產例如正在開發的技術或是研究,如果這些資訊被洩露,可能造成一家公司數千萬以上的市場損失
- 商業計畫,如果這些資訊外洩,將會使其他企業搶走市場利潤。
- 軍事機密
另外值得注意的是涉及隱私的資料(Privacy Data):
- Personally Identifiable Information(PII)
- Protected Health Information(PHI)
- Payment Card Data — PCI-DSS
我們該如何「適當地」管理隱私資料,這個是個有挑戰的議題,以上面的列點,像是 payment card 的保護方式,是從產業標準下去規範資料的保存方式,以保護訊息避免遭未經授權的揭露。對於未授權而被公開的資料,我們可以先判斷這是故意的,或是人為不經意的將取得資料的方式洩漏出去;但多數情況下都是不經意洩露的,舉例來說一種是輸入密碼時同時被他人看到,或是相關資料沒有做好正確遮掩被別人直接看到;第二種是資料的隨意共享,例如員工透過聊天軟體傳送機密檔案,或傳送給外部人士;最後一種是報告上帶有機敏資訊,例如發票上的信用卡收據附上整個信用卡資訊如有效期限以及 CVC。
另一種資料被揭露的方式是資料發布的過程違反組織安全政策,我們稱這個為隱蔽通道 (covert channel),或是 hidden channel ,過程中我們用了其他的通道散佈資訊。隱蔽通道會造成兩種可能的攻擊方式,第一種是 Timing Channel,有心人士可以將訊息發送到一個接收來器觀察通訊內容,例如透過研究波形高低來破解正在傳送的訊息;另外一種是 Storage Channel,這是指檔案儲存在不安全的地方,有心人士可以透過一些攻擊手法另外取得資料。
縱使我們的資料是不經意或是被故意揭露的,我們很難去防止有心人士取得機密資料,因為有很多種方式都可以取的資訊,那我們該如何做好保護?
我們可以利用以下幾個方式來保護資料
- Masking/Obfuscation:例如你在輸入密碼時,不是顯示密碼而是顯示一個個黑點
- View based access control:只顯示使用者可以讀取的資料庫欄位,其他超出使用者可閱覽權限的資料表不可被讀取
- Encryption:將資料內容加密,使他人不易理解。
總結一下,資料的保密性通常是核心且基於法律和契約的需求,達成適當保護來防止不正當的資料揭露。
完整性(Integrity)
除了保護機密資料,我們也要確保系統運作的完整性,防止資料在不正確的運作下被修改或是揭露。舉例來說,ATM 要顯示該帳戶正確的餘額,或者是轉帳時要確保兩邊帳戶最終的餘額一致。
另外我們也要確保資料不會遭到不適當的修改或是改造,通常竄改資料的方式有加入假資料,例如在傳輸過程中駭客主動加入其他的資訊導致資料被修改,或是透過釣魚,使資料在不對的地方被人們修改,駭客取得資料進行改造。因為系統本身不具使資料精確的可靠性,例如自動修正拼字上的錯誤,但系統給的修正不見得是使用者想要的資料內容,那我們如何確保資料的精確性呢?我們可以透過輸入格式的檢查;適當的自動化處理錯誤;或是透過檢查碼確保修正的資料是否正確;甚至做完整性的查驗確保資料的交易完整性。
綜上所述,我們在設計應用程式來處理資料時,為了確保資料的完整性,我們要思考幾個重點,首先是網路是否穩定,我們傳輸過程中的資料是不是發送端與接收端一致;或是傳輸過程中的資料格式轉換是不是造成資料失真,例如資料切割時是否不適當的資料切斷使資料部分遺失;另外一個是四捨五入的運算有無正確運用,金融機構非常要求精準的數值,若隨意的四捨五入金額,會使得民眾覺得銀行對待錢的態度隨便而失去公信力;最後則是顯示資料要完整,不完整的資料呈現會使人不清楚是真的掉資料或是本來就沒有該資料。我們探討了資料完整的重要性,只探討資料如何正確到達接收端,還沒有討論到「資料可信度」。
把「資料可信度」加入,我們可以加入數位簽章來確保資料來源是指定的發送端,數位簽章做到兩件事,一是提供資料的完整性,另外則是發送端的身份驗證(前提是沒有人盜取帳號發送資料,且發送資料時要本人的私鑰來執行資料發送),這兩個條件使電腦可以確保資料來源沒有在傳輸的過程中被其他有心人士竄改。確保發送端的身份這行為,我們稱之為 proof of sender,它的功用如同我們寄電子郵件一樣,當信件寄出去時,不能說那個郵件地址是我的,但不是我發送的,原因如同前面所說,發送資料時要本人的私鑰來執行此動作。另外數位簽章確保資料在傳輸過程中沒有被修改。
完整性的實際案例非常多,舉其中兩個案例:軟體的簽章與資料可靠性都有著完整性的概念。軟體的簽章確保軟體是可信的來源,以及在交付此軟體的過程中沒有遭到第三方的惡意竄改,使軟體有機會被植入木馬程式在客戶端執行。資料的可靠性強調使內容完整的可信度有多高,我們的資料來源可以信任嗎?我們的財務報告內容可靠且精確嗎(SoX compliance)?
總結一下,資料的完整性在於保護敏感資料不被未授權的人修改,以及確保資料處理的過程是安全且合規的。
可用性(Availability)
可用性主要探討的面向是資料與系統的關鍵性,同時確保資料與系統的能夠在支援商業與目標需求時是可靠的。可用性的要求層級會根據商業或是系統需求而設計,這個資料或系統到底有多重要,來實現商業目標?
為了確保可用性,我們要探討什麼情況會造成系統不可用。我們主要要考慮兩件事,首先是考慮如何讓系統隨時可以被使用者訪問,而這樣的考慮可以再分為兩件事去思考:防止系統錯誤以及資料的丟失;另外則是挖掘一個系統的運作,通常我們會用單點錯誤(Single points of failure) 來思考,先辨識出每個關鍵運作點在哪以防止單點錯誤發生致使系統崩潰。
提高容錯率(fault tolerance)與故障轉移(failover) 是探討提高系統可用性的一部份。故障轉移通常透過提供多個備用設施或功能,以使單個組件的故障不會中斷服務,或是透過自動化來使主要的組件發生錯誤時,系統自動切換到備用組件。這個觀點來自於我們的系統是穩固、耐操並且足夠聰明地去辨識出問題發生的當下,系統可透過制定好的行動來矯正問題,並減輕系統中斷所帶來的損失。我們會透過系統複製(Replication)或叢集化(clustering)來達成上述理論。系統複製是透過設備、網路環境、運算效能的複製,用在共享負載(load sharing) 或是作為故障轉移的備用環境;而叢集化的觀點則是使多個單體共同運作,如果其中一個單體故障,不會影響到其餘的單體運作,使系統繼續提供服務。上述內容目前都可以透過系統自動偵測並且進行切換,而有些系統還是得透過人工切換到備用系統。
我們也要確保提供足夠的資源讓系統持續運作,這個跟可擴展性(scalability)有關。可擴展性目的是使設備可以擴充到符合營運需要,舉例來說,在系統高乘載量時,我們可以有更多的網路、CPU、記憶體、儲存體等資源來供應運作使系統不會中斷。可用性的意義在於系統隨時可以被使用者訪問,並且可以根據需要來提升或降低資源,這也是為什麼近幾年的雲端非常熱門,無論是自架的系統或是按需的資源請求都是為了快速調用運算資源供應商業需要。
系統的穩固、耐操性使系統能承受惡意攻擊或是裝置錯誤時持續運作,這個意思是系統可以在極度糟糕的情況下,例如效能被降得很低的環境確保核心功能能持續運作。
總結一下,可用性確保系統與資訊是否能夠達成目標需求,也是安全性的核心之一;可用性同時避免資料或是系統遭到破壞,並且是持續運作的能力之一。
To be continue…