- 网络安全
- 渗透测试
【免费下载链接】GOAD
game of active directory
导读
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 平台的部署分成两段:
- 模板制造(本文主题):用 Packer 把一个干净的 Windows ISO 变成带 cloud-init 能力的模板虚拟机。仓库中所有系统盘都只读挂载在
proxmox提供商下,模板命名如WinServer2019_x64; - 实例克隆: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.iso | Windows 10 22H2 | windows_10_22h2_proxmox_cloudinit.pkvars.hcl |
windows_server_2016_14393.0_eval_x64.iso | Windows Server 2016 | windows_server2016_proxmox_cloudinit.pkvars.hcl |
windows_server2019_x64FREE_en-us.iso | Windows Server 2019 | windows_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.iso | answer_files/10_proxmox_cloudinit | windows_10_22h2_proxmox_cloudinit.pkvars.hcl |
./iso/Autounattend_windows10_cloudinit_uptodate.iso | answer_files/10_proxmox_cloudinit_uptodate | windows_10_22h2_proxmox_cloudinit_uptodate.pkvars.hcl |
./iso/Autounattend_winserver2016_cloudinit.iso | answer_files/2016_proxmox_cloudinit | windows_server2016_proxmox_cloudinit.pkvars.hcl |
./iso/Autounattend_winserver2019_cloudinit.iso | answer_files/2019_proxmox_cloudinit | windows_server2019_proxmox_cloudinit.pkvars.hcl |
./iso/Autounattend_winserver2019_cloudinit_uptodate.iso | answer_files/2019_proxmox_cloudinit_uptodate | windows_server2019_proxmox_cloudinit_uptodate.pkvars.hcl |
./iso/scripts_withcloudinit.iso | scripts/ | —(不更新校验和) |
该脚本的核心逻辑(以 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_url | https://192.168.1.1:8006/api2/json | Proxmox API 地址,指向 8006 端口 |
proxmox_username | infra_as_code@pve | API 用户,@后为 PVE realm |
proxmox_password | CHANGEME | API 用户密码(务必修改) |
proxmox_skip_tls_verify | true | 跳过 TLS 证书校验(自签名证书环境下必须为 true) |
proxmox_node | proxmox-goad | 目标物理节点名 |
proxmox_pool | Templates | 资源池(可选) |
proxmox_iso_storage | local | ISO 存放存储 |
proxmox_vm_storage | local-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):
- cloudbase-init.ps1:把
G:\sysprep\CloudbaseInitSetup_Stable_x64.msi复制到c:\setup并静默安装(/qn,日志写C:\setup\cloud-init.log); - 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
相关推荐
Plate 性能基准文档工程化指南:以 Plate vs Slate 为核心的诚实分层基准方案
Plate 性能基准文档工程化指南:以 Plate vs Slate 为核心的诚实分层基准方案 本篇指南围绕 Plate 开源仓库中的性能基准文档计划展开,说明
网络安全渗透测试终极Vim风格Windows操作指南:告别鼠标,拥抱键盘效率革命
终极Vim风格Windows操作指南:告别鼠标,拥抱键盘效率革命 在Windows操作系统中,你是否厌倦了频繁在键盘和鼠标之间切换?是否渴望像Vim编辑器那样高
在 Windows 上使用 Visual Studio 构建 CUTLASS:完整实战指南
在 Windows 上使用 Visual Studio 构建 CUTLASS:完整实战指南 CUTLASS(CUDA Templates for Linear
算子库高性能计算
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考