http://www.infoq.com/cn/articles/WebScan-CIphp
一. 當前Web應用安全現狀html
隨着中國互聯網金融的爆發和繁榮,Web應用在其中扮演的地位也愈來愈重要,好比Web支付系統、Web P2P系統、Web貨幣系統等。對於這些金融系統來說,安全的重要性是不言而喻的, 一旦黑客利用安全漏洞入侵系統後,損失的不只僅是數據,還包括企業或者客戶的財產。git
國內著名的烏雲漏洞平臺,天天都會爆出十幾條甚至幾十條各大網站的安全漏洞,好比:github
這裏麪包括了通訊、金融、銀行、能源、遊戲等各個行業的Web應用的各類漏洞,有一些已經形成了影響普遍的嚴重安全事件,例如:CSDN、1230六、小米用戶信息泄露事件,攜程網信息安全門事件、某快遞官網遭入侵1400萬條用戶信息被轉賣等等。sql
對於不少公司而言軟件系統安全關注的重點還在網絡和操做系統層面上,好比配置昂貴的網絡入侵檢測系統以等;不少開發人員安全意識薄弱,好比使用直接在代碼中組裝SQL語句,使用簡單的數據加密和認證的方案,使用弱口令以及在產品中嵌入一些特定的調試信息;不少測試人員也不會進行基於業務流程的安全測試;系統管理和運維人員對於不可預知的應用組件和依賴的安全漏洞沒法及時發現和修補。不少中小型公司基本不可能對於Web安全投入太多,好比沒法在開發的過程當中持續關注安全問題,從而致使系統上線以後還存在不少問題。所以,開發、測試和運維人員能充分理解安全的重要性以及掌握自動化安全掃描的方法和工具,對於開發一個安全的Web系統相當重要。後端
針對Web應用如此多的安全問題,全球範圍內的有志之士成立了OWASP(Open Web Application Security Project),致力於宣傳各類Web應用的安全問題。以及如何掃描、防護等知識,而且每2~3年還會發布世界範圍內排名前十的安全問題。雖然OWASP提供如此豐富的安全知識,可是不少開發團隊並無充分利用,有些甚至還不知道,有些知道卻不肯意投入。各類緣由致使當前中國互聯網上的衆多Web應用擁有大量安全問題。安全
二.持續安全掃描服務器
面對當前如此複雜和危險的互聯網環境,若是一個在線金融系統(好比網銀,P2P金融)存在安全問題,而系統管理員又沒有及時發現安全問題和修復,那麼時間越久,攻擊者對其利用的程度越高,系統遭受的損失越大。這些安全問題多是系統自己業務設計或者編碼遺留的問題,也多是依賴的第三方組件或者服務的問題。對於一些金融系統,修復安全漏洞哪怕只是晚幾個小時,損失也多是巨大的。若是不及時發現系統的安全問題並及時修復,那麼開發成本和系統損失隨着時間的推移可能會成指數級的增加。因此儘早發現安全問題並修復是節省成本和避免損失的有效方法。微信
對於軟件安全,當前許多企業只會在發佈或者上線以前進行一次滲透測試,以下圖:網絡
這種一次性的解決方案存在不少問題。其結果的有效性很難保證,若是發現問題可能會嚴重拖延發布時間等。爲了解決它們,能夠引入內建開發流程-BSI(Build Security In),以下圖:
其中自動化的靜態代碼掃描,動態系統掃描,依賴掃描以及初級的滲透測試均可以比較容易的在CI中實現。示意圖以下:
1. 靜態代碼掃描
利用靜態代碼掃描工具對代碼在編譯以前進行掃描,並在靜態代碼層面上發現各類問題,其中包括安全問題。部分工具列表:
工具 | 支持語言 | 版權 | 主頁地址 |
Fortify | 大部分語言 | 收費 | http://www8.hp.com/us/en/software-solutions/static-code-analysis-sast/ |
Checkmarx | 大部分語言 | 收費 | https://www.checkmarx.com/ |
Flawfinder | C/C++ | 免費 | http://www.dwheeler.com/flawfinder/ |
LAPSE | Java | 免費 | http://www.owasp.org/index.php/Category:OWASP_LAPSE_Project |
Brakeman | Ruby on Rails | 免費 | https://github.com/presidentbeef/brakeman |
利用動態安全掃描工具在系統部署以後對運行中的系統進行安全掃描。
2.動態安全掃描
動態掃描通常分爲兩種類型:主動掃描和被動掃描。
主動掃描是首先給定須要掃描的系統地址,掃描工具經過某種方式訪問這個地址,如使用各類已知漏洞模型進行訪問,並根據系統返回的結果斷定系統存在哪些漏洞;或者在訪問請求中嵌入各類隨機數據(模糊測試)進行一些簡單的滲透性測試和弱口令測試等。對於一些業務流程比較複雜的系統,主動掃描並不適用。好比一個須要登陸和填寫大量表單的支付系統,這個時候就須要使用被動掃描。
被動掃描的基本原理就是設置掃描工具爲一個Proxy Server,功能測試經過這個代理服務訪問系統,掃描工具能夠截獲全部的交互數據並進行分析,經過與已知安全問題進行模式匹配,從而發現系統中可能的安全缺陷。通常在實踐中,爲了更容易地集成到CI,會在運行自動化功能測試的時候使用被動掃描方法,從而實現持續安全掃描。示意圖以下:
部分工具列表:
工具 | 掃描漏洞類型 | 版權 | 主頁地址 |
ZAP | 通用Web應用漏洞 | 免費 | https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project |
SQLMap | SQL注入 | 免費 | http://sqlmap.org/ |
Burp Suite | 通用Web應用漏洞 | 收費 | http://www.portswigger.net/ |
N-Stalker | 通用Web應用漏洞 | 收費 | http://www.nstalker.com/ |
3.依賴掃描與監控
雖然自動掃描工具能夠發現大部分基本的Web安全漏洞,好比XSS,CSRF等,可是它不能發現業務邏輯、身份認證以及權限驗證等相關的安全漏洞,而對於這些類型的漏洞則須要開發相應的自動化安全功能測試。
因爲當前服務器應用依賴的第三方的庫和框架愈來愈多、愈來愈複雜,好比SSL、Spring、Rails、Hibernate、.Net,以及各類第三方認證系統等。並且系統開發的時候通常選定某個版本後在很長一段時間內都不會更新,由於更新的成本通常都比較高。可是每每這些依賴爲了添加新的功能和修復各類當前的問題——固然包括安全問題,卻會常常更新。開源項目的安全問題只要被發現之後,一般都會被公佈到網上去,好比CVE、CWE、烏雲等,致使不少人均可能利用它去攻擊使用這些依賴的系統。
依賴掃描就是經過掃描當前Web系統使用到的全部第三方依賴,並和網上公佈的安全漏洞庫進行比較,若是當前某個第三方依賴存在某種危險級別(須要本身定義)的漏洞,就當即發出警告(好比阻止CI編譯成功等)來通知開發人員或者系統管理員,從而在最短的時間內修復這個問題,防止攻擊,避免或者減小損失。示意圖以下:
部分工具列表:
工具 | 漏洞數據源 | 版權 | 主頁地址 |
OWASP Dependency Check | NVD和CVE | 免費 | https://www.owasp.org/index.php/OWASP_Dependency_Check |
Victims | CVE和Redhat | 免費/收費 | https://victi.ms https://github.com/victims |
三. 在CI中實現自動化安全掃描
將這三種類型的自動化安全掃描實踐集成到CI服務器中就能夠實現對系統的持續性安全掃描。
一、在項目構建階段進行依賴掃描與監控
對項目使用到的依賴進行安全掃描和監控是很是必要的,而將這一過程自動化可以進一步增強它的效果。這裏以OWASP Dependency Check爲例,介紹如何在項目構建階段進行依賴掃描和監控。OWASP Dependency Check是一款開源免費的自動化依賴掃描工具,它由OWASP開發並維護,使用NVD和CVE做爲漏洞數據源,自動識別依賴並掃描其是否存在安全問題。它提供Shell腳本、Ant插件、Maven插件和Jenkins插件。
以Maven插件爲例,首先在pom.xml文件裏添加這個插件 。
而後使用Maven對項目進行構建,OWASP Dependency Check插件會自動識別項目的依賴(包括間接依賴),對其進行安全掃描並生成報告。
在Jenkins中運行掃描並保存安全報告的配置以下:
下面的掃描報告中列出了Struts2和commons-fileupload兩個依賴存在安全漏洞,以及嚴重程度等信息,以下圖:
若是項目沒有使用Maven, OWASP Dependency Check還提供Jenkins插件,一樣能對依賴進行掃描,但這種方式須要明確指定所需掃描依賴的目錄或者文件名,Jenkins配置以下:
OWASP Dependency Check以自動化的方式對項目的依賴進行掃描,極大的下降了人力成本、提升了效率。不過目前它僅能掃描JAVA和.NET項目的依賴,針對Node.JS、客戶端JavaScript庫的支持還處於計劃階段。另外,目前它沒有提供Gradle的插件,若是您的項目使用的是Gradle,則只能用命令行的方式來運行它。
二、在自動化測試階段進行被動方式的動態安全掃描
針對Web應用的安全掃描工具很是多,其中OWASP ZAP是免費軟件裏面最爲經常使用的。雖然OWASP ZAP官方並無提供相應的方案和構建系統以及CI進行集成,可是有一些第三方的開源工具能夠幫助其集成。下面將以Gradle項目爲例,介紹如何在CI自動化測試階段集成ZAP並進行被動方式的動態安全掃描。
第1步:下載安裝ZAP。
第2步:在Gralde構建腳本中配置security-zap插件用於集成ZAP。
第3步:配置WebDriver,爲其設置代理。
默認配置下,security-zap插件在啓動ZAP以後,ZAP會偵聽本地7070端口,所以須要將WebDriver的代理設置爲localhost:7070,參見示例代碼18。
第4步:啓動ZAP並運行測試。
使用zapStart命令來啓動ZAP,用build來運行一次構建,在運行全部測試的同時進行被動掃描,命令以下:
gradle zapStart build -Dzap.proxy=localhost:7070
第5步:生成安全報告。
在全部的測試都執行完畢後,使用zapReport命令生成報告,命令以下:
gradle zapReport
它會在項目根目錄下新建一個名爲zap-reports的目錄,並將安全掃描報告放置其中。下面是一份示例安全報告,它列出了所測試的Web應用的安全漏洞,按照嚴重程度以及類別進行了統計,還包含了每一個安全漏洞的細節信息,報告以下:
第6步:關閉ZAP。命令以下:
gradle zapStop
第7步:Jenkins集成。Jenkins配置以下:
三、在測試環境部署階段進行主動方式的動態安全掃描
繼續以Gradle項目和OWASP ZAP爲例,在安裝好ZAP而且在構建腳本里配置好security-zap插件後(同上一階段的步驟一、2), 只須要使用zapStart和zapScan命令就能夠啓動主動式掃描,命令以下:
gradle zapStart zapScan
主動掃描的檢查能力更強,能夠彌補被動掃描的不足,但缺點是耗時長,以及在掃描須要身份驗證的系統的時操做複雜。
默認配置下主動掃描啓動後,security-zap插件會主動檢測掃描進度,默認掃描等待時間爲60分鐘。若是主動式安全掃描的執行時間超過了這一時間,security-zap會由於超時而終止運行,不過ZAP安全掃描並不會所以而中止,它還將繼續運行,直到完成全部的安全掃描爲止。若要了解當前掃描進度,能夠經過運行zapScanStatus命令查詢,命令以下:
gradle zapScanStatus
掃描完成後,經過運行下面的命令生成安全掃描報告,並關閉ZAP:
gradle zapReport zapStop
四. 總結
自動化持續Web安全掃描是一個複雜的課題,很大程度上依賴於自動化Web安全掃描工具的能力。當前絕大部分Web安全掃描工具並不能發現全部的安全問題,就算OWASP TOP10也沒法所有包括,可是它能夠在較小投入的狀況下持續發現大部分Web系統的基礎安全問題,從而防止大部分中級和幾乎全部初級的黑客攻擊。若是須要更高級別的安全保障,人工滲透性測試和威脅建模等必不可少,可是成本也是相對較高的。
因此對於Web系統的安全,首先要分析系統的安全需求和可用資源,在資源有限的狀況下應該首先實施自動化持續安全掃描。若是系統的安全需求很高,而且在資源容許的狀況下再投入人工滲透性測試等,從而得到安全上的最高投資回報比。
劉冉,ThoughtWorks高級軟件質量諮詢師, 超過10年軟件開發和測試工做經驗。熟悉嵌入式系統開發、Linux系統開發、各類腳本、測試工具、自動化測試系統開發、以及Agile中的QA。對服務器性能測試、Web功能測試,以及測試分層一體化解決方案有較深的理解。如今關注於全方位自動化QA的工做,包括自動化安全掃描。
馬偉,ThoughtWorks高級軟件開發諮詢師,長期從事企業級軟件開發工做,擁有豐富的Web應用開發經驗。熟悉Java、C#、Ruby、JS、HTML等前、後端開發技術,在工做中積累了豐富的Web應用安全經驗。目前專一於安全技術的創新與實踐,熱衷於探索和研究各類Web應用漏洞,對如何將安全實踐集成到敏捷開發流程中有濃厚的興趣和深刻的實踐,同時也是敏捷軟件開發的實踐者。
給InfoQ中文站投稿或者參與內容翻譯工做,請郵件至editors@cn.infoq.com。也歡迎你們經過新浪微博(@InfoQ,@丁曉昀),微信(微信號:InfoQChina)關注咱們,並與咱們的編輯和其餘讀者朋友交流(歡迎加入InfoQ讀者交流羣)。