在現今軟體開發生命週期中,安全已成為不可或缺的一環。GitLab 提供了豐富的安全掃描工具,讓開發者能在開發過程中及早發現並修復潛在漏洞。這些工具支援多種程式語言,並針對不同型別的掃描進行運作,有效提升程式碼安全性。GitLab 能自動偵測專案倉函式庫中的程式語言,並執行對應的分析器。若同一語言有多個分析器,GitLab 會同時執行,確保更全面的檢測,即使報告中可能出現重複結果。開發者可以根據需求組態掃描器,例如選擇性停用特定分析器以減少報告的複雜度,但建議盡可能啟用多個分析器以提升檢測率。值得注意的是,安全掃描工具的Pipeline工作透過狀態僅代表掃描完成,並不代表程式碼完全安全,需要仔細檢視掃描報告。GitLab 提供脆弱性報告、依賴性評估報告和容器掃描報告,開發者需理解其用途並正確解讀結果。除了內建工具,GitLab 也支援整合第三方安全掃描工具,提供更彈性的安全防護策略。靜態應用程式安全測試(SAST)是 GitLab 重要的安全掃描工具,它在程式碼編譯或執行前檢查程式碼,深入應用程式內部結構進行白盒掃描,尋找不良編碼習慣、反模式和潛在安全問題。開發者可以透過手動編輯 .gitlab-ci.yml 或使用 GitLab GUI 啟用 SAST,並透過設定變數、覆寫工作定義或使用 GUI 進行組態,例如排除特定目錄或停用特定分析器。SAST 的結果會顯示在 GitLab 的安全報告中,開發者需要根據報告內容修復程式碼中的安全漏洞。此外,機密檢測作為 SAST 的特殊版本,專注於尋找程式碼中意外隱藏的秘密資訊,例如 API 金鑰、SSH 金鑰等。它根據正規表示式運作,與程式語言和檔案型別無關,能有效防止敏感資訊洩露。

GitLab 安全掃描策略深入分析

在現代軟體開發中,安全性一直是個關鍵問題。GitLab 提供了多種安全掃描工具,幫助開發者在開發過程中即時發現潛在的安全漏洞。這些工具不僅支援多種程式語言,還能針對不同的掃描型別運作,確保程式碼的安全性。

GitLab 安全掃描的多語言支援

GitLab 允許在同一個專案中使用多種程式語言,並能自動檢測專案倉函式庫中的所有語言,針對每種語言執行相應的分析器。假設某種語言有多個分析器可用,GitLab 會同時執行所有相關的分析器。例如,如果啟用了 SAST(靜態應用程式安全測試)來掃描 Python 程式碼,它會同時執行 Semgrep 和 Bandit 分析器。如果這兩個分析器都檢測到相同的問題,你可能會在掃描報告中看到重複的結果。這看似會增加報告的複雜度,但確保了安全性。

分析器選擇與組態

如果執行多個分析器產生太多噪音,你可以組態大部分掃描器來停用特定的分析器。例如,你可以指定 GitLab 在進行 Python 程式碼的 SAST 掃描時僅執行 Bandit 分析器,而不執行 Semgrep 分析器。不過,GitLab 建議保持盡可能多的分析器啟用,以減少漏洞溜走的機會。

不同開源分析器由不同的開發團隊編寫和維護,因此每個分析器都有其獨特的焦點和成熟度。例如,Go 程式碼中的除零錯誤可能會被一個分析器報告為潛在問題,但另一個分析器可能會忽略它。這就是為什麼運作多個分析器能最大化漏洞發現數量的原因。

安全掃描對Pipeline的影響

大部分 GitLab 工作專案都會在包含失敗工作專案的階段完成後立即中止Pipeline。然而,GitLab 的安全掃描工具有點不同。每個成功執行的安全掃描工具都會將其Pipeline工作標記為透過狀態,無論它是否檢測到任何漏洞。這意味著看到安全掃描工具Pipeline工作透過狀態並不表示程式碼是安全的,只是表示掃描工具已經成功執行完畢。

漏洞報告與管理

GitLab 的安全掃描結果會出現在三種不同的報告中:脆弱性報告、依賴性評估報告和容器掃描報告。每種報告都提供不同的資訊,瞭解這些報告的用途非常重要,以避免誤解結果。

整合第三方安全掃描工具

雖然 GitLab 的內建掃描工具可能已經足夠保護你免受安全漏洞的威脅,但你還可以透過整合第三方安全掃描工具來補充你的安全測試。

SAST 的應用與組態

SAST(靜態應用程式安全測試)是 GitLab 提供的一種重要安全掃描工具。SAST 專注於檢查原始碼本身,而不是在程式碼執行時進行互動。這種方式也被稱為白盒掃描,因為它能深入應用程式內部檢查程式碼。

SAST 的主要功能

SAST 主要是尋找不良編碼習慣、反模式或潛在導致安全問題的設計缺陷。例如:

temp_dir = '/tmp'

此段簡單的 Python 程式碼可能包含潛在的安全隱患。SAST 會檢查這類別潛在問題並提醒開發者進行修正。

內容解密:

  • temp_dir = '/tmp':這行程式碼將 temp_dir 變數設定為 /tmp 資料夾。如果沒有適當地處理臨時檔案和目錄許可權設定,這可能會導致安全漏洞。
  • SAST 的功能:SAST 檢查的是靜態程式碼而非執行中的行為。它能識別出像上面這樣潛在危險之處。
  • 白盒掃描:白盒掃描是指直接檢查應用程式內部結構和邏輯。
  • 反模式與不良編碼習慣:SAST 不僅僅是找錯誤,還會找出可能導致未來問題的設計缺陷。

使用 SAST 掃描原始碼以尋找弱點

在程式碼中使用 SAST(靜態應用程式安全測試)來掃描弱點,是保證軟體安全性的重要步驟。這裡將詳細介紹如何在 GitLab 中啟用 SAST,並進行相關組態,以確保你的程式碼免於潛在的安全漏洞。

為什麼需要 SAST?

SAST 的主要目的是在程式碼編譯或執行之前,透過靜態分析技術來尋找潛在的安全漏洞。這對於大型專案尤其重要,因為手動檢查每一行程式碼來尋找安全問題是不現實且低效的。

舉個例子,雖然這段 Python 程式碼看似無害:

import os
os.makedirs('/tmp/my_temp_dir')

但它實際上是一個安全隱患。Python 的最佳實踐是使用內建的 tempfile 模組來建立和管理臨時目錄和檔案。這樣可以確保當程式結束執行時,這些臨時檔案會自動刪除,避免敏感資料留在檔案系統中。手動建立臨時目錄則容易忘記清理,這正是 SAST 設計要檢測的問題。

不同的 SAST 分析器針對不同的程式語言會尋找不同的安全漏洞。例如,GitLab 的 SAST 分析器可能不會在其他語言中檢測到類別似問題,因為該語言可能不認為該問題是安全漏洞,或者該分析器還不夠成熟。

啟用 SAST

在 GitLab 中啟用 SAST 有兩種方式:手動編輯 .gitlab-ci.yml 檔案或使用 GitLab GUI。以下將介紹這兩種方式。

手動啟用 SAST

要手動啟用 SAST,你需要對專案的 .gitlab-ci.yml 檔案進行以下修改:

  1. 確保Pipeline中已定義測試階段。
  2. 包含名為 Security/SAST.gitlab-ci.yml 的範本。

以下是範例程式碼:

stages:
  - test
include:
  - template: Security/SAST.gitlab-ci.yml

這段程式碼確保Pipeline中包含測試階段,並引入 SAST 範本。範本會自動新增相應的工作定義,根據專案中的語言來執行適當的 SAST 分析器。

小段落標題:SAST 範本的作用

範本檔案由 GitLab 提供,包含了定義新工作或新增其他功能的 CI/CD 程式碼。引入範本後,你可以在不瞭解其工作原理的情況下執行 SAST 檢查。例如,如果你的專案只有 Python 程式碼,範本會自動執行 Bandit 和 Semgrep 這兩個 GitLab 的 Python SAST 分析器。

當你提交這些更改並觸發Pipeline時,你會看到兩個新工作被新增到測試階段:一個是 Bandit,另一個是 Semgrep。

使用 GitLab GUI 啟用 SAST

使用 GitLab GUI 啟用 SAST 的過程相對繁瑣:

  1. 在左側面板中選擇「安全與合規」,然後選擇「組態」。
  2. 點選啟用 SAST 的按鈕。
  3. 組態頁面通常可以保留所有預設選項,然後建立一個合併請求(Merge Request)。
  4. 點選按鈕建立合併請求。
  5. 導航到合併請求頁面並合併它。

完成這些步驟後,你的 .gitlab-ci.yml 檔案應該包含測試階段和 SAST 範本。與手動編輯相比,GUI 操作稍微繁瑣一些。

組態 SAST

知道如何將 SAST 新增到 GitLab Pipeline後,我們來看看如何自定義其預設行為。有三種方式可以組態 SAST 或其他安全掃描器:

  1. .gitlab-ci.yml 中設定全域性變數。
  2. .gitlab-ci.yml 中覆寫範本新增的工作定義,並設定工作範圍變數。
  3. 使用 GitLab GUI。

組態 SAST 與全域性變數

假設你想停用 Python 的 Semgrep 分析器。可以在 .gitlab-ci.yml 中設定全域性變數:

variables:
  SAST_EXCLUDED_ANALYZERS: "semgrep"

這樣就可以停用 Semgrep 分析器而不影響其他分析器。

靜態應用程式安全測試(SAST)組態與使用

靜態應用程式安全測試(Static Application Security Testing,SAST)是一種在程式碼編譯或執行之前,檢查程式碼中的安全漏洞的技術。GitLab 提供了強大的 SAST 功能,可以幫助開發者在持續整合/持續佈署(CI/CD)Pipeline中自動化地進行安全測試。以下將詳細介紹如何在 GitLab 中組態和使用 SAST。

組態 SAST 變數

首先,我們可以透過在 CI/CD 組態檔案中新增變數來組態 SAST。例如,如果你想停用某些 SAST 分析器,可以新增以下變數:

variables:
  SAST_DISABLED: "true"

將這個變數新增到你的 .gitlab-ci.yml 檔案中,然後重新執行你的Pipeline,你會發現先前看到的 semgrep-sast 工作現在已經消失了。如果你的 CI/CD 組態檔案中已經有一個變數區段,應該將這個新變數新增到現有的變數中,而不是建立一個全新的變數區段。

覆寫工作定義來組態 SAST

假設你想要 Bandit SAST 分析器不掃描某些目錄,例如包含測試碼的目錄。你可能知道這些測試碼中充滿了安全漏洞,但你並不關心這些漏洞,因為客戶永遠不會使用這些碼。你可以透過編輯 .gitlab-ci.yml 檔案來覆寫觸發 Bandit 的工作定義,並在新的工作定義中設定一個作業範圍變數:

bandit-sast:
  variables:
    SAST_BANDIT_EXCLUDED_PATHS: "*/my_tests/*"

請不要被這個變數的奇怪值所困擾。這個特定變數期望的是用 fnmatch 語法編寫的值。這種細節可以在 GitLab 檔案中找到更多關於各種掃描器組態選項的資訊。

將這段程式碼新增到你的 CI/CD 組態檔案中,然後重新執行你的Pipeline,Bandit 分析器將不再報告在 my_tests 目錄中發現的任何漏洞。

內容解密:

以上程式碼展示瞭如何透過覆寫工作定義來組態 SAST。具體來說,我們在 .gitlab-ci.yml 檔案中新增了一個名為 bandit-sast 的工作,並在其內部設定了一個名為 SAST_BANDIT_EXCLUDED_PATHS 的作業範圍變數。該變數使用 fnmatch 語法指定了要排除掃描的目錄路徑。這樣做的好處是可以避免對某些不需要進行安全測試的目錄進行掃描,從而提高測試效率。

使用 GUI 組態 SAST

此外,你還可以使用 GitLab 的圖形化使用者介面(GUI)來設定某些掃描器的組態選項。例如,在啟用 SAST 的同一個 GUI 頁面上,你可以組態 SAST 使用替代 Docker 映像中的分析器、更改它執行的Pipeline階段或更改它在檢測專案語言時搜尋目錄的深度。你還可以使用該 GUI 頁面停用某些語言特定的 SAST 分析器,如果你發現它們無助或產生重複結果。

相比其他型別的掃描器,SAST 提供了大量從 GUI 組態選項可用。GitLab 檔案可以提供更多關於其他掃描器哪些選項可從 GUI 中設定以及哪些必須透過編輯 .gitlab-ci.yml 來設定。

檢視 SAST 的結果

啟用並選擇性組態 SAST 後,它會執行適當的分析器來檢查專案中所檢測到的語言,並將其發現顯示在 GitLab 的三個安全報告中。例如:

Figure 7.2 – SAST finding

這裡展示了一個與臨時目錄相關的漏洞發現報告範例。

機密檢測:尋找倉函式庫中的私人資訊

接下來我們來談談機密檢測(Secret Detection),這是一種專注於尋找原始碼中意外隱藏秘密資訊(如美國社會安全號碼或 AWS 佈署金鑰)的特殊版本 SAST。

機密檢測概述

機密檢測與 SAST 的運作方式相同:透過掃描原始碼而不是與正在執行的應用程式互動來尋找秘密資訊。機密檢測以前是 GitLab SAST 功能的一部分,但後來被分拆出來成為獨立的一級安全掃描器。

機密檢測尋找各種表示不應正常儲存在 Git 儲存函式庫檔案中的字串秘密。除了之前提到的社會安全號碼和 AWS 佈署金鑰外,還有以下幾種常見秘密:

  • Dropbox API 快取和長期金鑰
  • GitLab 個人存取金鑰
  • Heroku API 金鑰
  • 私人 SSH 金鑰
  • Stripe 請求令牌

例如:

MY_SSN = '123-45-6789'
MY_GITLAB_ACCESS_TOKEN = 'glpat-txQxy1frpAJodkxJYL8U'
MY_PRIVATE_SSH_KEY = '''
---
--BEGIN OPENSSH PRIVATE KEY
---
--
b3BlbnNzbmUAAAAEbm9uZAwAAAAtzc2gt==
---
--END OPENSSH PRIVATE KEY
---
--
'''

機密檢測根據正規表示式(regex),掃描器為每種型別要尋找字串都有對應正規表示式。

機密檢測運作原理

正規表示式使得機密檢測完全語言無關:由於它只掃描是否有字串比對正規表示式而不關心儲存函式庫使用什麼計算語言。因此不同於需要不同語言分析器進行不同語言檢查的 SAST, 機密檢測對所有原始碼檔案都只需一個分析器即可。

此外, 機密檢測也是檔案型別無關: 您可以檢視 JSON 組態檔案、README 和任何其他非二進位制檔案中比對正規表示式字串, 您也能像搜尋 Go 原始碼中的字串一樣搜尋 JSON 組態檔案中的字串。

內容解密:

以上程式碼展示瞭如何透過編輯 .gitlab-ci.yml 檔案來覆寫觸發 Bandit 的工作定義並設定作業範圍變數以排除特定目錄。同時也介紹了機密檢測如何根據正規表示式進行秘密資訊查詢且適用於各種不同格式和型別的檔案。 此圖示展示了靜態應用程式安全性測試(SAST)與機密偵測之間在功能上的關聯及其運作流程:

@startuml
skinparam backgroundColor #FEFEFE

title GitLab 安全掃描策略與 SAST 組態實踐

|開發者|
start
:提交程式碼;
:推送到 Git;

|CI 系統|
:觸發建置;
:執行單元測試;
:程式碼品質檢查;

if (測試通過?) then (是)
    :建置容器映像;
    :推送到 Registry;
else (否)
    :通知開發者;
    stop
endif

|CD 系統|
:部署到測試環境;
:執行整合測試;

if (驗證通過?) then (是)
    :部署到生產環境;
    :健康檢查;
    :完成部署;
else (否)
    :回滾變更;
endif

stop

@enduml

此圖示解說:

此圖示說明瞭靜態應用程式安全性測試(SAST)與機密偵測之間在功能上的關聯及其運作流程:

  1. SAST:SAST 用於分析程式碼以尋找潛在安全漏洞。
  2. 分析程式碼:SAST 在程式碼層面進行深入分析。
  3. 產生報告:分析完成後產生詳細報告以供開發者參考。
  4. 機密偵測:專注於尋找原始碼中意外隱藏之秘密資訊。
  5. 分析程式碼:機密偵測根據正規表示式進行快速字串比對。
  6. 產生報告:同樣會產生包含敏感資訊警告之報告。

透過此圖示瞭解兩者之間差異及其共同點, 希望能更清晰瞭解兩者功能運作原理。