news 2026/9/26 2:35:10

使用 Packer 与 Cloudbase-Init 在 Proxmox 上构建 GOAD Windows 模板:完整实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用 Packer 与 Cloudbase-Init 在 Proxmox 上构建 GOAD Windows 模板:完整实战指南
  • 网络安全
  • 渗透测试

【免费下载链接】GOAD

game of active directory

项目地址:https://gitcode.com/gh_mirrors/go/GOAD
点击查看免费下载

导读

GOAD(Game of Active Directory)是一套用于练习 Active Directory 攻击与防御技术的开源实验环境,而packer/proxmox目录正是其在 Proxmox 虚拟化平台上的“造镜像”环节:通过 Packer 的proxmox-iso构建器,把 Windows 评估版 ISO 自动安装、打上 VirtIO 驱动、注入 Cloudbase-Init 并执行 Sysprep,最终产出可被 Terraform 直接克隆的云初始化(cloud-init)模板。读完本文,你将掌握从下载 Windows ISO、生成 Autounattend 与脚本 ISO、编写 pkvars 变量文件、安装 Packer 到执行 validate/build 的完整流程,并理解 Autounattend.xml 的无人值守安装细节与 Cloudbase-Init 在模板化过程中的关键作用。

本文以 packer/proxmox/README.md 为主线,结合仓库中的 build_proxmox_iso.sh、packer.json.pkr.hcl 与各版本.pkvars.hcl文件展开讲解。

一、先搞清楚构建链路:Packer 在 GOAD/Proxmox 中的位置

在 GOAD 项目中,Proxmox 平台的部署分成两段:

  1. 模板制造(本文主题):用 Packer 把一个干净的 Windows ISO 变成带 cloud-init 能力的模板虚拟机。仓库中所有系统盘都只读挂载在proxmox提供商下,模板命名如WinServer2019_x64;
  2. 实例克隆:Terraform 通过clone引用这些模板快速生成 DC01、DC02、SRV02 等实例(见 ad/GOAD/providers/proxmox/windows.tf)。

因此,Packer 环节解决的核心问题是:Proxmox 上无法像 VirtualBox 那样直接挂载软盘(A:\)注入无人值守应答文件,所以必须把所有自动化材料(Autounattend.xml、Sysprep 脚本、Cloudbase-Init MSI 等)打包成 ISO 挂载给安装程序。这正是build_proxmox_iso.sh脚本注释中明确写明的设计动机:“transform files into iso, because proxmox only accept iso and no floppy A:\”(见 build_proxmox_iso.sh)。

整体构建流程可概括为:

  • 准备 Windows 评估版 ISO 与 Cloudbase-Init MSI;
  • 用mkisofs把answer_files/目录打成 Autounattend ISO、把scripts/目录打成脚本 ISO;
  • 编写config.auto.pkrvars.hcl与对应系统版本的.pkvars.hcl;
  • 安装 Packer 与 Proxmox 插件;
  • packer validate校验、packer build构建,产出 cloud-init 模板。

二、前置物料:Windows ISO 与 Cloudbase-Init MSI

2.1 Windows 评估版 ISO

按 README 说明,需要从微软官方评估中心下载以下三个 ISO,并放入 Proxmox 的 ISO 存储(仓库中默认名为local,对应proxmox_iso_storage):

ISO 文件名对应系统仓库中对应的 pkvars 文件
Windows-10-22h2_x64_en-us.isoWindows 10 22H2windows_10_22h2_proxmox_cloudinit.pkvars.hcl
windows_server_2016_14393.0_eval_x64.isoWindows Server 2016windows_server2016_proxmox_cloudinit.pkvars.hcl
windows_server2019_x64FREE_en-us.isoWindows Server 2019windows_server2019_proxmox_cloudinit.pkvars.hcl

关键注意事项(README 原文强调):Be sure to name the iso like the name inside——下载后的 ISO 文件名必须与变量文件中iso_file字段指定的名称完全一致。例如 Windows Server 2019 的 pkvars 中写的是iso_file = "local:iso/windows_server2019_x64FREE_en-us.iso"(见 windows_server2019_proxmox_cloudinit.pkvars.hcl),如果上传时改了名,Packer 将无法在存储中找到该 ISO。

2.2 Cloudbase-Init MSI

  • 从 Cloudbase-Init 官网下载CloudbaseInitSetup_Stable_x64.msi(约 54.7 MB);
  • 放到仓库 packer/proxmox/scripts/sysprep/ 目录下,文件名保持为CloudbaseInitSetup_Stable_x64.msi。

这个 MSI 会在后续build_proxmox_iso.sh打包脚本 ISO 时被一并封入scriptsISO,并在系统首次登录时由 cloudbase-init.ps1 静默安装。

三、Prepare:生成 Autounattend 与脚本 ISO

3.1 安装 mkisofs 并执行构建脚本

sudo apt-get install mkisofs cd /root/GOAD/packer/proxmox/ ./build_proxmox_iso.sh

提示:仓库路径以克隆位置为准,示例中的/root/GOAD是 README 的场景;实际使用时请cd到你克隆仓库的packer/proxmox/目录。

3.2 脚本到底做了什么

逐行阅读 build_proxmox_iso.sh,可以发现它针对 5 个场景各生成一个 Autounattend ISO,外加 1 个脚本 ISO:

输出 ISO来源目录对应 pkvars 文件被自动更新 checksum
./iso/Autounattend_windows10_cloudinit.isoanswer_files/10_proxmox_cloudinitwindows_10_22h2_proxmox_cloudinit.pkvars.hcl
./iso/Autounattend_windows10_cloudinit_uptodate.isoanswer_files/10_proxmox_cloudinit_uptodatewindows_10_22h2_proxmox_cloudinit_uptodate.pkvars.hcl
./iso/Autounattend_winserver2016_cloudinit.isoanswer_files/2016_proxmox_cloudinitwindows_server2016_proxmox_cloudinit.pkvars.hcl
./iso/Autounattend_winserver2019_cloudinit.isoanswer_files/2019_proxmox_cloudinitwindows_server2019_proxmox_cloudinit.pkvars.hcl
./iso/Autounattend_winserver2019_cloudinit_uptodate.isoanswer_files/2019_proxmox_cloudinit_uptodatewindows_server2019_proxmox_cloudinit_uptodate.pkvars.hcl
./iso/scripts_withcloudinit.isoscripts/—(不更新校验和)

该脚本的核心逻辑(以 2019 普通版为例):

mkisofs -J -l -R -V "autounatend CD" -iso-level 4 \ -o ./iso/Autounattend_winserver2019_cloudinit.iso answer_files/2019_proxmox_cloudinit sha_winserv2019=$(sha256sum ./iso/Autounattend_winserver2019_cloudinit.iso|cut -d ' ' -f1) sed -i "s/\"sha256:.*\"/\"sha256:$sha_winserv2019\"/g" windows_server2019_proxmox_cloudinit.pkvars.hcl

两点值得注意:

  • mkisofs 参数:-J(Joliet 扩展)、-l(允许长文件名)、-R(Rock Ridge 扩展)、-V "autounatend CD"(卷标)、-iso-level 4(ISO 9660 Level 4,支持更长的文件名);
  • 自动更新校验和:每次重新打包 Autounattend ISO 后,脚本都会重新计算 SHA-256,并通过sed回写到对应.pkvars.hcl的autounattend_checksum字段。这意味着你无需手动维护校验和,只要始终用脚本生成 ISO。

3.3 上传 ISO 到 Proxmox

把生成的packer/proxmox/iso/scripts_withcloudinit.iso放入 Proxmox 的 ISO 文件夹(即proxmox_iso_storage对应的存储,默认local)。同样地,前面生成的各个Autounattend_*.iso也要一并上传,供后续 Packer 构建时通过additional_iso_files挂载。

四、Configure:编写 pkvars 变量文件

4.1 从模板复制

cp config.auto.pkrvars.hcl.template config.auto.pkrvars.hcl

然后根据你的 Proxmox 环境修改其中每一项。模板内容(见 config.auto.pkrvars.hcl.template):

变量示例值含义
proxmox_urlhttps://192.168.1.1:8006/api2/jsonProxmox API 地址,指向 8006 端口
proxmox_usernameinfra_as_code@pveAPI 用户,@后为 PVE realm
proxmox_passwordCHANGEMEAPI 用户密码(务必修改)
proxmox_skip_tls_verifytrue跳过 TLS 证书校验(自签名证书环境下必须为 true)
proxmox_nodeproxmox-goad目标物理节点名
proxmox_poolTemplates资源池(可选)
proxmox_iso_storagelocalISO 存放存储
proxmox_vm_storagelocal-lvm虚拟机磁盘存放存储

由于文件名带.auto.,Packer 会自动加载config.auto.pkrvars.hcl,无需显式-var-file指定。

4.2 系统版本专属变量:以 Server 2019 为例

windows_server2019_proxmox_cloudinit.pkvars.hcl 完整内容:

winrm_username = "vagrant" winrm_password = "vagrant" vm_name = "WinServer2019x64-cloudinit-qcow2" template_description = "Windows Server 2019 64-bit - build 17763.737.190906-2324 - template built with Packer - cloudinit - {{isotime \"2006-01-02 03:04:05\"}}" iso_file = "local:iso/windows_server2019_x64FREE_en-us.iso" autounattend_iso = "./iso/Autounattend_winserver2019_cloudinit.iso" autounattend_checksum = "sha256:2b3eeb1346c38a3ef5e4daefcf58d212471db7c8a95dd3dff831b78aaa246e8e" vm_cpu_cores = "2" vm_memory = "4096" vm_disk_size = "40G" vm_sockets = "1" os = "win10" vm_disk_format = "qcow2"

参数说明:

  • winrm_username / winrm_password:Packer 通过 WinRM 连接目标机执行配置脚本的凭据,仓库统一使用vagrant/vagrant(与 Autounattend 中创建的本地管理员账号一致);
  • vm_name / template_name:最终生成的模板名称,后续 Terraform 用clone引用;
  • template_description:模板描述,支持{{isotime}}模板函数生成构建时间戳;
  • iso_file:Windows 系统 ISO 在 Proxmox 存储中的位置(必须与 2.1 节的文件名一致);
  • autounattend_iso / autounattend_checksum:由build_proxmox_iso.sh生成的应答文件 ISO 及其 SHA-256(脚本自动回写);
  • vm_cpu_cores / vm_memory / vm_disk_size / vm_sockets:模板虚拟机规格;
  • os:Packer 识别系统类型的字段(仓库中统一写win10,指代 Windows 10+ 系列安装流程);
  • vm_disk_format:磁盘格式,默认qcow2(也支持raw等)。

另外还有带_uptodate后缀的变体,例如 windows_server2019_proxmox_cloudinit_uptodate.pkvars.hcl,它使用Autounattend_winserver2019_cloudinit_uptodate.iso、磁盘扩容到80G,用于需要预装 Windows 补丁的场景。

五、Ubuntu 虚拟机:安装 Packer

README 给出的标准安装方式(基于 HashiCorp APT 源):

apt update apt -y install apt-transport-https ca-certificates curl software-properties-common curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add - apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main" apt update apt install packer

说明:apt-key add是旧版签名导入方式,较新的 Ubuntu/Debian 可能提示弃用;若遇到问题,可改用把 GPG key 写入/usr/share/keyrings/hashicorp-archive-keyring.gpg并引用[signed-by=...]的现代方式,然后照常执行apt update && apt install packer。

本项目对 Packer 的最低插件版本要求为>= 1.1.2(见 packer.json.pkr.hcl),首次使用前建议执行一次packer init .来安装 Proxmox 插件。

六、BUILD:校验与构建模板

README 原始命令(基于当时的.json变量文件):

packer validate -var-file=config.json windows_server2019_proxmox.json packer build -var-file=config.json windows_server2019_proxmox.json

当前仓库已全面 HCL 化(源码内为windows_server2019_proxmox_cloudinit.pkvars.hcl等.pkvars.hcl文件,模板为 packer.json.pkr.hcl),对应命令为:

packer init . packer validate -var-file=windows_server2019_proxmox_cloudinit.pkvars.hcl . packer build -var-file=windows_server2019_proxmox_cloudinit.pkvars.hcl .

同理可对 Windows 10(windows_10_22h2_proxmox_cloudinit.pkvars.hcl)和 Server 2016(windows_server2016_proxmox_cloudinit.pkvars.hcl)执行相同操作,生成多套模板。

6.1 构建器配置详解

packer.json.pkr.hcl 中proxmox-iso构建器的关键设计:

  • 三个附加 ISO 挂载点:
    • sata3:Autounattend 应答文件 ISO(带校验和校验,unmount = true);
    • sata4:local:iso/virtio-win.iso(VirtIO 驱动盘,Windows 安装阶段加载磁盘/网卡驱动);
    • sata5:local:iso/scripts_withcloudinit.iso(存放 sysprep、Cloudbase-Init MSI、WinRM 配置等脚本);
  • cloud_init:cloud_init = true且指定cloud_init_storage_pool,使生成的模板具备 cloud-init 能力,供 Terraform 注入 IP/DNS/用户数据;
  • communicator:winrm,且winrm_use_ssl = true、winrm_timeout = "120m"、winrm_insecure = true(自签名证书)、winrm_no_proxy = true;
  • 网络:桥接vmbr3、VirtIO 网卡、vlan_tag = "10";
  • 磁盘:sata类型、存储池取自proxmox_vm_storage;
  • task_timeout:40m,避免 Proxmox 任务长时间卡死。

6.2 两个 PowerShell provisioner

构建阶段会依次执行两个特权脚本(均以vagrant用户提升运行,见 packer.json.pkr.hcl):

  1. cloudbase-init.ps1:把G:\sysprep\CloudbaseInitSetup_Stable_x64.msi复制到c:\setup并静默安装(/qn,日志写C:\setup\cloud-init.log);
  2. cloudbase-init-p2.ps1(pause_before = "1m0s"等待安装完成):轮询日志出现Installation completed successfully后,把三份配置文件(cloudbase-init.conf、cloudbase-init-unattend.conf、cloudbase-init-unattend.xml)复制到 Cloudbase-Init 的 conf 目录,随后禁用 cloudbase-init 自启动,最后执行sysprep.exe /generalize /oobe /mode:vm /unattend:cloudbase-init-unattend.xml完成系统封装。

Sysprep 结束后模板即进入“可克隆”状态。

七、深度原理:Autounattend.xml 与无人值守安装细节

所有无人值守逻辑都封装在answer_files/各版本的Autounattend.xml中,以 2019_proxmox_cloudinit/Autounattend.xml 为例:

7.1 windowsPE 阶段:加载 VirtIO 驱动

安装程序从F:(virtio-win.iso)加载\2k19\amd64目录下的viostor(存储)、NetKVM(网络)、Balloon、pvpanic、vioscsi等全部驱动(见 Autounattend.xml)。这是 Proxmox 下 Windows 能否识别 VirtIO 磁盘与网卡的关键。

7.2 磁盘与映像安装

  • 将整块磁盘(DiskID 0)创建为单个主分区并格式化为 NTFS、卷标Windows 2019,WillWipeDisk = true;
  • 从镜像安装Windows Server 2019 SERVERDATACENTER到分区 1;
  • 使用评估版 ISO 时无需填写ProductKey(注释中明确说明:Do not uncomment the Key element if you are using trial ISOs);
  • 语言设置为 en-US 主界面、fr-FR 输入法(仓库默认值,可按需修改)。

7.3 首次登录命令序列(FirstLogonCommands)

安装完成后按Order顺序执行一系列命令,包括:设置 64/32 位 PowerShell 执行策略为RemoteSigned、关闭网络弹窗、执行G:\fixnetwork.ps1修复网络分类、执行G:\disable-winrm.ps1临时禁用 WinRM、注册表优化(显示文件扩展名、QuickEdit、显示运行/管理工具、关闭休眠)、设置 vagrant 密码永不过期、启用自动登录、放行 WinRM 防火墙规则、安装F:\guest-agent\qemu-ga-x86_64.msi(QEMU guest agent)等。

7.4 “no updates” 与 “WITH WINDOWS UPDATES” 开关

这是 README 中“Windows update”一节的落点:在Autounattend.xml中存在一对注释开关(见 Autounattend.xml):

  • 默认(no updates):<!-- no updates -->生效,第 98 步执行G:\ConfigureRemotingForAnsible.ps1配置 WinRM,第 99 步执行G:\enable-winrm.ps1启用 WinRM,随后被<!-- end no update -->注释掉;
  • WITH WINDOWS UPDATES:注释掉 no updates 块,改为启用G:\microsoft-updates.bat(开启 Microsoft Update 源)、G:\disable-screensaver.ps1(关闭屏保,避免安装更新时中断)与G:\win-updates.ps1(安装 Windows 更新)。

仓库已预置两套Autounattend.xml(普通版与_uptodate版),两套文件的开关状态恰好相反,因此“想要带补丁的模板”无需手工改注释,直接用_uptodate版文件与对应 pkvars 构建即可。

八、Cloudbase-Init:让模板获得 cloud-init 能力

模板最终通过 Cloudbase-Init 对接 Proxmox 的 cloud-init 驱动(config drive)。核心配置在 cloudbase-init.conf:

  • metadata_services=cloudbaseinit.metadata.services.configdrive.ConfigDriveService:只启用 config drive 元数据服务;
  • plugins启用了网络配置、设置用户密码、用户数据、设置主机名、MTU、扩展卷等插件,其中ExtendVolumesPlugin会把磁盘扩展到 cloud-init 指定大小(这正是模板磁盘40G、实例却可更大容量的原因);
  • inject_user_password=true、config_drive_raw_hhd/cdrom/vfat=true:兼容多种 config drive 介质。

Sysprep 阶段使用的 cloudbase-init-unattend.xml 则负责在 generalize 后重新把 cloudbase-init 服务设为自启动(sc config cloudbase-init start= auto),保证模板克隆出的实例在首次启动时能正确执行 cloud-init。

至此,enable-winrm.ps1(见 scripts/enable-winrm.ps1)与ConfigureRemotingForAnsible.ps1共同保证了克隆出来的实例能被 Ansible 通过 WinRM 管理,为 GOAD 后续的域环境配置(ad、adcs、vulns 等 playbook)铺平道路。

九、模板在 GOAD 中的落地使用

构建完成的模板会立刻被 GOAD 的 Proxmox Terraform 配置引用。以 ad/GOAD/providers/proxmox/windows.tf 为例,DC01/DC02/SRV02 等实例通过clone = "WinServer2019_x64"直接基于模板克隆,并借助 cloud-init 注入ip、dns、gateway与主机名。也就是说:本文构建的模板质量,直接决定整个 GOAD 实验环境的可用性。

十、常见问题与注意事项

  • TLS 自签名:Proxmox 默认自签名证书,务必保持proxmox_skip_tls_verify = "true",否则 Packer API 调用会报证书错误;
  • ISO 命名一致性:上传到local存储的 Windows ISO 名称必须与iso_file完全一致(README 明确强调);
  • 校验和自动维护:重新生成 Autounattend ISO 后,build_proxmox_iso.sh会自动更新 pkvars 中的sha256:校验和,无需手工修改,但前提是你重新运行了脚本;
  • WinRM 超时:模板构建依赖 WinRM,winrm_timeout默认 120 分钟、task_timeout默认 40 分钟,安装更新版本耗时更长,若超时可适当上调;
  • virtio-win.iso:构建器在sata4挂载local:iso/virtio-win.iso,需要先从 VirtIO 驱动站点下载并上传到 Proxmox 的 ISO 存储,否则安装阶段无法加载驱动;
  • CloudbaseInitSetup_Stable_x64.msi:必须预先放到 packer/proxmox/scripts/sysprep/ 目录,它会被封进scripts_withcloudinit.iso;缺失该文件时,cloudbase-init.ps1将无从安装。

通过以上步骤,你可以为 GOAD 的 Proxmox 环境批量产出 Windows 10、Server 2016、Server 2019 的 cloud-init 模板,并选择是否预装 Windows 更新,从而获得一套完全自动化的实验环境供应链路。

  • 网络安全
  • 渗透测试

【免费下载链接】GOAD

game of active directory

项目地址:https://gitcode.com/gh_mirrors/go/GOAD
点击查看免费下载
上一篇:终极指南:使用Python bilibili-api库开发B站自动化工具
下一篇:BentoPDF 数字签名验证实战:在浏览器中校验 PDF 签名完整性、证书有效期与信任链

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/26 2:34:48

SoLab AI逆向工作台:集成DEX/SO/Flutter的安卓逆向分析利器

很多做安卓安全研究、App合规检测、恶意代码分析的朋友&#xff0c;应该都有过这样的体会&#xff1a;拿到一个APK&#xff0c;第一件事就是用jadx打开看一眼Java层代码&#xff0c;再用IDA或者Ghidra去啃Native库&#xff0c;遇到Flutter应用更是头疼&#xff0c;Dart AOT编译…

作者头像 李华
网站建设 2026/9/26 2:29:17

Substrate区块链开发框架:从核心原理到无分叉升级实战

1. 从“substrate”这个词说起&#xff1a;它到底是什么&#xff0c;能解决什么问题第一次看到“substrate”这个标题&#xff0c;很多人脑子里蹦出来的第一反应可能是“底层”“基底”“培养基”这类模糊概念。这个词本身确实是个跨领域的高频术语——在材料科学里它指衬底&am…

作者头像 李华
网站建设 2026/9/26 2:28:32

PostgreSQL用户与权限管理:角色、授权与默认权限实战

如果管理过任何一套正经的 PostgreSQL&#xff0c;你大概率遇到过两种经典场面&#xff1a;一是新同事在测试库上死活查不着一张表&#xff0c;你在工位上一看就知道是权限没给到位&#xff1b;二是上线前夜&#xff0c;有人来问某个账号为啥能碰生产库的数据。两个问题指向同一…

作者头像 李华