觀點

漫談Web Application Security

2007 / 04 / 23
阿逸多資訊
漫談Web Application Security

「知己知彼、百戰不殆」!想要談安全防禦當然得先瞭解自身可能面臨威脅的對象為何?威脅的來源出自何處?筆者將Web Application Security的議題由實務架構面區分為網路(Network)、 主機(Host)及應用程式(Application)三大部分。惡意的入侵者可能透過服務主機所處網路環境存在的弱點、主機本身的漏洞或開發應用程式時忽略的安全顧慮,針對提供應用服務的單位進行滲透、破壞甚至竊取機密資訊的行為。綜觀近來的資安事件與筆者任職公司對客戶進行滲透測試(Penetration Test)的結果,Web Application儼然成為滲透路徑的最佳管道,尤其利用應用程式的弱點開啟企業資訊大門的手法更是日新月異、層出不窮。繼續將針對「保衛您的網路」(Secure Your Network)、「保衛您的主機」(Secure Your Host)與「保衛您的應用程式」(Secure Your Application)三大主題進行更深入的探討。
保衛您的網路
由網路架構規劃面的角度來看待Web化應用系統的安全問題,我們必須審慎地將Web-based Application System模組化,並將不同功能的主機依據任務的特性與存放資料的敏感性規劃於不同的網段之中,並部署適當的資訊安全產品(如Firewall、IDS/IPS、Anti-Virus Solution、Anti-Spyware Solution、Secured WAN/LAN Router….)。一般而言會將對外提供服務的Web Server安裝於受防火牆保護的非軍事區(DMZ),並透過防火牆本身具備的存取控管機制(Access Control List),僅開放非軍事區(DMZ)中特定的網路服務通訊埠(如TCP Port 80…等),以防止惡意使用者透過其他網路服務的弱點進行滲透的行為。存放具敏感性的資料庫主機(包含客戶及使用者的機密資料與資訊)則安置於防火牆內部網段,採用內部虛擬網路地址,並透過存取控管的設定僅允許特定來源網路地址與通訊埠對資料庫主機進行網路連線。針對其他網路安全設備除了本身具備的偵測防禦功能與適當的部署之外,更重要的是需要透過定期的事件記錄分析工作瞭解實際的現況,並即時更新及調整各項適當的防禦政策(Log Analysis & Policy Tuning),才能因應隨時更新的各項惡意攻擊手法,適當地保衛您的Web化應用系統所使用的網路環境。

保衛您的主機
基本上Web-based Application System至少可以區分為Web Server、Web Application Server與Database Server三種不同功能與目的之主機。除了主機的作業系統需要即時地補強已知的弱點之外,更需要關閉其他不需要的服務與通訊埠,以減少弱點存在的可能性。另外針對Web Services(如:Microsoft IIS、Apache…)、Web Application Services與Database System可能存在的漏洞也需隨時掌握並適時防堵。一般可於主機上安裝各式的安全防禦軟體來保護您的主機,但更重要的是需要定期進行安全稽核,隨時瞭解主機的現況,進而依循Security Step-by-Step的處理原則,逐步強化主機安全以便能降低遭受入侵破壞的風險。

保衛您的應用程式
由於一般應用程式開發需要耗費大量的人力與成本,也因此專案管理( Project Management )、系統開發生命週期(SDLC:System Development Life Cycle)、軟體成熟度模型整合(CMMI:Capability Maturity Model Integration)等議題一直都是大家所關切的重點,各大軟體廠商也相繼提供各式各樣的整合開發平台與環境,以利軟體開發人員能方便地專注於程式撰寫並有效掌控專案開發的進度與時程。通常系統開發的生命週期不外乎分為「概念規劃」、「軟體分析」、「軟體設計」、「軟體建置」、「軟體測試」、「軟體安裝」及「運作與維護」等七個階段,研發人員在瞭解系統需求之後就開始著手進行設計與開發,主要的目標就是在既定的期限內完成工程規格(Engineering Specification)與設計文件(Design Document)所定義出的功能,並交由測試部門針對系統進行各項測試,一旦發現問題後依循既定的流程修正並測試,直至系統開發完成後正式上線。在這一連串應用程式開發流程進行的同時,通常會透過專案管理的手法設定各項控制點並有效控管專案進行的時程與資源,並參考CMMI各等級之標準流程提高軟體的成熟度與可靠度,期望能提供給使用者穩定而方便的應用程式進而提高使用率與滿意度。
在討論完應用程式開發流程之後,我們可以發現只有在「軟體測試」階段有正式提及驗證的工作,當然研發人員在開發階段也會進行本身所負責模組的測試工作(Unit Test)與整合測試(Integrated Test),但不論白箱測試(White-Box Test)或黑箱測試(Black-Box Test),所檢測的內容不外乎是針對內部實作的流程及功能面進行測試。既然在開發週期中會進行各項測試的工作,為何筆者在前段文章中還提及應用程式的弱點可能是駭客開啟企業大門最常用又有效的一把鑰匙呢?原因出在以往大部分的軟體開發小組(含需求分析師、規格制訂者、系統分析師、程式設計師與品保人員等)通常會將焦點注意在如何提升本身所負責工作範圍的專業能力,再加上開發期程的都有一定的時間壓力,所以比較少站在資訊安全的角度去思考問題。相信讀者們應該經常會聽到「腳本隱碼攻擊」(Script Injection)、「SQL隱碼攻擊」(SQL Injection)、「跨站腳本攻擊」(Cross Site Scripting)、「緩衝區溢位攻擊」(Buffer Overflow)…等針對應用程式的攻擊手法,有心人士若想要利用上述方法進行惡意的滲透破壞,只需上網利用搜尋引擎輸入關鍵字,就會找到很多現成的工具或武功秘笈可以使用,甚至還有某些「成功案例」可供參考並輕易得手!

該如何保護應用程式的安全呢?當然落實安全檢驗工作是最直覺的解決方法。目前許多資安廠商也陸續推出專門針對Web化應用程式的解決方案,讓使用者瞭解應用系統的弱點(如:Web Application Scanner、Web AP Assessment Service)並在最短的時間內將已知的問題隔離(如:Web Application Firewall)。但由於惡意攻擊手法日益更新,既有的解決方案也需要推陳出新隨時跟上攻擊的趨勢,再加上修補程式弱點的工作也是曠日費時,筆者認為長期的因應之道應該是加強開發人員的資訊安全意識與技能,將各項資安考量(Security Issues)適當地加入於系統開發生命週期的各個階段之中,把軟體自身的免疫系統改善至最佳狀態,並配合週期性的安全稽核工作隨時進行修補與調整,降低可能面臨威脅的風險。
綜觀上述的論點,撰寫安全的程式碼(Writing Secure Code)必然是非常重要的工作項目,但要將Web Application Security的責任完全歸於程式開發人員身上卻又太過於沈重。因為資訊安全原本就是一項「全員運動」,系統管理人員專注於網路與主機的防護工作、研發人員注意自己程式開發的安全漏洞,連使用者都必須要有正確的使用觀念與資安意識,才能避免遭受有心人士利用各項巧妙的網路詐騙手法獲得個人的機密資訊(如帳號、密碼…等)。所以如何提升不同對象的資安意識(Security Awareness)並隨時掌握自身的資安現況,持續不斷的資訊安全教育訓練與定期的安全稽核也是不容忽視的課題。如此才能因應「行動化」資訊時代的來臨,讓大家擁有一個安全無虞的Web化資訊使用環境。
註:依據筆者的經驗,應用程式諸多的問題很多時候都脫離不了「輸入值驗證」(Input Validation)的範疇。