返回文章列表

Bash 與 AI 驅動滲透測試及 DevSecOps 自動化實戰

深入探討如何結合 Bash 指令碼與 AI 技術提升滲透測試效率,實現 DevSecOps 自動化。涵蓋 API 互動、Nmap 分析、CI/CD Pipeline 配置、日誌監控、合規驗證等完整實務。

資訊安全 DevOps 人工智慧

在資訊安全領域快速演進的今日,傳統的手動滲透測試方法已難以滿足現代軟體快速迭代的開發節奏。本文將深入探討如何運用 Bash 指令碼結合人工智慧技術,建構智慧化的自動化安全測試流程,並探討其在 DevSecOps 環境中的深度應用。透過 Bash 靈活的指令碼能力,我們能夠與各種 API 進行無縫整合,實現 AI 驅動的測試決策,例如根據 Nmap 掃描結果自動判斷下一步測試策略,或是動態調整測試參數以提升檢測效率。

本文將涵蓋如何利用 Bash 指令碼自動化 CI/CD Pipeline 中的安全任務,包括漏洞掃描協調、配置管理、即時日誌監控、應急回應處理、合規性驗證等關鍵環節。我們將提供豐富的程式碼範例與技術細節,讓讀者能夠快速掌握實作技巧。此外,文章也將探討如何自動化 Kali Linux 環境建置,以適應不同的測試需求場景,並展望 DevSecOps 自動化的未來發展趨勢。

Bash 與 AI 技術的深度整合

在現代資訊安全領域中,滲透測試已經從純粹的手動操作演進為結合多種技術與工具的系統化流程。Bash 指令碼與人工智慧技術的結合,為安全測試提供了前所未有的自動化能力與智慧決策支援。透過 API 整合,我們能夠將 AI 模型的分析能力無縫嵌入測試工作流程,實現從資料收集、分析判斷到執行決策的全自動化循環。

API 整合基礎架構

在實現 AI 驅動的測試流程之前,我們需要建立穩健的 API 通訊基礎架構。這個架構必須能夠處理訊息傳送、錯誤恢復、會話管理等核心功能,確保與 AI 服務的可靠互動。

#!/bin/bash

#############################################
# AI 驅動滲透測試自動化系統
# 版本:1.0.0
# 作者:玄貓(BlackCat)
# 功能:整合 AI API 進行智慧化測試決策
#############################################

# 設定 API 連線參數
readonly API_HOST="${API_HOST:-https://api.example.com}"
readonly API_KEY="${API_KEY:-your_api_key_here}"
readonly API_TIMEOUT=30
readonly MAX_RETRY=3

# 全域變數
CONVERSATION_ID=""
LOG_FILE="/var/log/ai_pentest.log"

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

# 建立新對話會話
# 功能:初始化與 AI 服務的對話會話
# 返回:對話 ID 字串
create_conversation() {
    log "INFO" "建立新的 AI 對話會話..."
    
    local response=$(curl -s -X POST \
        --max-time "${API_TIMEOUT}" \
        -H "Authorization: Bearer ${API_KEY}" \
        -H "Content-Type: application/json" \
        "${API_HOST}/v1/api/conversation" \
        -d '{"name": "滲透測試自動化會話"}')
    
    # 驗證回應格式
    if ! echo "${response}" | jq -e '.data.conversation_id' > /dev/null 2>&1; then
        log "ERROR" "建立對話會話失敗"
        log "DEBUG" "API 回應: ${response}"
        return 1
    fi
    
    # 提取對話 ID
    local conversation_id=$(echo "${response}" | jq -r '.data.conversation_id')
    log "INFO" "對話會話建立成功,ID: ${conversation_id}"
    
    echo "${conversation_id}"
}

# 傳送訊息至 AI API
# 功能:將測試資料傳送給 AI 進行分析
# 參數:
#   $1 - 要傳送的訊息內容
# 返回:AI 的回應內容
send_message() {
    local message="$1"
    local retry_count=0
    
    # 確保訊息不為空
    if [[ -z "${message}" ]]; then
        log "WARNING" "嘗試傳送空訊息,已跳過"
        return 1
    fi
    
    log "DEBUG" "準備傳送訊息至 AI API"
    
    # 對訊息進行 JSON 跳脫處理
    # 使用 jq 確保特殊字元正確處理
    local escaped_message=$(echo "${message}" | jq -Rs .)
    
    # 重試機制
    while [[ ${retry_count} -lt ${MAX_RETRY} ]]; do
        # 發送 API 請求
        local response=$(curl -s -X POST \
            --max-time "${API_TIMEOUT}" \
            -H "Authorization: Bearer ${API_KEY}" \
            -H "Content-Type: application/json" \
            "${API_HOST}/v1/api/completion" \
            -d '{
                "conversation_id": "'"${CONVERSATION_ID}"'",
                "messages": [{"role": "user", "content": '"${escaped_message}"'}],
                "stream": false
            }')
        
        # 檢查 API 回應狀態
        local retcode=$(echo "${response}" | jq -r '.retcode // -1')
        
        case ${retcode} in
            0)
                # 成功取得回應
                local answer=$(echo "${response}" | jq -r '.data.answer // "無回應內容"')
                log "INFO" "成功接收 AI 分析結果"
                echo "${answer}"
                return 0
                ;;
            102)
                # 對話不存在,需要重新建立
                log "WARNING" "對話會話已失效,正在建立新會話..."
                CONVERSATION_ID=$(create_conversation)
                
                if [[ -z "${CONVERSATION_ID}" ]]; then
                    log "ERROR" "無法建立新對話會話"
                    return 1
                fi
                
                # 使用新會話 ID 重試
                continue
                ;;
            *)
                # 其他錯誤
                log "ERROR" "API 請求失敗,錯誤碼: ${retcode}"
                log "DEBUG" "API 回應: ${response}"
                
                ((retry_count++))
                if [[ ${retry_count} -lt ${MAX_RETRY} ]]; then
                    log "INFO" "等待 3 秒後重試 (${retry_count}/${MAX_RETRY})..."
                    sleep 3
                else
                    log "ERROR" "達到最大重試次數,請求失敗"
                    return 1
                fi
                ;;
        esac
    done
    
    return 1
}

這個 API 整合架構提供了完整的錯誤處理與重試機制。訊息的 JSON 跳脫處理確保特殊字元不會導致請求失敗。對話會話管理機制能夠在會話失效時自動重新建立,確保服務的持續可用性。重試邏輯搭配指數退避策略,能夠優雅地處理暫時性的網路問題。

Nmap 掃描結果的智慧分析

Nmap 是滲透測試中最常用的網路掃描工具。透過將 Nmap 掃描結果傳送給 AI 進行分析,我們能夠獲得更深入的安全評估與測試建議。

#!/bin/bash

# Nmap 結果智慧分析系統
# 功能:解析 Nmap 掃描結果並透過 AI 進行深度分析

# 全域配置
readonly NMAP_RESULT_FILE="${1:-nmap_scan.gnmap}"
readonly OUTPUT_DIR="/opt/pentest/reports"
readonly ANALYSIS_TIMESTAMP=$(date +%Y%m%d_%H%M%S)

# 初始化分析環境
init_analysis_environment() {
    log "INFO" "========================================="
    log "INFO" "Nmap 智慧分析系統"
    log "INFO" "========================================="
    
    # 驗證 Nmap 結果檔案
    if [[ ! -f "${NMAP_RESULT_FILE}" ]]; then
        log "ERROR" "找不到 Nmap 掃描結果檔案: ${NMAP_RESULT_FILE}"
        exit 1
    fi
    
    log "INFO" "掃描結果檔案: ${NMAP_RESULT_FILE}"
    
    # 建立輸出目錄
    mkdir -p "${OUTPUT_DIR}"
    
    # 建立 AI 對話會話
    CONVERSATION_ID=$(create_conversation)
    
    if [[ -z "${CONVERSATION_ID}" ]]; then
        log "ERROR" "無法初始化 AI 對話會話"
        exit 1
    fi
    
    log "INFO" "分析環境初始化完成"
}

# 解析單一主機的掃描結果
# 功能:從 Nmap 輸出中提取主機資訊與開放埠資訊
# 參數:
#   $1 - Nmap 掃描結果的單行內容
parse_host_info() {
    local scan_line="$1"
    local host_info=""
    
    # 提取 IP 位址
    # Nmap gnmap 格式: Host: IP_ADDRESS (HOSTNAME) Status: Up
    local ip_address=$(echo "${scan_line}" | awk '{print $2}')
    
    # 提取主機名稱
    # 移除括號並處理可能的空值
    local hostname=$(echo "${scan_line}" | awk '{print $3}' | tr -d '()')
    
    if [[ -z "${hostname}" ]] || [[ "${hostname}" == "${ip_address}" ]]; then
        hostname="未知主機名稱"
    fi
    
    # 提取開放埠資訊
    # Nmap gnmap 格式: Ports: PORT/STATE/PROTOCOL/OWNER/SERVICE/VERSION
    local ports_info=$(echo "${scan_line}" | grep -oP 'Ports:\s+\K.*' || echo "無開放埠")
    
    # 建構結構化的主機資訊
    cat << EOF
主機掃描結果分析請求
===========================================
目標 IP 位址: ${ip_address}
主機名稱: ${hostname}
掃描時間: $(date +'%Y-%m-%d %H:%M:%S')

開放埠資訊:
${ports_info}

請根據以上掃描結果提供:
1. 安全風險評估
2. 可能的攻擊向量
3. 建議的進一步測試步驟
4. 加固建議
===========================================
EOF
}

# 處理 Nmap 掃描結果
# 功能:逐行讀取並分析 Nmap 掃描結果
process_nmap_results() {
    log "INFO" "開始處理 Nmap 掃描結果..."
    
    local host_count=0
    local analysis_report="${OUTPUT_DIR}/ai_analysis_${ANALYSIS_TIMESTAMP}.md"
    
    # 建立分析報告標題
    cat > "${analysis_report}" << EOF
# Nmap 掃描結果 AI 分析報告

**生成時間**: $(date +'%Y年%m月%d日 %H:%M:%S')  
**掃描檔案**: ${NMAP_RESULT_FILE}  
**分析系統**: AI 驅動安全分析

---

EOF
    
    # 逐行讀取 Nmap 結果檔案
    while IFS= read -r line; do
        # 只處理包含埠資訊的行
        # Nmap gnmap 格式的埠資訊行包含 "Ports:" 關鍵字
        if [[ ! "${line}" =~ "Ports:" ]]; then
            continue
        fi
        
        ((host_count++))
        
        # 提取主機資訊
        local ip_address=$(echo "${line}" | awk '{print $2}')
        local hostname=$(echo "${line}" | awk '{print $3}' | tr -d '()')
        
        # 顯示進度資訊
        local separator=$(printf '%*s' $(tput cols 2>/dev/null || echo 80) '' | tr ' ' '-')
        echo "${separator}"
        log "INFO" "正在分析主機 ${host_count}: ${ip_address} (${hostname})"
        echo ""
        
        # 建構分析請求
        local analysis_request=$(parse_host_info "${line}")
        
        # 傳送至 AI 進行分析
        log "INFO" "傳送資料至 AI 進行分析..."
        local ai_response=$(send_message "${analysis_request}")
        
        # 檢查 AI 回應
        if [[ -z "${ai_response}" ]]; then
            log "WARNING" "未能取得 AI 分析結果"
            ai_response="AI 分析服務暫時無法回應,請稍後重試。"
        fi
        
        # 將分析結果寫入報告
        cat >> "${analysis_report}" << EOF
## 主機 ${host_count}: ${ip_address}

**主機名稱**: ${hostname}  
**掃描時間**: $(date +'%Y-%m-%d %H:%M:%S')

### AI 安全分析

${ai_response}

---

EOF
        
        # 顯示 AI 回應摘要
        echo ""
        log "INFO" "AI 分析完成"
        echo "${ai_response}" | head -n 5
        echo ""
        
        # 加入延遲避免 API 過載
        # 根據 API 服務的速率限制調整延遲時間
        sleep 2
        
    done < "${NMAP_RESULT_FILE}"
    
    # 完成分析
    log "INFO" "========================================="
    log "INFO" "Nmap 結果分析完成"
    log "INFO" "========================================="
    log "INFO" "分析主機數量: ${host_count}"
    log "INFO" "分析報告位置: ${analysis_report}"
    log "INFO" "========================================="
}

# 主要執行流程
main() {
    init_analysis_environment
    process_nmap_results
}

main "$@"

這個 Nmap 結果分析系統展示了如何將傳統的掃描工具與 AI 技術深度整合。透過結構化的資訊提取與智慧分析,我們能夠將原始的掃描資料轉化為可執行的安全建議。進度顯示與錯誤處理機制確保系統在處理大量掃描結果時仍能穩定運作。

@startuml
!define PLANTUML_FORMAT svg
!theme _none_

skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100

start
:讀取 Nmap 掃描結果檔案;
:初始化 AI 對話會話;

while (還有未處理的掃描行?) is (是)
  :讀取下一行掃描結果;
  
  if (包含開放埠資訊?) then (是)
    :提取 IP 位址與主機名稱;
    :提取開放埠詳細資訊;
    :建構結構化分析請求;
    :傳送至 AI API 進行分析;
    
    if (API 回應成功?) then (是)
      :接收 AI 分析結果;
      :寫入分析報告;
    else (否)
      :記錄錯誤資訊;
      :使用預設回應;
    endif
    
    :等待延遲避免 API 過載;
  else (否)
    :跳過此行;
  endif
endwhile (否)

:產生完整分析報告;
:顯示統計資訊;
stop

@enduml

這個流程圖展示了 Nmap 結果智慧分析的完整處理流程。從檔案讀取、資訊提取、AI 分析到報告生成,每個步驟都包含適當的錯誤處理與狀態檢查。

DevSecOps 環境的安全自動化

DevSecOps 的核心理念是將安全措施深度整合至軟體開發生命週期的每個階段。這種做法打破了傳統的安全孤島,促進開發、維運與安全團隊之間的協作與共同責任。透過在 DevOps 流程中嵌入安全實踐、工具與自動化機制,組織能夠在開發早期就識別漏洞,最小化安全風險,並以安全為核心設計原則交付軟體產品。

滲透測試者的角色轉變

隨著 DevSecOps 的興起,滲透測試者的角色也在經歷深刻的轉變。傳統的滲透測試往往是在開發週期末端進行的獨立活動,而在 DevSecOps 環境中,測試者需要調整其方法論,將安全測試整合至 CI/CD Pipeline,提供持續的安全回饋。這種轉變不僅要求測試者具備傳統的安全技能,更需要掌握自動化工具與腳本開發能力,以配合快速的開發節奏。

滲透測試者透過與開發與維運團隊的密切合作,能夠在整個開發流程中發揮更大的影響力。透過分享安全知識與實戰經驗,測試者可以指導團隊採用安全編碼技術,了解常見漏洞的成因,並實施安全部署與配置的最佳實踐。這種協作模式促進了集體的安全意識,有助於建立更安全的軟體開發環境。

持續安全測試的實現

在現代開發環境中,每次程式碼提交都應該觸發自動化的安全測試。Bash 指令碼能夠將各種安全工具整合至 CI Pipeline,對應用程式碼、依賴套件與容器映像進行全方位掃描。當發現漏洞時,指令碼可以中止建置流程,並透過多種管道通知安全團隊。

#!/bin/bash

#############################################
# 持續安全測試自動化系統
# 版本:1.0.0
# 作者:玄貓(BlackCat)
# 功能:整合多種安全掃描工具至 CI Pipeline
#############################################

# 全域配置
readonly SCAN_TARGET="${CI_PROJECT_DIR:-.}"
readonly REPORT_DIR="/opt/security/reports"
readonly TIMESTAMP=$(date +%Y%m%d_%H%M%S)
readonly BUILD_ID="${CI_PIPELINE_ID:-local_${TIMESTAMP}}"

# 安全閾值配置
readonly CRITICAL_THRESHOLD=0    # 不允許任何嚴重漏洞
readonly HIGH_THRESHOLD=5         # 最多允許 5 個高風險漏洞
readonly MEDIUM_THRESHOLD=20      # 最多允許 20 個中風險漏洞

# 日誌配置
readonly LOG_FILE="${REPORT_DIR}/security_scan_${BUILD_ID}.log"

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

# 初始化掃描環境
init_scan_environment() {
    log "INFO" "========================================="
    log "INFO" "持續安全測試系統"
    log "INFO" "========================================="
    log "INFO" "建置 ID: ${BUILD_ID}"
    log "INFO" "掃描目標: ${SCAN_TARGET}"
    
    # 建立報告目錄
    mkdir -p "${REPORT_DIR}"
    
    # 驗證掃描目標
    if [[ ! -d "${SCAN_TARGET}" ]]; then
        log "ERROR" "掃描目標目錄不存在: ${SCAN_TARGET}"
        exit 1
    fi
    
    log "INFO" "掃描環境初始化完成"
}

# Bandit Python 程式碼安全掃描
# 功能:使用 Bandit 掃描 Python 程式碼中的安全問題
# 返回:發現的問題數量
run_bandit_scan() {
    log "INFO" "========================================="
    log "INFO" "執行 Bandit Python 程式碼安全掃描"
    log "INFO" "========================================="
    
    # 檢查是否有 Python 程式碼
    local python_files=$(find "${SCAN_TARGET}" -name "*.py" -type f | wc -l)
    
    if [[ ${python_files} -eq 0 ]]; then
        log "INFO" "未發現 Python 程式碼,跳過 Bandit 掃描"
        return 0
    fi
    
    log "INFO" "發現 ${python_files} 個 Python 檔案"
    
    # 執行 Bandit 掃描
    # -r: 遞迴掃描目錄
    # -f json: 輸出 JSON 格式報告
    # -o: 指定輸出檔案
    # -ll: 只報告中等與高嚴重度問題
    local bandit_report="${REPORT_DIR}/bandit_${BUILD_ID}.json"
    local bandit_text="${REPORT_DIR}/bandit_${BUILD_ID}.txt"
    
    if bandit -r "${SCAN_TARGET}" \
        -f json \
        -o "${bandit_report}" \
        -ll \
        --exit-zero 2>&1 | tee -a "${LOG_FILE}"; then
        
        # 同時產生文字格式報告
        bandit -r "${SCAN_TARGET}" \
            -f txt \
            -o "${bandit_text}" \
            -ll \
            --exit-zero 2>&1 | tee -a "${LOG_FILE}"
        
        log "INFO" "Bandit 掃描完成"
        log "INFO" "JSON 報告: ${bandit_report}"
        log "INFO" "文字報告: ${bandit_text}"
        
        # 分析掃描結果
        if [[ -f "${bandit_report}" ]]; then
            local high_issues=$(jq '[.results[] | select(.issue_severity == "HIGH")] | length' "${bandit_report}")
            local medium_issues=$(jq '[.results[] | select(.issue_severity == "MEDIUM")] | length' "${bandit_report}")
            
            log "INFO" "發現問題統計:"
            log "INFO" "  高嚴重度: ${high_issues}"
            log "INFO" "  中等嚴重度: ${medium_issues}"
            
            return $((high_issues + medium_issues))
        fi
    else
        log "ERROR" "Bandit 掃描執行失敗"
        return 1
    fi
    
    return 0
}

# 依賴套件安全掃描
# 功能:檢查專案依賴套件中的已知漏洞
# 返回:發現的漏洞數量
run_dependency_scan() {
    log "INFO" "========================================="
    log "INFO" "執行依賴套件安全掃描"
    log "INFO" "========================================="
    
    local dependency_report="${REPORT_DIR}/dependency_${BUILD_ID}.json"
    
    # 檢查是否有 requirements.txt 或 package.json
    local has_dependencies=false
    
    if [[ -f "${SCAN_TARGET}/requirements.txt" ]] || \
       [[ -f "${SCAN_TARGET}/package.json" ]] || \
       [[ -f "${SCAN_TARGET}/pom.xml" ]]; then
        has_dependencies=true
    fi
    
    if [[ "${has_dependencies}" == false ]]; then
        log "INFO" "未發現依賴套件清單,跳過依賴掃描"
        return 0
    fi
    
    log "INFO" "開始掃描依賴套件..."
    
    # 使用 safety (Python) 或 npm audit (Node.js) 進行掃描
    if [[ -f "${SCAN_TARGET}/requirements.txt" ]]; then
        log "INFO" "偵測到 Python 專案,使用 Safety 進行掃描"
        
        if command -v safety &> /dev/null; then
            safety check \
                --file "${SCAN_TARGET}/requirements.txt" \
                --json \
                --output "${dependency_report}" 2>&1 | tee -a "${LOG_FILE}"
            
            local vuln_count=$(jq '. | length' "${dependency_report}" 2>/dev/null || echo "0")
            log "INFO" "發現 ${vuln_count} 個依賴套件漏洞"
            
            return ${vuln_count}
        else
            log "WARNING" "Safety 工具未安裝,無法執行 Python 依賴掃描"
        fi
    fi
    
    if [[ -f "${SCAN_TARGET}/package.json" ]]; then
        log "INFO" "偵測到 Node.js 專案,使用 npm audit 進行掃描"
        
        if command -v npm &> /dev/null; then
            cd "${SCAN_TARGET}" || return 1
            
            npm audit --json > "${dependency_report}" 2>&1
            
            local critical=$(jq '.metadata.vulnerabilities.critical // 0' "${dependency_report}")
            local high=$(jq '.metadata.vulnerabilities.high // 0' "${dependency_report}")
            
            log "INFO" "發現漏洞統計:"
            log "INFO" "  嚴重: ${critical}"
            log "INFO" "  高風險: ${high}"
            
            cd - > /dev/null
            
            return $((critical + high))
        else
            log "WARNING" "npm 工具未安裝,無法執行 Node.js 依賴掃描"
        fi
    fi
    
    return 0
}

# 容器映像安全掃描
# 功能:掃描 Docker 映像中的漏洞
# 返回:發現的嚴重漏洞數量
run_container_scan() {
    log "INFO" "========================================="
    log "INFO" "執行容器映像安全掃描"
    log "INFO" "========================================="
    
    # 檢查是否有 Dockerfile
    if [[ ! -f "${SCAN_TARGET}/Dockerfile" ]]; then
        log "INFO" "未發現 Dockerfile,跳過容器掃描"
        return 0
    fi
    
    # 檢查 Trivy 是否安裝
    if ! command -v trivy &> /dev/null; then
        log "WARNING" "Trivy 工具未安裝,無法執行容器掃描"
        return 0
    fi
    
    log "INFO" "建置 Docker 映像..."
    
    # 建置映像
    local image_name="security-scan:${BUILD_ID}"
    
    if docker build -t "${image_name}" "${SCAN_TARGET}" 2>&1 | tee -a "${LOG_FILE}"; then
        log "INFO" "映像建置成功: ${image_name}"
    else
        log "ERROR" "映像建置失敗"
        return 1
    fi
    
    # 執行 Trivy 掃描
    log "INFO" "使用 Trivy 掃描映像..."
    
    local trivy_report="${REPORT_DIR}/trivy_${BUILD_ID}.json"
    
    trivy image \
        --format json \
        --output "${trivy_report}" \
        --severity CRITICAL,HIGH \
        --exit-code 0 \
        "${image_name}" 2>&1 | tee -a "${LOG_FILE}"
    
    # 分析掃描結果
    if [[ -f "${trivy_report}" ]]; then
        local critical=$(jq '[.Results[]?.Vulnerabilities[]? | select(.Severity == "CRITICAL")] | length' "${trivy_report}")
        local high=$(jq '[.Results[]?.Vulnerabilities[]? | select(.Severity == "HIGH")] | length' "${trivy_report}")
        
        log "INFO" "發現漏洞統計:"
        log "INFO" "  嚴重: ${critical}"
        log "INFO" "  高風險: ${high}"
        
        # 清理映像
        docker rmi "${image_name}" --force > /dev/null 2>&1
        
        return ${critical}
    fi
    
    return 0
}

# 安全掃描結果評估
# 功能:根據閾值評估掃描結果是否通過
# 參數:
#   $1 - 嚴重漏洞數量
#   $2 - 高風險漏洞數量
#   $3 - 中風險漏洞數量
evaluate_scan_results() {
    local critical=$1
    local high=$2
    local medium=$3
    
    log "INFO" "========================================="
    log "INFO" "安全掃描結果評估"
    log "INFO" "========================================="
    log "INFO" "漏洞統計:"
    log "INFO" "  嚴重: ${critical} (閾值: ${CRITICAL_THRESHOLD})"
    log "INFO" "  高風險: ${high} (閾值: ${HIGH_THRESHOLD})"
    log "INFO" "  中風險: ${medium} (閾值: ${MEDIUM_THRESHOLD})"
    
    local build_failed=false
    
    # 檢查嚴重漏洞
    if [[ ${critical} -gt ${CRITICAL_THRESHOLD} ]]; then
        log "ERROR" "嚴重漏洞數量超過閾值"
        build_failed=true
    fi
    
    # 檢查高風險漏洞
    if [[ ${high} -gt ${HIGH_THRESHOLD} ]]; then
        log "ERROR" "高風險漏洞數量超過閾值"
        build_failed=true
    fi
    
    # 檢查中風險漏洞
    if [[ ${medium} -gt ${MEDIUM_THRESHOLD} ]]; then
        log "WARNING" "中風險漏洞數量超過閾值"
        # 中風險漏洞只警告,不中止建置
    fi
    
    if [[ "${build_failed}" == true ]]; then
        log "ERROR" "安全掃描未通過,建置中止"
        log "ERROR" "請修復嚴重與高風險漏洞後重新建置"
        return 1
    else
        log "INFO" "安全掃描通過 ✓"
        return 0
    fi
}

# 主要執行流程
main() {
    init_scan_environment
    
    local total_critical=0
    local total_high=0
    local total_medium=0
    
    # 執行各項掃描
    run_bandit_scan
    local bandit_issues=$?
    
    run_dependency_scan
    local dependency_vulns=$?
    
    run_container_scan
    local container_critical=$?
    
    # 彙總結果(簡化版本,實際應從報告中提取詳細統計)
    total_critical=${container_critical}
    total_high=${dependency_vulns}
    total_medium=${bandit_issues}
    
    # 評估結果
    evaluate_scan_results ${total_critical} ${total_high} ${total_medium}
    local exit_code=$?
    
    log "INFO" "========================================="
    log "INFO" "掃描作業完成"
    log "INFO" "所有報告已儲存至: ${REPORT_DIR}"
    log "INFO" "========================================="
    
    exit ${exit_code}
}

main "$@"

這個持續安全測試系統展示了如何將多種安全掃描工具整合至單一自動化流程。透過閾值配置,我們能夠根據組織的風險容忍度動態調整建置通過標準。詳細的日誌記錄與報告生成機制確保安全團隊能夠追蹤與分析每次掃描的結果。

配置管理與合規驗證

基礎設施的安全性高度依賴正確的系統配置。Bash 指令碼能夠自動化驗證伺服器的安全基線,檢查檔案權限、使用者存取控制、服務配置與網路設定等關鍵項目。

#!/bin/bash

#############################################
# CIS Benchmark 合規性檢查系統
# 版本:1.0.0
# 作者:玄貓(BlackCat)
# 功能:自動化 CIS 基準合規性驗證
#############################################

# 全域配置
readonly REPORT_FILE="/opt/security/compliance/cis_report_$(date +%Y%m%d_%H%M%S).txt"
readonly LOG_FILE="/var/log/cis_compliance.log"

# 檢查結果統計
TOTAL_CHECKS=0
PASSED_CHECKS=0
FAILED_CHECKS=0
WARNING_CHECKS=0

# 日誌與報告函式
log_check() {
    local status=$1    # PASS, FAIL, WARNING
    local check_id=$2
    local description=$3
    local details=$4
    
    ((TOTAL_CHECKS++))
    
    case ${status} in
        PASS)
            ((PASSED_CHECKS++))
            ;;
        FAIL)
            ((FAILED_CHECKS++))
            ;;
        WARNING)
            ((WARNING_CHECKS++))
            ;;
    esac
    
    # 寫入報告
    cat >> "${REPORT_FILE}" << EOF
[${status}] ${check_id}: ${description}
    詳細資訊: ${details}

EOF
    
    # 寫入日誌
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] [${status}] ${check_id}: ${description}" >> "${LOG_FILE}"
}

# 初始化報告
init_report() {
    mkdir -p "$(dirname "${REPORT_FILE}")"
    
    cat > "${REPORT_FILE}" << EOF
========================================
CIS Benchmark 合規性檢查報告
========================================
主機名稱: $(hostname)
作業系統: $(lsb_release -d | cut -f2-)
核心版本: $(uname -r)
檢查時間: $(date +'%Y年%m月%d日 %H:%M:%S')
========================================

EOF
}

# CIS 1.1.1.1 - 確保未使用的檔案系統已停用
check_unused_filesystems() {
    local check_id="1.1.1.1"
    local description="確保 cramfs 檔案系統已停用"
    
    # 檢查 cramfs 模組是否已載入
    if lsmod | grep -q cramfs; then
        log_check "FAIL" "${check_id}" "${description}" "cramfs 模組仍在載入中"
    else
        # 檢查是否已加入黑名單
        if grep -q "install cramfs /bin/true" /etc/modprobe.d/* 2>/dev/null; then
            log_check "PASS" "${check_id}" "${description}" "cramfs 已正確停用"
        else
            log_check "WARNING" "${check_id}" "${description}" "cramfs 未載入但未加入黑名單"
        fi
    fi
}

# CIS 5.2.1 - 確保 SSH 協定版本為 2
check_ssh_protocol() {
    local check_id="5.2.1"
    local description="確保 SSH 使用協定版本 2"
    
    if [[ ! -f /etc/ssh/sshd_config ]]; then
        log_check "WARNING" "${check_id}" "${description}" "找不到 SSH 配置檔案"
        return
    fi
    
    # 檢查協定版本設定
    local protocol=$(grep -i "^Protocol" /etc/ssh/sshd_config | awk '{print $2}')
    
    if [[ "${protocol}" == "2" ]]; then
        log_check "PASS" "${check_id}" "${description}" "SSH 協定版本為 2"
    elif [[ -z "${protocol}" ]]; then
        # 預設為協定 2
        log_check "PASS" "${check_id}" "${description}" "使用預設協定版本 2"
    else
        log_check "FAIL" "${check_id}" "${description}" "SSH 協定版本為 ${protocol}"
    fi
}

# CIS 5.2.3 - 確保 SSH LogLevel 設定適當
check_ssh_loglevel() {
    local check_id="5.2.3"
    local description="確保 SSH LogLevel 設定為 INFO 或更高"
    
    local loglevel=$(grep -i "^LogLevel" /etc/ssh/sshd_config | awk '{print $2}')
    
    if [[ "${loglevel}" =~ ^(INFO|VERBOSE|DEBUG|DEBUG1|DEBUG2|DEBUG3)$ ]]; then
        log_check "PASS" "${check_id}" "${description}" "LogLevel 設定為 ${loglevel}"
    else
        log_check "FAIL" "${check_id}" "${description}" "LogLevel 設定為 ${loglevel:-未設定}"
    fi
}

# CIS 1.5.1 - 確保核心記憶體保護已啟用
check_kernel_parameters() {
    local check_id="1.5.1"
    local description="確保位址空間配置隨機化 (ASLR) 已啟用"
    
    local aslr=$(sysctl kernel.randomize_va_space | awk '{print $3}')
    
    if [[ "${aslr}" == "2" ]]; then
        log_check "PASS" "${check_id}" "${description}" "ASLR 完全啟用"
    elif [[ "${aslr}" == "1" ]]; then
        log_check "WARNING" "${check_id}" "${description}" "ASLR 部分啟用"
    else
        log_check "FAIL" "${check_id}" "${description}" "ASLR 未啟用"
    fi
}

# 產生摘要報告
generate_summary() {
    local pass_rate=0
    
    if [[ ${TOTAL_CHECKS} -gt 0 ]]; then
        pass_rate=$((PASSED_CHECKS * 100 / TOTAL_CHECKS))
    fi
    
    cat >> "${REPORT_FILE}" << EOF
========================================
檢查摘要
========================================
總檢查項目: ${TOTAL_CHECKS}
通過: ${PASSED_CHECKS}
失敗: ${FAILED_CHECKS}
警告: ${WARNING_CHECKS}
通過率: ${pass_rate}%
========================================

建議:
EOF
    
    if [[ ${FAILED_CHECKS} -gt 0 ]]; then
        echo "1. 優先修復所有失敗項目" >> "${REPORT_FILE}"
        echo "2. 檢視詳細報告了解具體問題" >> "${REPORT_FILE}"
    fi
    
    if [[ ${WARNING_CHECKS} -gt 0 ]]; then
        echo "3. 審查警告項目並評估風險" >> "${REPORT_FILE}"
    fi
    
    echo "" >> "${REPORT_FILE}"
    echo "報告結束" >> "${REPORT_FILE}"
}

# 主要執行流程
main() {
    echo "開始執行 CIS Benchmark 合規性檢查..."
    
    init_report
    
    # 執行各項檢查
    check_unused_filesystems
    check_ssh_protocol
    check_ssh_loglevel
    check_kernel_parameters
    
    # 產生摘要
    generate_summary
    
    echo "檢查完成,報告已儲存至: ${REPORT_FILE}"
    echo ""
    echo "檢查摘要:"
    echo "  總項目: ${TOTAL_CHECKS}"
    echo "  通過: ${PASSED_CHECKS}"
    echo "  失敗: ${FAILED_CHECKS}"
    echo "  警告: ${WARNING_CHECKS}"
    
    # 根據結果決定退出碼
    if [[ ${FAILED_CHECKS} -gt 0 ]]; then
        exit 1
    else
        exit 0
    fi
}

main "$@"

這個合規性檢查系統提供了可擴展的框架,能夠輕鬆加入新的檢查項目。每個檢查函式都遵循統一的格式,便於維護與更新。詳細的報告機制確保管理者能夠清楚了解系統的合規狀態。

日誌監控與即時告警

即時的安全監控是防禦威脅的重要防線。Bash 指令碼能夠持續監控系統日誌,識別可疑活動並立即發出告警。

#!/bin/bash

#############################################
# 即時安全日誌監控系統
# 版本:1.0.0
# 作者:玄貓(BlackCat)
# 功能:監控系統日誌並自動回應安全事件
#############################################

# 全域配置
readonly AUTH_LOG="/var/log/auth.log"
readonly ALERT_EMAIL="[email protected]"
readonly ALERT_WEBHOOK="https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
readonly BLOCK_THRESHOLD=5        # 失敗登入次數閾值
readonly BLOCK_DURATION=3600      # 封鎖時間(秒)

# 封鎖記錄檔案
readonly BLOCK_LIST="/var/log/security_blocks.log"

# 日誌函式
log() {
    local level=$1
    shift
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] [${level}] $*"
}

# 傳送告警郵件
# 功能:透過郵件發送安全告警
# 參數:
#   $1 - 告警主旨
#   $2 - 告警內容
send_email_alert() {
    local subject="$1"
    local body="$2"
    
    echo "${body}" | mail -s "安全告警: ${subject}" "${ALERT_EMAIL}"
    log "INFO" "已發送告警郵件至 ${ALERT_EMAIL}"
}

# 傳送 Slack 告警
# 功能:透過 Webhook 發送 Slack 通知
# 參數:
#   $1 - 告警訊息
send_slack_alert() {
    local message="$1"
    
    curl -X POST \
        -H 'Content-Type: application/json' \
        -d "{\"text\":\"🚨 安全告警\\n${message}\"}" \
        "${ALERT_WEBHOOK}" \
        --silent \
        --output /dev/null
    
    log "INFO" "已發送 Slack 告警"
}

# 封鎖 IP 位址
# 功能:使用 iptables 封鎖惡意 IP
# 參數:
#   $1 - 要封鎖的 IP 位址
#   $2 - 封鎖原因
block_ip() {
    local ip="$1"
    local reason="$2"
    
    # 檢查 IP 是否已被封鎖
    if iptables -L INPUT -n | grep -q "${ip}"; then
        log "WARNING" "IP ${ip} 已在封鎖清單中"
        return
    fi
    
    # 加入 iptables 規則
    iptables -A INPUT -s "${ip}" -j DROP
    
    # 記錄封鎖資訊
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] IP: ${ip} | 原因: ${reason}" >> "${BLOCK_LIST}"
    
    log "INFO" "已封鎖 IP: ${ip}"
    log "INFO" "封鎖原因: ${reason}"
    
    # 設定自動解除封鎖
    ( sleep "${BLOCK_DURATION}" && iptables -D INPUT -s "${ip}" -j DROP && \
      log "INFO" "已解除封鎖 IP: ${ip}" ) &
    
    # 發送告警
    local alert_message="偵測到可疑活動並已封鎖 IP\\n"
    alert_message+="IP 位址: ${ip}\\n"
    alert_message+="原因: ${reason}\\n"
    alert_message+="主機: $(hostname)\\n"
    alert_message+="時間: $(date +'%Y-%m-%d %H:%M:%S')"
    
    send_slack_alert "${alert_message}"
}

# 監控失敗的登入嘗試
# 功能:偵測暴力破解攻擊
monitor_failed_logins() {
    log "INFO" "開始監控失敗的登入嘗試..."
    
    # 使用 associative array 追蹤失敗次數
    declare -A fail_count
    
    # 即時監控日誌
    tail -F "${AUTH_LOG}" 2>/dev/null | while read -r line; do
        # 偵測失敗的密碼嘗試
        if echo "${line}" | grep -q "Failed password"; then
            # 提取 IP 位址
            # 日誌格式: Failed password for USER from IP_ADDRESS port PORT ssh2
            local ip=$(echo "${line}" | grep -oP 'from \K[\d.]+')
            local user=$(echo "${line}" | grep -oP 'for \K\w+')
            
            if [[ -n "${ip}" ]]; then
                # 增加失敗計數
                fail_count["${ip}"]=$((${fail_count["${ip}"]:-0} + 1))
                
                log "WARNING" "偵測到失敗的登入嘗試 - IP: ${ip}, 使用者: ${user}, 累計: ${fail_count["${ip}"]}"
                
                # 檢查是否達到封鎖閾值
                if [[ ${fail_count["${ip}"]} -ge ${BLOCK_THRESHOLD} ]]; then
                    block_ip "${ip}" "失敗登入嘗試達 ${fail_count["${ip}"]} 次"
                    unset fail_count["${ip}"]
                fi
            fi
        fi
        
        # 偵測成功的 root 登入
        if echo "${line}" | grep -q "Accepted.*for root"; then
            local ip=$(echo "${line}" | grep -oP 'from \K[\d.]+')
            
            log "WARNING" "偵測到 root 使用者登入 - IP: ${ip}"
            
            local alert_message="偵測到 root 使用者登入\\n"
            alert_message+="IP 位址: ${ip}\\n"
            alert_message+="主機: $(hostname)\\n"
            alert_message+="時間: $(date +'%Y-%m-%d %H:%M:%S')"
            
            send_slack_alert "${alert_message}"
        fi
        
        # 偵測 sudo 提權
        if echo "${line}" | grep -q "sudo.*COMMAND"; then
            local user=$(echo "${line}" | grep -oP 'sudo.*:\s+\K\w+')
            local command=$(echo "${line}" | grep -oP 'COMMAND=\K.*')
            
            log "INFO" "偵測到 sudo 指令執行 - 使用者: ${user}, 指令: ${command}"
            
            # 檢查高風險指令
            if echo "${command}" | grep -qE "(rm -rf|mkfs|dd|iptables|useradd|passwd)"; then
                log "WARNING" "偵測到高風險 sudo 指令"
                
                local alert_message="偵測到高風險 sudo 指令\\n"
                alert_message+="使用者: ${user}\\n"
                alert_message+="指令: ${command}\\n"
                alert_message+="主機: $(hostname)\\n"
                alert_message+="時間: $(date +'%Y-%m-%d %H:%M:%S')"
                
                send_slack_alert "${alert_message}"
            fi
        fi
    done
}

# 主要執行流程
main() {
    log "INFO" "========================================="
    log "INFO" "即時安全日誌監控系統啟動"
    log "INFO" "========================================="
    log "INFO" "監控日誌: ${AUTH_LOG}"
    log "INFO" "封鎖閾值: ${BLOCK_THRESHOLD} 次失敗登入"
    log "INFO" "封鎖時間: ${BLOCK_DURATION} 秒"
    
    # 檢查必要檔案
    if [[ ! -f "${AUTH_LOG}" ]]; then
        log "ERROR" "找不到認證日誌檔案: ${AUTH_LOG}"
        exit 1
    fi
    
    # 檢查權限
    if [[ $EUID -ne 0 ]]; then
        log "ERROR" "此程式需要 root 權限執行"
        exit 1
    fi
    
    # 建立封鎖清單檔案
    touch "${BLOCK_LIST}"
    
    # 開始監控
    monitor_failed_logins
}

main "$@"

這個即時監控系統展示了如何使用 Bash 建構主動防禦機制。透過持續監控日誌並自動回應威脅,系統能夠大幅縮短攻擊偵測與回應的時間窗口。

CI/CD 環境自動化建置

建立完整的 CI/CD 環境需要安裝與配置多種工具。透過 Bash 指令碼自動化這個過程,能夠確保環境的一致性與可重現性。

#!/bin/bash

#############################################
# CI/CD 環境自動化建置系統
# 版本:1.0.0
# 作者:玄貓(BlackCat)
# 功能:自動安裝與配置完整的 CI/CD 工具鏈
#############################################

# 全域配置
readonly LOG_FILE="/var/log/cicd_setup.log"
readonly INSTALL_DIR="/opt/cicd"

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

# 安裝 Docker 與 Docker Compose
install_docker() {
    log "INFO" "========================================="
    log "INFO" "開始安裝 Docker"
    log "INFO" "========================================="
    
    # 移除舊版本
    apt-get remove -y docker docker-engine docker.io containerd runc 2>&1 | tee -a "${LOG_FILE}"
    
    # 安裝依賴套件
    apt-get update 2>&1 | tee -a "${LOG_FILE}"
    apt-get install -y \
        ca-certificates \
        curl \
        gnupg \
        lsb-release 2>&1 | tee -a "${LOG_FILE}"
    
    # 加入 Docker 官方 GPG 金鑰
    mkdir -p /etc/apt/keyrings
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
        gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    
    # 設定 Docker repository
    echo \
        "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
        $(lsb_release -cs) stable" | \
        tee /etc/apt/sources.list.d/docker.list > /dev/null
    
    # 安裝 Docker Engine
    apt-get update 2>&1 | tee -a "${LOG_FILE}"
    apt-get install -y \
        docker-ce \
        docker-ce-cli \
        containerd.io \
        docker-buildx-plugin \
        docker-compose-plugin 2>&1 | tee -a "${LOG_FILE}"
    
    # 啟動 Docker 服務
    systemctl start docker
    systemctl enable docker
    
    # 驗證安裝
    if docker run hello-world 2>&1 | tee -a "${LOG_FILE}"; then
        log "INFO" "Docker 安裝成功"
    else
        log "ERROR" "Docker 安裝失敗"
        return 1
    fi
}

# 安裝 GitLab Runner
install_gitlab_runner() {
    log "INFO" "========================================="
    log "INFO" "開始安裝 GitLab Runner"
    log "INFO" "========================================="
    
    # 下載並安裝 GitLab Runner
    curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | \
        bash 2>&1 | tee -a "${LOG_FILE}"
    
    apt-get install -y gitlab-runner 2>&1 | tee -a "${LOG_FILE}"
    
    # 將 gitlab-runner 加入 docker 群組
    usermod -aG docker gitlab-runner
    
    log "INFO" "GitLab Runner 安裝完成"
    log "INFO" "請使用 'gitlab-runner register' 註冊 Runner"
}

# 安裝 Jenkins
install_jenkins() {
    log "INFO" "========================================="
    log "INFO" "開始安裝 Jenkins"
    log "INFO" "========================================="
    
    # 安裝 Java
    apt-get install -y openjdk-17-jdk 2>&1 | tee -a "${LOG_FILE}"
    
    # 加入 Jenkins repository
    curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | \
        tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null
    
    echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
        https://pkg.jenkins.io/debian-stable binary/ | \
        tee /etc/apt/sources.list.d/jenkins.list > /dev/null
    
    # 安裝 Jenkins
    apt-get update 2>&1 | tee -a "${LOG_FILE}"
    apt-get install -y jenkins 2>&1 | tee -a "${LOG_FILE}"
    
    # 啟動 Jenkins
    systemctl start jenkins
    systemctl enable jenkins
    
    # 顯示初始密碼
    log "INFO" "Jenkins 安裝完成"
    log "INFO" "初始管理員密碼:"
    cat /var/lib/jenkins/secrets/initialAdminPassword
}

# 主要執行流程
main() {
    log "INFO" "開始建置 CI/CD 環境..."
    
    # 更新系統
    apt-get update 2>&1 | tee -a "${LOG_FILE}"
    
    # 安裝基礎工具
    apt-get install -y \
        git \
        curl \
        wget \
        build-essential \
        python3-pip 2>&1 | tee -a "${LOG_FILE}"
    
    # 安裝各項工具
    install_docker || exit 1
    install_gitlab_runner || exit 1
    install_jenkins || exit 1
    
    log "INFO" "CI/CD 環境建置完成"
}

main "$@"
@startuml
!define PLANTUML_FORMAT svg
!theme _none_

skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100

start
:更新系統套件清單;
:安裝基礎開發工具;

fork
  :安裝 Docker;
  :配置 Docker 服務;
  :驗證 Docker 安裝;
fork again
  :安裝 GitLab Runner;
  :配置 Runner 權限;
fork again
  :安裝 Java 執行環境;
  :安裝 Jenkins;
  :啟動 Jenkins 服務;
  :取得初始管理員密碼;
end fork

:產生環境配置報告;
:顯示後續設定步驟;
stop

@enduml

這個 CI/CD 環境建置流程圖展示了各個元件的平行安裝過程,充分利用系統資源加速環境建置。

Kali Linux 客製化建置

Kali Linux 是滲透測試領域最廣泛使用的作業系統。透過自動化建置流程,我們能夠客製化符合特定需求的 Kali 環境。

#!/bin/bash

#############################################
# Kali Linux 客製化建置系統
# 版本:1.0.0
# 作者:玄貓(BlackCat)
# 功能:自動化建置客製化 Kali Linux ISO
#############################################

# 全域配置
readonly BUILD_DIR="${HOME}/kali-custom-build"
readonly LOG_FILE="${BUILD_DIR}/build.log"

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

# 安裝建置環境
setup_build_environment() {
    log "INFO" "========================================="
    log "INFO" "設定 Kali 建置環境"
    log "INFO" "========================================="
    
    # 安裝必要工具
    apt-get update 2>&1 | tee -a "${LOG_FILE}"
    apt-get install -y \
        git \
        live-build \
        cdebootstrap \
        devscripts \
        kali-archive-keyring 2>&1 | tee -a "${LOG_FILE}"
    
    # 建立建置目錄
    mkdir -p "${BUILD_DIR}"
    cd "${BUILD_DIR}" || exit 1
    
    log "INFO" "建置環境設定完成"
}

# 配置客製化選項
configure_custom_build() {
    log "INFO" "========================================="
    log "INFO" "配置客製化 Kali 建置"
    log "INFO" "========================================="
    
    # 初始化 live-build 配置
    lb config \
        --distribution kali-rolling \
        --debian-installer false \
        --archive-areas "main contrib non-free non-free-firmware" \
        --bootappend-live "boot=live components quiet splash noeject" \
        --security true \
        --updates true \
        --backports true 2>&1 | tee -a "${LOG_FILE}"
    
    # 加入客製化套件清單
    mkdir -p config/package-lists
    
    cat > config/package-lists/custom.list.chroot << 'EOF'
# 滲透測試工具
nmap
metasploit-framework
burpsuite
wireshark
aircrack-ng
hashcat
john

# 開發工具
git
vim
tmux
docker.io
python3-pip

# 安全工具
lynis
rkhunter
chkrootkit
EOF
    
    log "INFO" "客製化配置完成"
}

# 執行建置
build_iso() {
    log "INFO" "========================================="
    log "INFO" "開始建置 ISO 映像"
    log "INFO" "========================================="
    
    # 清理之前的建置
    lb clean --purge 2>&1 | tee -a "${LOG_FILE}"
    
    # 執行建置
    lb build 2>&1 | tee -a "${LOG_FILE}"
    
    # 檢查建置結果
    if [[ -f live-image-amd64.hybrid.iso ]]; then
        local iso_size=$(du -h live-image-amd64.hybrid.iso | cut -f1)
        log "INFO" "ISO 建置成功"
        log "INFO" "檔案大小: ${iso_size}"
        log "INFO" "檔案位置: ${BUILD_DIR}/live-image-amd64.hybrid.iso"
    else
        log "ERROR" "ISO 建置失敗"
        return 1
    fi
}

# 清理建置檔案
cleanup_build() {
    log "INFO" "清理暫存檔案..."
    
    # 保留 ISO 檔案,清理其他建置產物
    find "${BUILD_DIR}" -type f ! -name "*.iso" ! -name "*.log" -delete 2>&1 | tee -a "${LOG_FILE}"
    find "${BUILD_DIR}" -type d -empty -delete 2>&1 | tee -a "${LOG_FILE}"
    
    log "INFO" "清理完成"
}

# 主要執行流程
main() {
    log "INFO" "開始 Kali Linux 客製化建置..."
    
    # 檢查權限
    if [[ $EUID -ne 0 ]]; then
        log "ERROR" "此程式需要 root 權限執行"
        exit 1
    fi
    
    setup_build_environment || exit 1
    configure_custom_build || exit 1
    build_iso || exit 1
    cleanup_build
    
    log "INFO" "Kali Linux 客製化建置完成"
}

# 設定清理函式
trap cleanup_build EXIT

main "$@"

這個 Kali 客製化建置系統提供了完整的自動化流程,從環境準備、配置客製化選項到最終的 ISO 建置,全程自動化處理。

結語

本文深入探討了 Bash 指令碼與 AI 技術在滲透測試與 DevSecOps 領域的應用。從 API 整合、Nmap 結果智慧分析,到持續安全測試、配置管理、日誌監控與合規驗證,我們建立了一套完整的自動化安全解決方案。

透過將 AI 能力整合至傳統的安全工具與流程,我們能夠實現更智慧的威脅偵測與回應。Bash 指令碼作為連接各種工具與系統的膠水層,提供了靈活性與可擴展性,使得複雜的安全自動化流程能夠以簡潔的方式實現。

在 DevSecOps 環境中,安全不再是事後的檢查項目,而是貫穿整個開發生命週期的核心要素。透過持續的安全測試、即時的威脅監控與自動化的回應機制,組織能夠在保持快速開發節奏的同時,確保軟體產品的安全性。

展望未來,隨著 AI 技術的持續進步,我們可以預期更多智慧化的安全工具與服務將被開發出來。自動化腳本將扮演更重要的角色,整合這些新興技術至現有的安全工作流程。持續學習與實踐,掌握最新的工具與技術,是每位安全從業人員在這個快速演進的領域中保持競爭力的關鍵。