這半年四處演講關於 DevSecOps 系列,到上禮拜 HITCON Defense Summit 應該就是今年的尾聲了。
十分感謝 HITCON 提供這麼好的環境,也感謝這幾場大家的捧場,讓大家一起多認識 DevSecOps,還能互相交流討論真的很不錯。
我們即將在 HITCON Winter Training 開課!讓大家親自體驗在 DevOps 中導入資安,歡迎大家持續關注並且親手實踐 DevSecOps!
議程重點
這次議程的主題是持續,這個議程我們用 SAST(靜態應用程式安全測試) 為例子來實作持續式資安測試。
為了達到「持續」資安測試,我們需要朝一個目標前進:將資安「左移」。
將資安左移
資安測試在傳統瀑布式開發,通常會在最後驗證階段的位置。導致一但發現問題,修復的時間、人力等成本通常都很高,且資安的問題很可能會影響的不只有開發,甚至要改變需求和架構。
而「將資安左移」,就是為了減少漏洞的修復成本。加上自動化並且持續測試,更能降低資安風險帶來的損失。
DevOps + Security
而就算不是使用瀑布式開發,敏捷式開發雖然有較低的修復成本,但如果沒有持續將資安納入考量,也等同是選擇「忽略」或「接受」資安風險而已。
這次的議程即是 DevSecOps,是建立在 DevOps - Dev、Ops、QA 這三個圈圈上導入資安。而 DevSecOps 並不是再加上一個圈圈,是要在這三個每一個環節,都有資安的意識。
SAST 持續式資安測試
要將 SAST 靜態工具整合進 CI 中,有三個要點:
- 調校工具:畢竟測試項目多到無法在 CI 做完所有測試,且測試速度也是 CI 流程中十分要求的。調校工具的「測試範圍」和「測試速度」就顯得十分重要。
- 容器化:目的是為了方便整合,並且更好程式化、自動化加入 CI 中。
- 持續:不管是「持續優化工具」或是「持續測試」,不能讓這些工具只是測完一次就結束,而是要讓這些測試的價值最大化。
我們將會以三種類型的靜態測試整合為例子:敏感資訊洩漏檢測、程式碼靜態掃描、第三方函式庫檢查。
敏感資訊洩漏檢測 - TruffleHog
在現今每天都有上千把金鑰洩漏的年代,如果沒有持續檢查程式碼裡的敏感資訊,一個不注意往往會釀成大禍。
我們可以使用 TruffleHog 這樣的工具檢查程式碼裡是否含有 Token、金鑰、密碼等敏感資訊,指令很簡單:
$ trufflehog file:///my-repo-dir/
經過我的測試,如果照上面的指令不調整任何參數,測試需要 7 分鐘的時間,且掃到的問題多到看不完,大部分都是偽陽性(False Positive),這並不符合我們左移和持續整合的精神。
我們可以「調校工具」,優化掃描的範圍並且優化測試項目:
$ trufflehog --max_depth 3 --entropy=False --regex --include_paths ./inc.txt --exclude_paths ./exc.txt file:///my-repo-dir/
不僅大幅提高精準度,還讓測試時間降成 2 秒鐘!要將工具整合,調校工具是不可或缺的。
程式碼靜態掃描 - Bandit
以 Python 程式碼為例,我們可以使用 Bandit 來執行靜態程式碼掃描。目的是為了避免使用到危險函數、弱加密演算法以及注入攻擊等問題:
$ bandit -lll -ii --exclude ./tests -r .
這類的開源工具有一個很大的缺點,那就是「False Positive 非常高」,可能會掃到上百、上千條問題,但只有不到十條是真正有風險需要修的。
為了避免偽陽性,我們在 CI 只要先做到一個基本標準(Baseline)就好:先只挑出「高嚴重性」的問題,並且針對幾個重點測試項目進行掃描即可(如上圖 Bandit 內建的掃描項目和黑名單函式)。
至於剩下沒有被挑中的中低嚴重性的問題,則可以藉由弱點管理工具(像是 DefectDojo)來幫助我們管理弱點和評估。
第三方函式庫檢查 - Snyk
我們的開發環境使用到了大量的框架、套件、函式庫,但使用的這些套件是否真的安全沒被中後門?是否真的沒有漏洞?
Snyk 就是來檢測「供應鏈」上的安全,確保所使用的函式庫是沒有安全漏洞的。
Snyk 是一個平台,可以在上面設定 GitLab Token,它就會自己幫你跟 GitLab CI 進行整合,或是也可以使用他們的指令工具來掃描。
全部串在一起
整合工具的要點:調校工具、容器化、以及持續。
我們可以將這些工具包成容器或直接安裝工具,就可以加進 CI 的測試步驟中,用 GitLab CI 寫個簡單的例子:
stages:
- linter
- security-test
- deploy
image: python:3.7.5-alpine3.9
linter:
stage: linter
script:
- "/bin/sh ci/linter.sh"
sensitivecheck:
stage: security-test
script:
- "/bin/sh ci/sensitive-check.sh"
SAST:
stage: security-test
script:
- "/bin/sh ci/sast.sh"
deploy:
stage: deploy
only:
- master
script:
- "/bin/sh deploy.sh"
簡單幾行就可以完成,從零到導入這些工具甚至不用一天的時間!
也許對大家來說可以多花點時間研究、學習工具和了解資安測試項目。但其實,整合資安持續式測試,踏出的第一步並沒有想像中困難且花時間。
今後每當你提交一段程式碼,它就會自動幫你掃資安測試。一切自動化、並且持續地進行檢測。
將資安左移,並且持續吧!
這個議程的主軸之一,就是將資安「左移」,左移的好處,不僅可以 「及早」發現問題,降低資安風險;並且 「持續」檢測,自動化且更快發現問題。
而這一切都可以 降低「成本」:自動化掃描,減少人力的成本;及早發現問題,降低修復的成本;DevOps 團隊將資安內化,也降低了團隊間溝通的成本。
實踐的第一步往往看起來很困難,是因為我們並沒有嘗試了解和動手執行,DevSecOps 的第一步,可以從很小的地方開始,加入資安,並且持續疊代成長。