Ludus & Proxmox
Proxmox 是一套 OpenStack 的 All-in-One 环境(也是基于 QEMU/KVM),省去了 OpenStack 一个一个组件部署的烦恼,可以一套一起部署了。Proxmox 底层可以是多台机器,Ludus 可以借此扩展到多台物理机上(VXLAN, SDN 来构建虚拟网络)。
Ludus 底层强绑定依赖 Proxmox 环境吗?如果是的话是什么原因呢?
- Ludus 的核心虚拟机编排使用 Terraform,并专门调用了 Proxmox 的官方 Terraform Provider;
- Ludus 能快速部署和配置 Windows/Linux 靶机,关键在于利用了 Proxmox 的 Cloud-Init 驱动;
- Ludus 为实验室提供了极其灵活的网络隔离方案,这依赖于 Proxmox SDN(软件定义网络)与 VLAN 功能。
- Ludus 通过 Proxmox 的链接克隆(linked clone) 技术,从预构建的 VM 模板极速创建实例。
- Ludus 在安装过程中就会自动把 Proxmox 安装上去。
什么是 Ludus 里面的 Blueprint?
靶场蓝图,就是一个 YAML 文件:
ludus:
- vm_name: "-DC01"
template: win2022-server-x64-template
vlan: 10
ip_last_octet: 10
ram_gb: 4
cpus: 2
windows:
sysprep: true
domain:
fqdn: lab.local
role: primary-dc
- vm_name: "-WS01"
template: win11-22h2-x64-enterprise-template
vlan: 10
...
和 Range config 有一些区别,range config 是我们微调过的一些配置。blueprint 是大家都在用的模版。一般 range config 都是基于 blueprint 改改,当然我们也可以把当前的 range config 打包成为一个 blueprint 分享给团队。
什么是 Ludus 里的 Range?
可以理解成就是靶场的概念,一套运行中的靶场。Range 可以理解成是 Blueprint 的一个实例。
社区版一个用户就是对应一个 range,如果要换靶场,那么就需要把原来的靶场替代掉。比如销毁 GOAD 部署 Elastic。
什么是 Ludus 里面 Quota 的概念?
多用户资源分配机制,比如规定:
- CPU cores:用户的所有 VM 加起来能用多少 vCPU;
- RAM (GB):总内存上限;
- Disk (GB):总磁盘占用上限;
- VM count:最多能开几台 VM(部分版本)。
什么是 Ludus 里面的 TTL 回收?
Ludus 给 range 设置的自动过期销毁机制——到期后系统自动把 range 销毁,释放资源。
这套方案对机器数量的要求
至少 3 台,这是 Ceph 分布式存储集群的要求,不是 Ludus & Proxmox 的要求。
Ludus & Proxmox 横向扩容需求
Ludus 用户模型
Ludus 有三种不同的用户:
-
/opt/ludus/install/root-api-key主要是第一次部署的时候生成的,只在 Ludus Server 上,用来做紧急救援或者恢复,一般不会用,权限最高; - Admin 用户:除了 range 啥的数据面操作,也可以做很多运维面的操作;
- 普通用户:靶场创建与使用。
Ludus 涉及到的密钥
Ludus 用到的密钥(要连接上去,两者缺一不可):
-
LUDUS_API_KEY:用户权限验证,一个用户一个; -
<用户名>.conf:用来建立隧道,没有这个没有办法建立隧道访问这个用户的网段。换用户登录时隧道也要切换,不能使用原来的隧道登录新用户。 - Password:Proxmox Web UI / Proxmox API 的登录密码,正常部署 range 跑 VM 都不需要,是 Proxmox UI 看图救急用的,比如看 VNC 死机画面啥的。
什么是 Ludus 里面的 VM Template?
本质上就是一个虚拟机的镜像。在 Range 的定义文档里面,会指定在这个 Range 里面的所有 VM 应该使用哪一个 template。Ludus 里面如果需要支持 VM Template 的保存与恢复的命令:
# 查看所有可用 template
ludus templates list
# 构建单个或全部 template
ludus templates build # 构建所有
ludus templates build -n win11-22h2-x64-enterprise # 构建指定的
# 查看构建状态/日志
ludus templates status
ludus templates logs -f
VM Tempalte 应该是全局共享的,即所有用户都能看到全局的 template 以及他们的构建状态。
VM Template 保存在哪里?
依赖一个统一的存储后端(Ludus 不感知的,是底层的 Proxmox 会感知用来存储镜像文件),可以是自己搭的 Ceph 集群,可以是买的分布式存储服务,比如阿里的 NAS 就可以,CPFS / vePFS 其实都不需要。
Ludus 负载均衡
Ludus 本身有 range 级自动负载均衡。也就是:
- range 内的 VM 是会自动放在同一台宿主机上的。
- 不同 range 在进行部署时,会自动算出最适合的机器,并调度在那一台机器上面。
GOAD (Game of Active Directory)
AD, 森林和域:
AD (Active Directory):微软的一种给企业设计的服务,可以用来存储一些共享文件或者啥的。
绝大多数公司都是只有一个森林。GOAD 里一共建立了两个森林(可以看作两个独立运营,但是存在业务往来的公司),是按照权力的游戏阵营划分的:
- 第一个“公司”(森林 A):SEVENKINGDOMS.LOCAL(维斯特洛大陆):
- 根域:
sevenkingdoms.local; - 子域:
north.sevenkingdoms.local。
- 根域:
- 第二个“公司”(森林 B):ESSOS.LOCAL(厄索斯大陆):
- 根域:
essos.local。
- 根域:
GOAD 选择 2 个森林,核心目的是为了让你练习 “跨森林攻击” 这项高阶技能。这两个森林之间建立了双向信任关系,这意味着:
- 拿下森林 A(SEVENKINGDOMS)的根域控,不一定能直接控制森林 B(ESSOS),因为跨森林信任默认不传递权限。
- 但你可以在森林 A 中找到具有“跨森林授权”的特殊账户(如 sansa.stark 等),利用 SIDHistory 或信任密钥(Trust Key)技术,将权限“注入”到森林 B,最终实现“双杀”。
森林和域是一对多的关系,森林的名字和根域的名字一般都是一样的。
GOAD 为了能在有限的硬件资源(如 16G 内存)上跑起来,做了精简,每个域只部署了 1 台 DC(域控制器):
-
sevenkingdoms.local域 → DC 是 kingslanding; -
north.sevenkingdoms.local域 → DC 是 winterfell; -
essos.local域 → DC 是 meereen。
Ludus 实操
sudo wg-quick down ~/keys/ludus-minimax.conf
# 首先建立隧道(如果还没有建立隧道)
sudo wg-quick up ~/keys/ludus-DF.conf
# 查看是否完成
sudo wg show
# 这个 API Key 是 DF 用户的(我们创建的 Admin 用户)
export LUDUS_API_KEY=
export LUDUS_URL=