资讯详情

DetectionLab CI 构建流水线全解析:Ubuntu 裸金属服务器的引导(Bootstrap)与并行自动化构建

📅 2026/10/15 1:51:27 | 华诺云谱 👁 阅读
DetectionLab CI 构建流水线全解析:Ubuntu 裸金属服务器的引导(Bootstrap)与并行自动化构建
网络安全运维DevOps【免费下载链接】DetectionLabAutomate the creation of a lab environment complete with security tooling and logging best practices项目地址https://gitcode.com/gh_mirrors/de/DetectionLab点击查看免费下载导读DetectionLab 是一个用于自动化构建安全检测实验环境含 Splunk、Fleet、Velociraptor、Guacamole 等安全工具与日志采集最佳实践的开源项目而ci/目录承载了它的持续集成CI基础设施通过一系列 bash 脚本在 Ubuntu 裸金属服务器上完成依赖安装、环境固化与多台 Vagrant 虚拟机的并行构建。本文以 ci/README.md 为骨架结合仓库中全部 CI 脚本源码逐行讲解自动与手动两种 bootstrap 方式、并行构建调度逻辑、构建完成判定规则、构建后健康检查以及将构建产物导出为 OVA 并导入 AWS 的完整流程。读完本文你将掌握 DetectionLab CI 全链路的实现原理并能够据此搭建属于自己的 DetectionLab 自动化构建与分发环境。一、ci/目录定位从零到可用的 CI 构建服务器ci/README.md明确指出该目录的职责使用目录内的脚本将一台 Ubuntu 裸金属服务器引导bootstrap为可供持续集成测试使用的构建机。整个流程分两步在裸金属服务器上安装 Detection Lab 构建所需的全部先决条件VirtualBox、Vagrant、Git、防火墙等调用构建脚本并在一个tmux 会话中启动完整构建便于构建过程在 SSH 断开后依然持续运行。ci/目录实际包含 5 个可执行脚本覆盖了三条不同的应用场景脚本面向环境用途build_machine_bootstrap.shPacket.net 裸金属服务器Ubuntu 16.04自动化 CI 构建机的完整引导安装依赖后直接在 tmux 中启动构建manual_machine_bootstrap.shUbuntu 18.04 服务器VirtualBox 后端手动准备构建机额外安装 Packer 与 awsclimanual_machine_bootstrap_vmware.shUbuntu 16.04 服务器VMware Workstation 后端手动准备基于 VMware 的构建机copy_to_s3.sh构建完成的 DetectionLab将全部虚拟机导出为 OVA 并上传 S3导入 AWS EC2copy_to_s3_logger.sh构建完成的 DetectionLab仅导出 logger 主机并导入 AWS从源码结构看前三个脚本负责构建环境后两个脚本负责构建产物分发共同构成 DetectionLab 从本地实验室到云上 AMI 的自动化闭环。二、自动化引导build_machine_bootstrap.sh 逐段拆解build_machine_bootstrap.sh 是 CI 的核心引导脚本注释标明它运行在Packet.net 裸金属服务器上。其设计有一个非常实用的特性构建期间服务器会在80 端口启动一个 Web 服务器页面内容初始为building测试完成后自动被替换为success或failed外部监控只需轮询该页面即可获知构建状态。以下按执行顺序拆解各阶段。2.1 安装前置处理免交互与 IPv6 策略export DEBIAN_FRONTENDnoninteractive # Bypass prompt for libsslv1.1 echo libssl1.1:amd64 libraries/restart-without-asking boolean true | sudo debconf-set-selections # Disable IPv6 - may help with the vagrant-reload plugin echo net.ipv6.conf.all.disable_ipv61 /etc/sysctl.conf sysctl -p /etc/sysctl.conf /dev/nullDEBIAN_FRONTENDnoninteractive让 apt 全程免交互避免 CI 挂起在安装确认提示debconf-set-selections预先回答 libssl1.1 的重启询问绕过安装时可能出现的交互式对话框关闭 IPv6是经过实测的兼容性处理——脚本注释引用了 vagrant-reload 插件相关的已知问题关闭 IPv6 可提高该插件的稳定性而后续第 45–46 行又会重新开启 IPv6因为开启 IPv6 有助于提升 Vagrant Cloud 镜像下载的速度。这种构建前关、下载时开的精细开关策略体现了真实 CI 环境中的踩坑经验。2.2 安装 VirtualBox 6.1 与 Vagrantecho deb [archamd64] https://download.virtualbox.org/virtualbox/debian $(lsb_release -sc) contrib | sudo tee /etc/apt/sources.list.d/virtualbox.list wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add - wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add - wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg echo deb [signed-by/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main | sudo tee /etc/apt/sources.list.d/hashicorp.list apt-get -qq update apt-get -qq install -y linux-headers-$(uname -r) virtualbox-6.1 build-essential unzip git ufw apache2 vagrant关键点VirtualBox 通过官方 apt 源安装linux-headers-$(uname -r)与build-essential用于编译 VirtualBox 内核模块这是 VirtualBox 在 Linux 上能正常启动虚拟机的先决条件Vagrant 使用 HashiCorp 官方 apt 源并采用gpg --dearmor将密钥转为二进制 keyring 形式较新的安全实践apache2就是上面提到的状态页 Web 服务器ufw用于防火墙管理随后脚本执行echo building /var/www/html/index.html将构建状态页初始化为building。2.3 防火墙策略最小开放原则ufw allow ssh ufw allow http ufw default allow outgoing ufw --force enable防火墙只显式放行 SSH远程管理与 HTTP构建状态页出站流量默认全部放行保证 apt、git、Vagrant Cloud 等下载不受阻其余入站流量默认拒绝。--force避免交互确认适合无人值守场景。2.4 vagrant-reload 插件安装与容错重试vagrant plugin install vagrant-reload if [ $(vagrant plugin list | grep -c vagrant-reload) -ne 1 ]; then echo [$(date %H:%M:%S)]: The first attempt to install the vagrant-reload plugin failed. Trying again. vagrant plugin install vagrant-reload fivagrant-reload插件为 Vagrant 增加vagrant reload --provision能力是 Windows 虚拟机首次启动后自动重启并继续配置的关键详见后文 build.sh 中的使用。脚本通过vagrant plugin list校验安装结果失败则自动重试一次体现 CI 脚本对网络等不稳定因素的容错设计。2.5 将虚拟机切换为 Headless 模式cd /opt/DetectionLab/Vagrant || exit 1 sed -i s/vb.gui true/vb.gui false/g Vagrantfile cd /opt/DetectionLab/Vagrant/Exchange || exit 1 sed -i s/vb.gui true/vb.gui false/g Vagrantfile裸金属服务器没有显示器必须把 GUI 关掉。脚本直接用sed将 Vagrant/Vagrantfile 与 Vagrant/Exchange/Vagrantfile 中的vb.gui true批量替换为false。这与两处 Vagrantfile 中 18、41、93、159、219 行等位置的 GUI 配置项一一对应。2.6 重建精简版 build.sh并行构建调度器引导脚本没有直接调用仓库根目录的构建脚本而是用 heredoc现场生成一份精简版 build.sh写入/opt/DetectionLab/build.sh并chmod x其核心价值是让我们能感知到返回码。这份脚本是整个 CI 的调度大脑逻辑非常值得细读阶段一并行拉起 logger 与 dcfor HOST in logger dc; do (vagrant up $HOST $DL_DIR/Vagrant/vagrant_up_$HOST.log || vagrant reload $HOST --provision $DL_DIR/Vagrant/vagrant_up_$HOST.log) declare ${HOST}_PID$! done两台虚拟机后台并行vagrant up日志分别写入vagrant_up_logger.log与vagrant_up_dc.log首次up失败时自动降级为vagrant reload --provision即配合 vagrant-reload 插件重启并继续执行 provision。阶段二等待 DC 完成域创建DC_CREATION_TIMEOUT30 MINUTES_PASSED0 while ! grep I am domain joined! $DL_DIR/Vagrant/vagrant_up_dc.log /dev/null; do sleep 60 ((MINUTES_PASSED 1)) if [ $MINUTES_PASSED -gt $DC_CREATION_TIMEOUT ]; then echo Timed out waiting for DC to create the domain controller. Exiting. exit 1 fi doneDC 必须先把域建好wef 与 win10 才能加域所以这里必须串行等待。判定信号是日志中出现I am domain joined!字样——它来自 Vagrant/scripts/provision.ps1 第 57 行Write-Host -fore green ... I am domain joined!即 DC 上加域脚本完成时的输出标记。超时上限为 30 分钟超时直接退出并返回非零状态码。阶段三并行拉起 wef 与 win10for HOST in wef win10; do (vagrant up $HOST $DL_DIR/Vagrant/vagrant_up_$HOST.log || vagrant reload $HOST --provision $DL_DIR/Vagrant/vagrant_up_$HOST.log) declare ${HOST}_PID$! doneDC 就绪后wef 与 win10 同样并行构建日志追加写入各自文件。阶段四等待全部构建结束并按日志判定成败while ps -p $logger_PID /dev/null || ps -p $dc_PID /dev/null || ps -p $wef_PID /dev/null || ps -p $win10_PID /dev/null; do sleep 60 done for HOST in logger dc wef win10; do if [[ $HOST logger ]]; then if grep logger: OK $DL_DIR/Vagrant/vagrant_up_$HOST.log /dev/null; then ... else exit 1; fi else if grep -i $HOST: $HOST Provisioning Complete! $DL_DIR/Vagrant/vagrant_up_$HOST.log /dev/null; then ... else exit 1; fi fi done通过轮询四个后台进程的 PID 判断构建是否全部结束ps -p在进程不存在时返回非零构建完成的判定依据是日志中的成功标记logger 主机查找logger: OK其余主机查找HOST: HOST Provisioning Complete!忽略大小写。后者与 Vagrant/Vagrantfile 中 83 行Write-Host DC Provisioning Complete!、149 行Write-Host WEF Provisioning Complete!、207 行Write-Host Win10 Provisioning Complete!的 provision 收尾输出一一对应任一主机标记缺失即exit 1保证 CI 能捕获失败的构建而不是看似成功。脚本注释中绝对糟糕的代码有空再修的自嘲从侧面说明这套调度逻辑是真实项目演化出来的、可工作的实现。2.7 tmux 会话启动构建sntmuxsession tmux new-session -s $sn -d tmux send-keys -t $sn:0 cd /opt/DetectionLab ./build.sh echo success /var/www/html/index.html || echo failed /var/www/html/index.html Enter引导脚本的最后一步在分离detached的 tmux 会话tmuxsession中执行构建这样即使 SSH 断开构建也能继续运行构建结束后将状态页写为success或failed形成完整的状态闭环。脚本末尾还保留了被注释掉的 Exchange 构建窗口示例说明 Exchange 主机在 CI 主流程中是可选构建项。三、手动引导两套 bootstrap 脚本的差异与补充3.1 VirtualBox 版手动引导Ubuntu 18.04manual_machine_bootstrap.sh 适用于手动搭建构建机的场景与自动版相比多了三块内容镜像源切换sed -i s/archive.ubuntu.com/us.archive.ubuntu.com/g /etc/apt/sources.list将 Ubuntu 官方源替换为美国镜像源us.archive.ubuntu.com通常可提升北美地区下载速度awscli 安装pip install awscli --upgrade --user后把~/.local/bin/aws复制到/usr/local/bin/aws为后续 OVA 上传 S3 做准备Packer 安装下载packer_1.7.3_linux_amd64.zip解压到/usr/local/bin/packer并将 Packer 目录下所有*.json中的headless: false替换为true与 Vagrant 的 headless 化处理保持同样的思路。此外它显式执行git clone将仓库克隆到/opt/DetectionLab自动版中该步骤以注释形式保留因为 Packet.net 服务器由 CI 系统自动注入代码。3.2 VMware 版手动引导Ubuntu 16.04manual_machine_bootstrap_vmware.sh 提供了基于VMware Workstation 16.2.0的后端方案与 VirtualBox 版的差异集中在虚拟化层安装ubuntu-desktopVMware Workstation 需要图形环境与libxtst6下载 VMware Workstation bundle 并以命令行方式静默安装序列号通过环境变量SERIALNUMBER注入额外安装vagrant-vmware-desktop插件与vagrant-vmware-utilitydeb 包使 Vagrant 能驱动 VMware 后端headless 化时替换的目标是v.gui trueVMware 提供者使用v.gui而非 VirtualBox 的vb.gui。三套脚本共同说明了 DetectionLab CI 对后端虚拟化层VirtualBox / VMware的抽象上层构建逻辑完全一致只有驱动与 GUI 开关写法不同。四、构建后的健康检查post_build_checks.sh自动版 build.sh 在四台主机构建完成后会调用/bin/bash $DL_DIR/Vagrant/post_build_checks.sh $DL_DIR/Vagrant/post_build.logVagrant/post_build_checks.sh 负责验证关键服务是否真正可用而非仅仅机器起来了。它通过curl探测以下端点服务探测地址判定特征Splunkhttps://192.168.56.105:8000/en-US/account/login页面包含 This browser is not supported by SplunkFleetosquery 管理https://192.168.56.105:8412页面包含 Fleet for osqueryMicrosoft ATAhttps://192.168.56.103HTTP 返回码为 401未授权即服务在线Velociraptorhttps://192.168.56.105:9999页面包含 app/index.htmlGuacamolehttp://192.168.56.105:8080/guacamole/#/页面包含 Apache Software每个检查失败只会输出[!]警告而不中断流程避免单点失败导致整轮 CI 误报但curl -m 2的 2 秒超时与-k的跳过证书校验保证了检查的快速与稳定。这份脚本的存在印证了 CI 的验收标准不仅是构建成功还包括安全工具栈全部就绪。五、构建产物上云OVA 导出与 AWS EC2 导入5.1 全量导出copy_to_s3.shcopy_to_s3.sh 将构建完成的 DetectionLab 四台或五台含 Exchange虚拟机打包上传以便在 AWS 上以 EC2 方式复现整个实验环境。核心流程凭据与配置若未安装 awscli 则自动安装通过aws configure set写入访问密钥与默认区域us-west-1BUCKET_NAME需手动填充脚本中为FILL_ME_IN清理痕迹先停掉 Splunk 并用splunk clean eventdata -f清空索引数据保证上传的是干净镜像开放 WinRM对 dc、wef、win10 逐台执行Set-NetFirewallRule -Name WINRM-HTTP-In-TCP -Profile Anywin10 额外处理WINRM-HTTP-In-TCP-NoScope规则确保导入 AWS 后 Windows 实例的远程管理通道可用清空事件日志通过wevtutil el | Select-String -notmatch Microsoft-Windows-LiveId | ForEach-Object { wevtutil cl $_ }清除全部 Windows 事件日志避免镜像携带环境痕迹激活状态检查cscript c:\windows\system32\slmgr.vbs /dlv打印每台主机的 Windows 激活状态导出 OVA先vagrant halt停机关机再按后端选择导出工具——有vmrun时用ovftool从 VMware 的.vmx导出否则用vboxmanage export 主机名.windomain.local -o /root/主机.ova每台主机的导出结果写入独立的.export标记文件success/failed主脚本通过while循环等待全部标记文件出现上传 S3 并修正导入清单aws s3 cp /root/主机.ova s3://$BUCKET_NAME/disks/同时用sed批量替换 AWS/Terraform/vm_import/ 下所有 JSON 中的YOUR_BUCKET_GOES_HERE占位符与S3Key前缀改为disks/将 OVA 路径写回导入描述文件发起镜像导入aws ec2 import-image --description 主机 --license-type byol --disk-containers file://.../主机.json其中byolBring Your Own License表示自带许可证。对应的导入描述文件模板如 dc.json结构如下[ { Description: dc, Format: ova, UserBucket: { S3Bucket: YOUR_BUCKET_GOES_HERE, S3Key: dc.ova } } ]copy_to_s3.sh会自动判断 Exchange 是否已构建检查.vagrant/machines/exchange/*/id文件是否存在存在则将其一并导出、上传与导入体现了脚本对可选组件的兼容。5.2 单独导出copy_to_s3_logger.shcopy_to_s3_logger.sh 是 logger 专用版本流程与全量版前段一致但更精简直接vboxmanage export logger -o /root/logger.ova仅支持 VirtualBox 后端等待导出完成后上传s3://$BUCKET_NAME/disks/logger.ova修正 AWS/Terraform/vm_import/logger.json 中的占位符最后aws ec2 import-image导入。适用于只需要 Splunk、Fleet 等日志收集侧组件的场景可以省去重复构建 Windows 主机的成本。六、CI 链路总览与关键经验总结把整套 CI 串起来DetectionLab 的自动化链路如下裸金属服务器 ├─ build_machine_bootstrap.sh自动/ manual_machine_bootstrap*.sh手动 │ ├─ 安装 VirtualBox/VMware Vagrant 依赖 │ ├─ 配置防火墙、IPv6 开关、headless 模式 │ └─ 安装 vagrant-reload 插件 ├─ build.shtmux 内运行 │ ├─ logger dc 并行构建 │ ├─ 等待 DC 域创建完成日志标记 I am domain joined! │ ├─ wef win10 并行构建 │ ├─ 等待全部 PID 结束 │ └─ 按 Provisioning Complete! 标记逐台判定成败 ├─ post_build_checks.shSplunk / Fleet / ATA / Velociraptor / Guacamole 健康探测 └─ copy_to_s3(_logger).sh清痕迹 → 关机 → 导出 OVA → 上传 S3 → ec2 import-image这条链路沉淀的工程经验值得在自建 CI 时复用状态可见化用 Apache 静态页面承载building/success/failed三种状态任何监控系统都能零成本接入依赖顺序建模DC 的域创建是 wef/win10 的硬前置必须串行等待其余主机可尽情并行通过日志标记而非时间猜测来判定就绪失败可感知为每台主机单独落日志、用 PID 与成功标记双保险判定任何一个环节失败都返回非零状态码镜像可迁移通过清理 Splunk 索引 清空事件日志 开放 WinRM 导出 OVA的组合拳让本地实验环境可以无损上云。需要注意的是上述脚本面向 Ubuntu 16.04/18.04 时代的环境VirtualBox 6.1、Packer 1.7.3、python-pip 安装 awscli在新版本操作系统上运行前应核对 apt 源、内核头文件与工具链版本BUCKET_NAME、AWS 凭据、VMware 序列号等敏感或环境相关参数也需按实际情况填充。这正是 CI 脚本开箱即用与按需定制之间的平衡点。赞分享网络安全运维DevOps【免费下载链接】DetectionLabAutomate the creation of a lab environment complete with security tooling and logging best practices项目地址https://gitcode.com/gh_mirrors/de/DetectionLab点击查看免费下载相关推荐Vulhub自动化构建CI/CD流水线深度解析Vulhub自动化构建CI/CD流水线深度解析 引言环境构建的自动化挑战 在网络安全研究和教育领域快速构建和部署测试环境是至关重要的。传统的手动构建方式耗网络安全应用安全渗透测试llm-zoomcamp自动化CI/CD流水线构建llm zoomcamp自动化CI/CD流水线构建 还在手动构建和部署你的LLM项目吗一文教你构建完整的自动化CI/CD流水线让AI应用部署像喝水一样简单示例工程教程人工智能大模型终极ChatGLM3推理服务CI/CD指南10个步骤构建自动化测试与部署流水线终极ChatGLM3推理服务CI/CD指南10个步骤构建自动化测试与部署流水线 ChatGLM3推理服务CI/CD是每个AI开发者都需要掌握的核心技能。作为一大模型人工智能微调本地部署AI AgentRAG上一篇pwndbg dw 命令详解从指定地址按 16 位字长转储内存下一篇Label Studio终极指南5分钟快速搭建多模态数据标注平台创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑