最新資訊
科技新聞

雲端整合專家,提供全方位雲端顧問服務

科技趨勢

Snyk-為你守護安全的杜賓狗,從DevOps到DevSecOps只需要10分鐘

 

隨著 DevOps 概念的興起,大家對持續整合、持續部署 (CI/CD) 的流程也越來越適應與熟悉。從每3到6個月才上線新版本的傳統開發模式,到現在每週都會上線新版本並隨時調整產品的快速開發模式,這種持續不斷的迭代,我們能確保產品的安全嗎?

我們熟悉 CI/CD 的自動化流程,建立起 DevOps 的文化,但我們仍時時擔心發布的產品是否安全。

如果可以在 DevOps 中加入「安全(Sec)」這個概念,該有多好。

snyk_DevSecOps

其實 DevOps 到 DevSecOps 很簡單,只需要短短的10分鐘,就可以將「安全(Sec)」這個概念納入整個軟體開發生命週期。

在這裏,筆者要帶領你將 Snyk 加入 CI/CD 流程,10分鐘從 DevOps 升級到DevSecOps。

Snyk 有什麼功能?

說了這麼多,所以 Snyk 究竟能幫我做什麼?

Snyk_platform

Snyk 的服務包含四個面向的防護:

  • Snyk Open Source:檢測正在使用的開源套件有沒有已知的安全漏洞。
  • Snyk Code:檢測程式碼是否存在可能發生漏洞的撰寫。
  • Snyk Container:檢測用於部署的 container images 是否存在安全疑慮。
  • Snyk Iac:分析 Infrastructure as Code(如 Terraform、CloudFormation, Kubernetes YAML 等),檢測並修復相關的安全漏洞和配置問題。

以及兩種使用邏輯,分別是:

  • test:檢測是否存在漏洞,並發出警告。
  • monitor:持續定期監控漏洞,並提供 WebUI 用於可視化與輸出報告。

並且以多種方式使用 Snyk:

  • Snyk CLI
  • IDE Plugins
  • Web UI
  • 結合各類CI/CD工具,即時通知和整合

CICD_integrations

上述的內容與服務都可以隨意組合使用


 
 
# 例如 Snyk Code + test,以 Snyk CLI 方式使用 snyk code test # 例如 Snyk Open Source + monitor,以 Snyk CLI 方式使用 snyk monitor

想知道更完整的清單可以參考以下連結

Snyk Code 程式語言支援:https://docs.snyk.io/scan-application-code/snyk-code/snyk-code-language-and-framework-support
Snyk CI/CD 工具支援清單:https://snyk.io/integrations/
Snyk CLI:https://docs.snyk.io/snyk-cli

Gitlab CI/CD 與 Snyk 的碰撞

筆者在這邊使用 Java Maven 的專案作為範例,用 GitLab 做 CI/CD,帶領大家結合 Snyk 達成 DevSecOps。

流程圖

接下來會用上面的流程圖來構建整個DevSecOps的運作。

Snyk 在 Coding 階段做第一道防護

各位如果在用 VScode 做開發,肯定會安裝許多 plugin 來讓整個開發流程更順利。其實 Snyk 也有 plugin 可以安裝歐!

Follow 以下步驟做安裝…

Snyk_install_in_vscode

安裝完成後你就會看到一隻可愛的杜賓狗狗拉!!!
接下來,點擊杜賓狗圖標,按下 Connect VS Code with Snyk。

Snyk_auth

登入 Snyk 帳號,完成連結👍!

Snyk_aut_2

記得要去 Snyk in VScode 的設定中把想使用的服務打開拉!

Snyk_setting

開啟你的 Snyk ,按下開始箭頭,就可以開始檢查漏洞了!

Snyk_scan

左邊顯示了好多漏洞要修補😂😂😂,當然對於漏洞,Snyk也有幫你做分級。
告訴你哪些漏洞應該被及時修補,並且提供你修改的建議,真是太貼心了❤️!

Snyk_severity_levels

這些漏洞是怎麼被分級的,可以參考:https://docs.snyk.io/manage-issues/issue-management/severity-levels

Snyk 連結 GitLab Repository

在 Coding 完成過後,通常就會把 Code 推上各種 Git repository。
這裡筆者使用的是 GitLab ,當然 GitHub 也可以歐!

接下來要連結 GitLab 與 Snyk ,
首先登入 Snyk 的 Web UI (Ref:https://snyk.io/) ,
找到「integrations」這個選項後,可以看到很多在 CI/CD 過程會用到的工具都有被收錄進去誒😏!

我們的目標是 GitLab ,點他---->。

link_GitLab_and_Snyk

接下來輸入在 GitLab 上生成的 token ,
生成 token 的方式可以參考…

https://docs.gitlab.com/ee/user/group/settings/group_access_tokens.html

輸入 token 後,記得「Save」。
然後就開始可以 Import Project 了。

input_GitLab_token

可以等待「Importing projects…」,結束後就可以開始看報告了。

snyk_import_project

Snyk 結合 GitLab CI 自動化測試

剛剛我們把 Snyk 連結 GitLab 成功,得到了第一份報告。
我們要更進一步,把 Snyk 整合進 GitLab CI 來做自動化測試吧!!!

要加入 Snyk 的漏洞測試,我們需要在「.gitlab-ci.yml」加上一個測試階段。


 
 
# .gitlab-ci.yml stages: - test # 新增測試階段 test_snyk: image: snyk/snyk:maven # 使用snyk提供已經包好的image stage: test # 標記為測試階段的要執行的Job script: - snyk auth $SNYK_TOKEN # snyk登入授權 - snyk config set --org=$SNYK_ORG_ID # 設定測試結果要上傳的位置 - snyk monitor --all-projects # 應用程式的安全掃描 - snyk code test # 代碼的安全掃描 - snyk container monitor <container-name> # 容器的安全掃描 - snyk iac test --report # 基礎架構即代碼的安全掃描 allow_failure: true # 可選,允許失敗但仍然顯示結果

其中 SNYK_TOKENSNYK_ORG_ID 可以分別從以下位置找到

【 SNYK_TOKEN 】
SNYK_TOKEN

【 SNYK_ORG_ID 】
SNYK_ORG_ID

:bulb: 要記得在 GitLab 加入環境變數歐!

GitLab 在這裡加入環境變數…

Gitlab_add_var

接下來只要觸發 Gitlab CICD 的流程,就可以看 snyk 的測試結果了!
這部分還有很多細節要處理,例如:

  • Gitlab CICD 的觸發方式
  • Gitlab Runner 是否準備就緒

這部分就看各位的習慣拉,
如果有時間,筆者可能會再出一篇關於 GitLab CI/CD 設定的保母級教學。

經過一段時間的跑測試,結束後可以看到剛剛的測試出現了一個黃色的驚嘆號⚠️。
這代表你的專案還是有漏洞歐。

Gitlab_pipe_result

因爲先前有在 gitlab-ci.yml 中加上 allow_failure: true ,所以會發出警告後繼續進行下一階段。如果沒有加上的話,就會出現紅色的叉叉❌,並且停止在該階段。

在這邊推薦將 snyk 的各項服務拆分成不同的 Job 比較容易了解問題發生在哪裡,並且針對問題做修復。


 
 
# 推薦將 .gitlab-ci.yml 修改為下面的寫法 # 將各項服務做拆分 stages: - test # 新增測試階段 test_snyk_open_source: image: snyk/snyk:maven stage: test script: - snyk auth $SNYK_TOKEN - snyk config set --org=$SNYK_ORG_ID - snyk monitor --all-projects # 應用程式的安全掃描 allow_failure: true # 可選,允許失敗但仍然顯示結果 test_snyk_container: image: snyk/snyk:maven stage: test script: - snyk auth $SNYK_TOKEN - snyk config set --org=$SNYK_ORG_ID - snyk container test <container-name> # 容器的安全掃描 allow_failure: true # 可選,允許失敗但仍然顯示結果 test_snyk_iac: image: snyk/snyk:maven stage: test script: - snyk auth $SNYK_TOKEN - snyk config set --org=$SNYK_ORG_ID - snyk iac test --report # 基礎架構即代碼的安全掃描 allow_failure: true # 可選,允許失敗但仍然顯示結果 test_snyk_code: image: snyk/snyk:maven stage: test script: - snyk auth $SNYK_TOKEN - snyk config set --org=$SNYK_ORG_ID - snyk code test # 代碼的安全掃描 allow_failure: true # 可選,允許失敗但仍然顯示結果

改成這樣的話,就可以比較直觀的將問題拆分處理了!

可以看到我們將 snyk 提供的服務拆成了四大塊來做處理。

:tada: ~~~ 恭喜你,離安全又邁進了一大步。

Snyk 定期自動檢查發 Report

前面我們將 snyk 串接進 GitLab CI 自動化測試,
接下來,我們希望能定期的自動檢查專案是否有新的漏洞被發現。

snyk 結合了公開漏洞資料庫,例如 NVD(National Vulnerability Database),以及自家的漏洞資訊庫,來持續追蹤與發現的新的漏洞。

因此定期檢測也是產品安全很重要的一環💪💪💪。

我們來看看要怎麼做設定!

可以針對每個 file 來指定檢查的頻率。
setting_auto_scan_frequency

一天一次,一週一次,供你選擇!!!

setting_auto_scan_frequency_2

:bulb: 每天檢查,每週統合週報,養成定期習慣性留意資安問題的好文化。

下圖是設定全體專案的週報到你的 Email 去。

setting_weekly_report

會收到的郵件如下圖,左圖是週報,右圖是發現新漏洞的警告信。

snyk_report_email

:tada: ~~~ 恭喜你,離達成DevSecOps只差最後一步拉~

Snyk WebUI 看報告 & 自動修復漏洞

接下來說明一下,Snyk WebUI 如何看報告&自動修復漏洞。

可以用 Project or Report 的方式來看查看已發現的漏洞。

從 Project 的角度可以觀查單一專案的哪些 file 存在哪些問題,
並且可以使用簡易的 filter 來過濾發現的問題。

對於因套件或 image 所引發的問題,有的時候可以透過升級來完成修補。
snyk 很貼心提供自動尋找修補方案的服務!

參考以下的步驟,發送自動修復的 Merge Request!

snyk_auto_Merge_Request

snyk_auto_Merge_Request_2

從 Report 的角度可以縱觀全部專案的存在哪些問題,
並且使用更詳細的 filter 來過濾發現的問題與輸出報告。

snyk_report_view

:tada: ~~~ 恭喜你,成功建立起 DevSecOps 的流程了 !!!!

結語

謝謝各位能看到這裡,先給自己一個掌聲👏!!!

筆者希望透過這次簡單的範例,來突破各位對建立 DevSecOps 的心理障礙,擔心引入新概念會產生很多技術債。

雖然這篇文章的長度略長,但大多都是以圖片的方式呈現,期許各位能更容易的邁出安全的第一步。