返回文章列表

Harbor 容器映像檔掃描與管理

本文介紹如何使用 Harbor 進行容器映像檔的掃描與管理,包含 Harbor 的安裝、組態、映像檔推播、Clair CVE 掃描以及結果分析。同時也探討了 DevSecOps 工具集,特別是 OWASP ZAP 的基線掃描功能及其在 CI/CD 流程中的應用,以及如何自定義 ZAP 組態檔案以滿足特定安全需

容器化 資安

Harbor 作為一款開源容器映像檔登入服務,提供內建的 Clair CVE 掃描功能,有效提升容器安全性。本文首先說明如何安裝和組態 Harbor,接著示範如何推播映像檔並執行 CVE 掃描。同時,本文也介紹了 DevSecOps 理念以及 ZAP 基線掃描工具,說明如何使用 ZAP 進行安全掃描,並透過自定義組態檔案強化 CI/CD 流程中的安全管控。最後,文章也提供 ZAP 基線掃描報告的解析,以及如何根據需求調整 ZAP 組態檔案,使 CI/CD 流程在特定安全問題上中斷,確保應用程式安全。

使用 Harbor 進行容器映像檔掃描與管理

在前面的章節中,我們討論了多種容器映像檔掃描工具,包括 Trivy 和 Anchore。本章節將探討 Harbor,一款功能強大的開放原始碼容器映像檔登入服務,並展示其內建的 Clair CVE 掃描功能。

安裝 Harbor

首先,我們需要在伺服器上安裝 Harbor。根據官方建議,伺服器的硬體組態應至少具備 4 核 CPU、8GB RAM 和 160GB 磁碟空間,以確保順暢的執行。

步驟1:下載安裝指令碼

我們將從 GitHub 下載一個安裝指令碼:

# 從 GitHub 下載安裝指令碼
wget https://gist.githubusercontent.com/kacole2/95e83ac84fec950b1a70b0853d6594dc/raw/ad6d65d66134b3f40900fa30f5a884879c5ca5f9/harbor.sh -O install_harbor.sh

步驟2:執行安裝指令碼

接下來,我們將使該指令碼可執行並執行它:

# 使指令碼可執行
chmod +x install_harbor.sh

# 執行安裝指令碼
./install_harbor.sh

內容解密:

  1. wget 命令:用於從指定的 URL 下載檔案,並將其儲存為 install_harbor.sh
  2. chmod +x 命令:修改檔案許可權,使其變為可執行檔。
  3. ./install_harbor.sh 命令:執行安裝指令碼,開始安裝 Harbor。

組態 Harbor

在安裝過程中,我們需要編輯 harbor.yml 檔案以設定 Harbor 的組態。為了簡化起見,我們將繼續使用 HTTP 而不是 HTTPS。

步驟1:編輯 harbor.yml

首先,重新命名 harbor.yml.tmplharbor.yml

# 切換到 Harbor 目錄
cd harbor

# 重新命名組態檔案
mv harbor.yml.tmpl harbor.yml

步驟2:修改組態

編輯 harbor.yml 以註解掉與 HTTPS 相關的設定:

# https:
#   port: 443
#   certificate: /path/to/cert
#   private_key: /path/to/key

內容解密:

  1. cd harbor 命令:切換到 Harbor 的安裝目錄。
  2. mv 命令:重新命名預設的組態檔案範本。
  3. 註解 HTTPS 設定:由於我們選擇使用 HTTP,因此需要註解掉 HTTPS 相關的設定行。

步驟3:重新執行安裝指令碼

完成組態後,重新執行安裝指令碼:

# 傳回上一層目錄並重新執行安裝指令碼
cd ..
./install_harbor.sh

內容解密:

  1. cd .. 命令:傳回上一層目錄。
  2. 重新執行安裝指令碼:使新的組態生效。

使用 Harbor

安裝完成後,我們可以透過瀏覽器存取 Harbor 的 UI 介面,使用預設的使用者名稱 admin 和密碼 Harbor12345 登入。

步驟1:建立新專案

  1. 登入後,在左側導航欄中選擇 Projects,然後點選右側的 + New Project 按鈕。
  2. 建立一個名為 cloudnativesecurity 的新專案。

步驟2:推播映像檔到 Harbor

從另一台機器上,使用 Docker 將映像檔推播到 Harbor:

# 登入 Harbor
docker login -u admin -p Harbor12345 <Harbor伺服器IP或網域名稱>

# 提取 nginx 映像檔
docker pull nginx:latest

# 標記映像檔
docker tag nginx:latest <Harbor伺服器IP或網域名稱>/cloudnativesecurity/nginx:latest

# 推播映像檔到 Harbor
docker push <Harbor伺服器IP或網域名稱>/cloudnativesecurity/nginx:latest

內容解密:

  1. docker login 命令:使用指定的使用者憑證登入到 Harbor 登入服務。
  2. docker pull nginx:latest 命令:從 Docker Hub 提取最新的 nginx 映像檔。
  3. docker tag 命令:為提取的映像檔新增一個標籤,使其指向 Harbor 中的專案。
  4. docker push 命令:將標記好的映像檔推播到 Harbor。

掃描映像檔

在 Harbor 的 UI 中,進入 cloudnativesecurity 專案,找到剛推播的 nginx 映像檔,點選 Scan 按鈕以啟動 Clair CVE 掃描。

結果分析

掃描完成後,Harbor 將顯示該映像檔中存在的安全漏洞,包括不同嚴重程度的 CVE 清單,如圖所示。

此圖示顯示了 nginx 映像檔的掃描結果,包括不同嚴重程度的 CVE 統計。

此圖示關鍵資訊:
  • 掃描結果分類別:將 CVE 按嚴重程度分類別,如 Critical、High、Medium 等。
  • CVE 總數統計:顯示不同嚴重程度 CVE 的數量。

圖表說明

以下是CVE掃描結果的統計圖表示例:

@startuml
note
  無法自動轉換的 Plantuml 圖表
  請手動檢查和調整
@enduml
此圖示關鍵資訊:
  • CVE嚴重程度分佈:清晰展示了各類別CVE的數量分佈,有助於快速識別主要安全風險。
  • 資料解讀:Medium 及以上的 CVE 需要優先處理,以降低潛在的安全風險。

DevSecOps 工具集介紹

在接下來的六章中,我們將探討一系列適用於持續整合/持續佈署(CI/CD)軟體開發流程的安全工具。DevSecOps 的一個核心概念是“將安全向左移動”,即讓開發人員在開發過程的早期就能夠執行自己的安全測試。

為什麼選擇 DevSecOps?

DevSecOps 的出現是因為安全(Sec)被直接融入到 DevOps 流程中。另一方面,SecOps 通常指的是在傳統安全環境中的安全營運人員和流程,例如監控即時服務的 Security Operations Center。

本章重點

本章主要介紹 OWASP(Open Web Application Security Project)基金會開發的 ZAP(Zed Attack Proxy)工具,用於進行基線掃描(baseline scans)。ZAP 是一款非常流行的免費安全工具,適用於 CI/CD 流程。

ZAP 工具介紹

  • ZAP 是 OWASP 旗下的一款強大的安全測試工具,具有多種功能。
  • 它支援基線掃描,能夠檢查應用程式是否符合安全基線。
  • ZAP 提供了一個易於使用的使用者介面(UI),並且支援根據命令列的操作。

如何使用 ZAP?

首先,我們來看看如何安裝和使用 ZAP。ZAP 提供了多個 Docker 映象版本,如下表所示:

版本名稱用途
zap2docker-stable穩定版本,適合需要桌面 UI 的佈署
zap2docker-weekly每週構建版本,包含實驗性的功能和錯誤修復
zap2docker-live包含 ZAP 專案的所有變更,請謹慎使用
zap2docker-bare最小化版本,適合在 CI/CD 流程中使用

使用 Docker 執行 ZAP

執行以下命令,即可下載並執行 ZAP 容器:

$ docker run -u zap -p 8080:8080 -p 8090:8090 \
-i owasp/zap2docker-stable zap-webswing.sh

執行成功後,您可以在瀏覽器中存取 localhost:8080/zap 以使用 ZAP 的 WebSwing UI。

#### 內容解密:

此命令的目的是啟動一個 ZAP 容器,並將其 WebSwing UI 對應到本地的 8080 連線埠。其中:

  • -u zap 指定容器內的使用者為 zap。
  • -p 8080:8080 -p 8090:8090 將容器的 8080 和 8090 連線埠對應到主機的相同連線埠。
  • owasp/zap2docker-stable 是 ZAP 的穩定版本 Docker 映象。
  • zap-webswing.sh 是啟動 ZAP WebSwing UI 的指令碼。

使用ZAP進行基線掃描

ZAP(Zed Attack Proxy)是一款多功能的安全測試工具,可用於密碼暴力破解、SQL注入和跨站指令碼攻擊等多種任務。本文將介紹如何使用ZAP進行基線掃描,並將其整合到CI/CD流程中。

啟動ZAP容器

首先,我們需要啟動一個ZAP容器。使用以下命令可以啟動一個包含ZAP UI的容器:

docker run -t owasp/zap2docker-stable zap-webswing.sh

執行此命令後,可以使用docker ps命令檢查容器是否正在執行:

$ docker ps
CONTAINER ID   IMAGE                     COMMAND                  CREATED
c0993694b5f7   owasp/zap2docker-stable   "zap-webswing.sh"        37 seconds ago

內容解密:

  1. docker run 命令用於啟動一個新的容器。
  2. -t 引數分配一個偽TTY,使得我們可以與容器互動。
  3. owasp/zap2docker-stable 是包含ZAP工具的Docker映像名稱。
  4. zap-webswing.sh 是啟動ZAP UI的命令。

基線掃描

要進行基線掃描,首先需要停止之前的ZAP容器。使用Ctrl+Cdocker stop命令停止容器:

$ docker stop c0993694b5f7

接下來,使用以下命令開始基線掃描:

$ docker run -t owasp/zap2docker-weekly zap-baseline.py \
-t https://chrisbinnie.tld

內容解密:

  1. zap-baseline.py 是用於基線掃描的Python指令碼。
  2. -t 引數指定要掃描的目標URL。

掃描結果

基線掃描會執行一系列測試,並輸出結果。部分測試結果如下:

PASS: Directory Browsing [10033]
PASS: Heartbleed OpenSSL Vulnerability (Indicative) [10034]
PASS: HTTP Server Response Header [10036]

同時,也可能出現警告結果,例如:

WARN-NEW: Strict-Transport-Security Header Not Set [10035]

這個警告表示目標伺服器未正確組態HTTP Strict Transport Security(HSTS)。

生成HTML報告

要生成HTML格式的掃描報告,可以使用以下命令:

$ docker run --user $(id -u):$(id -g) -v $(pwd):/zap/wrk/:rw --rm \
-t owasp/zap2docker-stable zap-baseline.py \
-t https://chrisbinnie.tld -g gen.conf -r report.html

內容解密:

  1. --user 引數指定執行容器的使用者身份。
  2. -v 引數掛載本地目錄到容器中,以便讀取組態檔案和寫入報告。
  3. --rm 引數在容器離開後自動刪除容器。
  4. -g 引數指定組態檔案。
  5. -r 引數指定報告檔名。

使用 ZAP 進行基線掃描與自定義組態

ZAP 基線掃描報告解析

在進行基線掃描後,ZAP 會生成一份 HTML 報告,如圖 7.2 所示。報告頂部顯示了掃描過程中捕捉的 High、Medium、Low 和 Informational 等級別的結果。每個條目都提供了相關的詳細資訊。

對於某些問題,如「Strict-Transport-Security Header Not Set [10035]」,報告中提供了進一步的資訊和連結,以幫助使用者進行修復和研究。這些連結包括:

  • owasp.org/www-project-cheat-sheets
  • cheatsheetseries.owasp.org/cheatsheets/HTTP_Strict_Transport_Security_Cheat_Sheet.html
  • owasp.org/www-community/Security_Headers
  • en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
  • caniuse.com/stricttransportsecurity
  • tools.ietf.org/html/rfc6797

自定義 ZAP 組態檔案

在使用 ZAP 進行基線掃描時,可以透過 -g 選項生成一個預設的組態檔案,用於自定義掃描規則。生成的組態檔案包含了各種掃描規則的預設值,例如:

10098 WARN (Cross-Domain Misconfiguration)
10105 WARN (Weak Authentication Method)
10108 WARN (Reverse Tabnabbing)
10109 WARN (Modern Web Application)
50001 WARN (Script Passive Scan Rules)
90001 WARN (Insecure JSF ViewState)
90011 WARN (Charset Mismatch)
90022 WARN (Application Error Disclosure)
90033 WARN (Loosely Scoped Cookie)

使用者可以透過編輯此組態檔案來調整掃描規則的行為,例如將某個規則的警告級別從 WARN 改為 FAIL

組態 ZAP 使 CI/CD Pipeline在特定問題上失敗

要使 CI/CD Pipeline在掃描到特定問題(如「Strict-Transport-Security Header Not Set」)時失敗,使用者需要編輯組態檔案,將對應的規則 ID 的警告級別設定為 FAIL。例如:

10035 FAIL (Strict-Transport-Security Header Not Set)

然後,使用者可以透過 -u 選項指定組態檔案的位置(可以是本地檔案或遠端 URL),並在執行 ZAP 基線掃描時使用該組態檔案。

內容解密:

  1. 使用 -u 選項指定組態檔案:透過 -u 選項,使用者可以指定一個遠端 URL 來下載組態檔案,這對於自動化流程非常有用。
  2. 組態檔案的格式:組態檔案中,每行的格式為 rule_id level (rule_name),其中 level 可以是 PASSINFOWARNFAIL。使用者需要確保使用 tab 鍵來分隔各個欄位,否則可能會遇到錯誤。
  3. 錯誤處理:如果組態檔案格式不正確,ZAP 可能會傳回錯誤訊息,例如「not enough values to unpack (expected 3, got 1)」。這通常是由於使用了空格而不是 tab 鍵來分隔欄位所致。

ZAP 基線掃描的命令列選項

ZAP 基線掃描提供了多個命令列選項,用於控制掃描行為和輸出格式。常用的選項包括:

  • -t target:指定掃描目標 URL。
  • -c config_file:指定本地組態檔案。
  • -u config_url:指定遠端組態檔案 URL。
  • -r report_html:指定 HTML 報告的輸出檔案。
  • -w report_md:指定 Markdown 報告的輸出檔案。
  • -x report_xml:指定 XML 報告的輸出檔案。
  • -J report_json:指定 JSON 報告的輸出檔案。
  • -m mins:指定 Spider 執行的時間(分鐘)。

命令範例:

$ docker run --user $(id -u):$(id -g) -v $(pwd):/zap/wrk/:rw --rm \
-t owasp/zap2docker-weekly zap-baseline.py \
-t https://chrisbinnie.tld \
-u https://chrisbinnie.tld/custom-fail.conf -r fail-report.html

內容解密:

  1. Docker 命令解析:該命令使用 Docker 執行 ZAP 容器,並將當前目錄掛載到容器內的 /zap/wrk/ 目錄。這樣可以用於讀取組態檔案和寫入報告檔案。
  2. zap-baseline.py 指令碼:該指令碼是 ZAP 提供的基線掃描工具,用於執行掃描並生成報告。
  3. -t-u 選項的使用:透過 -t 指定掃描目標 URL,透過 -u 指定遠端組態檔案 URL。這使得掃描組態更加靈活。