身為一位在資訊安全領域打滾多年的技術工作者,我深刻體認到自動化在 DevSecOps 中的重要性。Bash 指令碼,以其簡潔、強大與易於整合的特性,成為我建構自動化安全流程的首選工具。今天,我將分享多年累積的實務經驗,帶你一窺 Bash 指令碼在 DevSecOps 中的應用奧秘。

安全為本:Bash 指令碼的 DevSecOps 實踐心法

在 DevSecOps 的世界裡,自動化安全檢查是守護系統的第一道防線。Bash 指令碼,如同一位靈活的守衛,能自動執行各種安全任務,讓潛在威脅無所遁形。

指令碼初始化:穩固的根基

穩固的基礎是安全堡壘的根本。在指令碼初始化階段,我習慣加入一些重要的安全措施,確保指令碼的可靠性:

  • 嚴格的錯誤處理: 如同建造房屋的地基,任何錯誤都可能導致整個結構崩塌。set -euo pipefail 設定,讓指令碼在任何命令出錯時立即停止,防範未然。
  • 檔案名空格的陷阱: 空格在檔案名中很常見,卻常常成為指令碼錯誤的元兇。設定 IFS=$'\n\t',讓指令碼正確處理檔案名中的空格,避免誤判。
  • 清晰的變數與預設值: 如同地圖上的標記,清晰的變數和預設值讓指令碼更易讀、易維護,也更容易排查問題。
  • 時間戳記的報告: 為每個報告加上時間戳記,就像為檔案加上日期標籤,避免報告被覆寫,方便追蹤歷史紀錄。
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
SCAN_DIR=${1:-"."}
REPORT_DIR="/opt/devsecops/reports"
LOG_FILE="/var/log/security_scanner.log"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
REPORT_NAME="security_scan_${TIMESTAMP}"

這段程式碼設定了指令碼的執行環境,包含錯誤處理、輸入欄位分隔符號、掃描目錄、報告目錄、日誌檔案和時間戳記等關鍵變數。這些設定如同城堡的城牆,為指令碼的執行提供了安全保障

日誌記錄:明察秋毫的哨兵

日誌如同哨兵的眼睛,記錄系統的一舉一動,讓安全事件無所遁形。

# 日誌設定
setup_logging() {
  if [[ ! -f "$LOG_FILE" ]]; then
    sudo touch "$LOG_FILE"
    sudo chmod 644 "$LOG_FILE"
  fi
}

log() {
  local level=$1
  shift
  echo "[$(date +'%Y-%m-%d %H:%M:%S')] [${level}] $*" | tee -a "$LOG_FILE"
}

# 錯誤處理器
error_handler() {
  local line_num=$1
  local error_code=$2
  log "ERROR" "指令碼在第 ${line_num} 行發生錯誤 (錯誤碼: ${error_code})"
}

trap 'error_handler ${LINENO} $?' ERR

setup_logging 函式確保日誌檔案存在,並設定適當的許可權。log 函式則負責將訊息寫入日誌檔案,並同時顯示在終端機上,方便即時監控。error_handler 函式搭配 trap 命令,捕捉指令碼執行過程中的錯誤,並記錄詳細的錯誤資訊,方便事後分析。

環境驗證:確認彈藥充足

在執行任務前,務必確認所有工具都已準備就緒。

# 環境驗證函式
validate_environment() {
  local required_tools=("docker" "trivy" "dependency-check" "bandit")
  for tool in "${required_tools[@]}"; do
    if ! command -v "$tool" &> /dev/null; then
      log "ERROR" "缺少必要的工具: $tool"
      return 1
    fi
  done

  if [[ ! -d "$REPORT_DIR" ]]; then
    log "ERROR" "找不到報告目錄: $REPORT_DIR"
    return 1
  fi
}

validate_target() {
  if [[ ! -d "$SCAN_DIR" ]]; then
    log "ERROR" "無效的目標目錄: $SCAN_DIR"
    return 1
  fi
  if [[ ! -r "$SCAN_DIR" ]]; then
    log "ERROR" "無法讀取目標目錄: $SCAN_DIR"
    return 1
  fi
}

validate_environment 函式檢查必要的安全工具是否已安裝,例如 Docker、Trivy、Dependency-check 和 Bandit。validate_target 函式則驗證目標目錄是否存在與可讀取。這些驗證步驟確保指令碼在正確的環境下執行,避免因工具缺失或許可權問題導致的錯誤。

掃描與報告:精準打擊,完整記錄

掃描任務如同戰場上的偵察,精準找出潛在威脅。報告則如同戰報,記錄戰果,提供決策依據。

main() {
  local exit_code=0
  setup_logging
  log "INFO" "開始掃描 $SCAN_DIR"
  validate_environment || exit 1
  validate_target || exit 1

  mkdir -p "${REPORT_DIR}/${REPORT_NAME}"

  perform_sast_scan || exit_code=$((exit_code + 1))
  perform_dependency_scan || exit_code=$((exit_code + 1))
  perform_container_scan || exit_code=$((exit_code + 1))

  generate_summary

  log "INFO" "掃描完成,錯誤碼: $exit_code"
  return $exit_code
}

#  以下為示意函式,實際應用中需根據需求實作
perform_sast_scan() {
  log "INFO" "執行 SAST 掃描..."
  return 0 
}

perform_dependency_scan() {
  log "INFO" "執行依賴項掃描..."
  return 0
}

perform_container_scan() {
  log "INFO" "執行容器掃描..."
  return 0
}

generate_summary() {
    log "INFO" "產生報告摘要..."
}

main "$@"

main 函式是整個指令碼的指揮中心,它協調各個步驟的執行,包含設定日誌、驗證環境、建立報告目錄、執行掃描和產生報告摘要。perform_sast_scanperform_dependency_scanperform_container_scan 函式分別執行不同型別的掃描。generate_summary 函式則產生報告摘要。透過 exit_code 變數,可以追蹤每個步驟的執行結果,方便快速診斷問題。

  graph LR
    B[Node B]
    C[Node C]
    D{Verify Target}
    E[End]
    F[Create Report Directory]
    G[Node G]
    H{Execute SAST Scan}
    I{Execute Dependency Scan}
    J{Generate Report Summary}
    K[End]
    A[Main Function] --> B{Set Log}
    B --> C{Verify Environment}
    C -- Success --> D
    C -- Failure --> E
    D -- Success --> F
    D -- Failure --> E
    F --> G{Execute SAST Scan}
    G --> H{Execute Dependency Scan}
    H --> I{Execute Container Scan}
    I --> J{Generate Report Summary}
    J --> K[End]
  flowchart LR
    A["日誌函式(log)"] --> B["輸出至終端機"]
    A --> C["寫入日誌檔案"]

在滲透測試專案中,建置一個乾淨、隔離與符合專案需求的測試環境至關重要。我經常使用 Kali Linux 作為我的主要測試平台,但每次都從頭設定環境相當耗時。因此,我開發了一套自動化流程,利用 Bash 指令碼和 Live-Build 精準開發客製化的 Kali Linux 映像檔,大幅提升了我的工作效率。

CI/CD 整合與執行

這個自動化建置指令碼可以輕鬆整合到 GitLab CI/CD 管道中,實作自動化建置和佈署。

security_scan:
  stage: test
  script:
    - /path/to/kali-build.sh
  artifacts:
    paths:
      - images/
  • security_scan:定義 CI/CD 作業的名稱。
  • stage: test:指定此作業在測試階段執行。
  • script:執行 kali-build.sh 建置指令碼,/path/to/ 需要替換為實際的指令碼路徑。
  • artifacts: paths:指定儲存建置完成的映像檔的路徑,方便後續下載和佈署。

CI/CD 流程圖表

  graph LR
    B[B]
    D[D]
    A[程式碼提交] --> B{觸發 CI/CD 管道};
    B --> C[執行 Kali 建置];
    C --> D{產生映像檔};
    D --> E[發布映像檔];

此流程圖展示了程式碼提交後,觸發 CI/CD 管道,執行 Kali Linux 映像檔建置、產生映像檔,最後發布映像檔的過程。

使用 Bash 整合即時安全監控

安全監控在 DevSecOps 中扮演關鍵角色。以下是一個 Bash 指令碼 monitor.sh 的框架,用於監控系統日誌並傳送警示:

#!/usr/bin/env bash

THRESHOLD=5
CHECK_INTERVAL=300
ALERT_EMAIL="your_email@example.com"
LOG_FILE="/var/log/auth.log"

while true; do
  # 監控邏輯 (待補充)
  sleep $CHECK_INTERVAL
done
  • THRESHOLDCHECK_INTERVALALERT_EMAILLOG_FILE:設定監控閾值、檢查間隔、警示信箱和日誌檔案路徑。請根據實際環境修改這些變數。
  • while true 迴圈:持續監控日誌檔案。
  • sleep $CHECK_INTERVAL:設定檢查間隔。

利用 Live-Build 精準開發 Kali Linux 測試環境

我使用 Live-Build 建置客製化的 Kali Linux 映像檔。以下是一個修改過的 build.sh 範例:

#!/usr/bin/env bash

DESKTOP="gnome"
ARCH="amd64"
VERSION="custom-1.0"
BUILD_TYPE="installer"

# 設定使用者和密碼
mkdir -p kali-config/common/includes.chroot/etc/live/config
echo 'LIVE_USER_DEFAULT_GROUPS="..."' > kali-config/common/includes.chroot/etc/live/config/user-setup
echo 'LIVE_USER_PASSWORD=your_password' >> kali-config/common/includes.chroot/etc/live/config/user-setup

# 客製化套件清單
# 編輯 kali-config/variant-${DESKTOP}/package-lists/kali.list.chroot

./build.sh --verbose --variant ${DESKTOP} --arch ${ARCH} --version ${VERSION} --${BUILD_TYPE}
  • 設定桌面環境、架構、版本和建置型別。
  • 設定預設使用者和密碼。
  • 可以透過編輯 kali.list.chroot 檔案來自定義要安裝的套件。
  • 執行 build.sh 開始建置。

使用 QEMU 測試映像檔

qemu-system-x86_64 -enable-kvm -m 4G \
  -drive if=virtio,format=qcow2,file=/tmp/kali.img \
  -cdrom images/kali-custom-image.iso -boot once=d

使用 QEMU 啟動虛擬機器測試生成的映像檔。-m 4G 設定虛擬機器的記憶體為 4GB。

建置流程圖表

  graph LR
    B[B]
    D[D]
    F[F]
    A[準備建置環境] --> B{設定建置引數};
    B --> C[客製化套件];
    C --> D{執行建置指令碼};
    D -- 成功 --> E[生成映像檔];
    E --> F{QEMU 測試};
    D -- 失敗 --> G[除錯];

圖表說明: 此流程圖展示了 Kali Linux 映像檔的建置流程,包含準備、設定、客製化、建置、測試和除錯等步驟。

KaliBuilder 類別圖

  classDiagram
class KaliBuilder {
  -desktop: string
  -arch: string
  -version: string
  -buildType: string
  -packages: string[]
  +KaliBuilder(desktop, arch, version, buildType, packages)
  +build()
  +customizePackages(packages)
}

圖表說明: 此類別圖展示了一個 KaliBuilder 類別的設計概念,包含屬性和方法。

透過 Bash 指令碼和 Live-Build,我可以快速建立客製化的 Kali Linux 測試環境,提升滲透測試效率,並確保環境的乾淨和隔離性。更重要的是,我可以精確控制安裝的軟體套件,開發最精簡、高效的測試平台。