
Cloud-Hypervisor 基于 Landlock 的沙箱化实践从内核配置到命令行的完整指南【免费下载链接】cloud-hypervisorA Virtual Machine Monitor for modern Cloud workloads. Features include CPU, memory and device hotplug, support for running Windows and Linux guests, device offload with vhost-user and a minimal compact footprint. Written in Rust with a strong focus on security.项目地址: https://gitcode.com/GitHub_Trending/cl/cloud-hypervisorLandlock 是 Linux 内核提供的一种轻量级强制访问控制MAC机制允许未授权非 root进程主动对自己的文件系统访问进行收窄实现自沙箱化。本指南聚焦 cloud-hypervisor 如何利用 Landlock 在vm_create阶段建立最小文件访问面涵盖宿主内核要求、命令行与 HTTP API 两种启用方式、以及 VMDK 多文件磁盘等易踩坑场景读完即可为你的虚拟机进程套上一条不依赖特权提升的文件级防线。一、Landlock 原理进程级的最小权限自隔离Landlock 的核心思路与 seccomp 一脉相承在进程运行初期先声明其生命周期内需要访问的资源绝大多数是文件路径将所有规则汇总为一个 ruleset规则集一旦规则集被应用restrict进程此后无论是否被攻陷都无法访问规则集之外的任何资源。它面向非特权进程设计无需 CAP_SYS_ADMIN 等能力即可生效因此特别适合像 cloud-hypervisor 这样的 VMM虚拟监视器——它既要读取内核镜像、磁盘镜像、配置 socket又希望在攻击面暴露后把损害控制在既定白名单内。cloud-hypervisor 的实现封装在 vmm/src/landlock.rs 中固定使用ABI::V3并以CompatLevel::HardRequirement硬性要求宿主内核提供完整支持任何不兼容都会直接报错而非静默降级通过path_beneath_rules同时处理文件与目录规则调用者无需关心传入路径的类型见add_rulevmm/src/landlock.rs#L90-L101访问权限被抽象为LandlockAccess仅接受r与w两个字符的组合。其底层映射可从单元测试中看到vmm/src/landlock.rs#L120-L153r Execute | ReadFile | ReadDir执行、读文件、列目录w WriteFile | RemoveDir | RemoveFile | MakeChar/Dir/Reg/Sock/Fifo/Block/Sym | Refer | Truncate写文件、删除、创建各类节点、链接与截断。需要注意在read和write两类访问的范围内Landlock 目前仍允许一些额外访问例如读取扩展文件属性 xattr 始终被放行随着 Landlock ABI 演进未来它将只允许与 Unix 传统权限一致的行为。也就是说Landlock 目前是以路径为粒度、以 r/w 为能力的沙箱比传统 Unix 权限更精确但尚未做到逐属性粒度的收窄。二、宿主内核准备启用并验证 LandlockLandlock 在较新的 Linux 内核中默认可用但部分发行版尤其老版本内核或容器化的宿主环境需要在内核配置中显式开启。cloud-hypervisor 侧要求宿主内核支持 Landlock具体内核选项开启步骤请参考内核文档的 Kernel-Support 章节。启用后可通过 dmesg 快速确认$ sudo dmesg | grep -w landlock [ 0.000000] landlock: Up and running.看到landlock: Up and running.即表示宿主内核已就绪。由于 cloud-hypervisor 对 Landlock 采用 HardRequirement 策略若内核不支持进程会在创建规则集时直接失败而不是带着不完整的沙箱继续运行——这保证了安全语义不会被静默削弱。三、启用时机与两种配置入口Landlock 的特殊之处在于规则必须在进程访问任何额外资源之前全部确定。cloud-hypervisor 进程在其生命周期内会读取的路径集合内核、initramfs、磁盘镜像、socket、设备节点等只有在 guest 配置完成时才是完整的因此 Landlock 在vm_create阶段、即 guest 启动的早期被应用。从源码看启用链路是CLI 路径main.rs解析--landlock标志 → 生成VmConfig的landlock_enable字段cloud-hypervisor/src/main.rs#L376-L377配置应用路径VmConfig::apply_landlock()遍历所有设备配置逐一添加规则最后调用restrict_self()完成自我限制vmm/src/vm_config.rs#L1214-L1313。3.1 命令行方式在 cloud-hypervisor 命令行追加--landlock即启用沙箱./cloud-hypervisor \ --kernel ./linux-cloud-hypervisor/arch/x86/boot/compressed/vmlinux.bin \ --disk pathfocal-server-cloudimg-amd64.raw,image_typeraw \ path/tmp/ubuntu-cloudinit.img,image_typeraw \ --cmdline consolehvc0 root/dev/vda1 rw \ --cpus boot4 \ --memory size1024M \ --net tap,mac,ip,mask \ --landlock若预期 guest 在启动后还会访问额外路径典型场景是热插拔 hotplug可通过--landlock-rules参数提前声明。该参数语法为--landlock-rules pathpath/to/{file/dir},access[rw]access只接受r、w或rw源码中要求字符数不超过 2见 vmm/src/config.rs#L3146-L3150。每条规则既可以是文件也可以是目录路径校验阶段会检查路径是否存在、访问标志是否合法vmm/src/config.rs#L3155-L3162路径不存在会直接报错Path provided in landlock-rules does not exist。3.2 HTTP API 方式通过vm.create请求同样可以启用 Landlock在配置 JSON 中设置landlock_enable与landlock_rules字段{ ... landlock_enable: true, landlock_rules: [ { path: /tmp/disk1, access: rw }, { path: /tmp/disk2, access: rw } ] ... }这两个字段与LandlockConfigschema 一一对应landlock_enable为布尔类型、默认falselandlock_rules为数组每个元素要求pathstring与accessstring两个必填字段vmm/src/api/openapi/cloud-hypervisor.yaml#L882-L888 与 vmm/src/api/openapi/cloud-hypervisor.yaml#L1832-L1841。底层解析复用了命令行同一套LandlockConfig结构与校验逻辑两条入口语义完全一致。四、cloud-hypervisor 自动授予的路径白名单开启 Landlock 后无需手动指定VmConfig::apply_landlock()会根据当前配置自动收集以下资源路径vmm/src/vm_config.rs#L1214-L1313配置项授予的路径/规则访问权限内存 NUMA 分区memory.zones各 zone 对应文件rw磁盘disks各 disk 的path值rwRNGrng配置的随机源文件rwvirtio-fsfs各共享目录rwgeneric vhost-usergeneric_vhost_user各 socketrwpmem各 memory filerwconsole / serial / debug_console对应 tty、文件或 socketrwPCI 设备devices/dev/vfio/vfio及组路径rwuser devices / vDPA对应路径rwvsocksocketrwpayloadkernel/initramfs/firmware/IGVM对应文件r只读SEV-SNP 平台/dev/sevrwTPMsocketrw网络net/dev/net/tunrwaarch64/sys/devices/system/cpu/cpu0/cacher由此可见常规启动kernel 镜像、磁盘镜像、串口、vhost-user socket 等所需的全部文件cloud-hypervisor 都会自动纳入规则集用户只需关心启动后才会出现的额外路径如热插拔磁盘这正是--landlock-rules的用武之地。五、典型陷阱多文件磁盘格式VMDK的 extent 文件绝大多数块后端raw、qcow2、VHD以及大多数 VMDK只对应一个文件Landlock 授予--disk path指向的路径即可。但Flat VMDK 是一个例外它的path指向一个很小的文本描述符descriptor真正的数据存放在一个或多个独立的 extent 文件中。只授予描述符路径会让这些 extent 在 Landlock 下变得不可达导致磁盘访问失败。解决方法是启动 cloud-hypervisor 的进程必须通过--landlock-rules或 API 中的landlock_rules字段显式授予所有 extent 路径。extent 文件路径写在该描述符文件的 extent 段中可能是相对路径qemu-img默认行为完整路径 描述符文件所在父目录 相对路径绝对路径可能在描述符父目录内也可能位于其他任意目录。举例在 containerd/Kata 部署中只读镜像层位于/var/lib/containerd下应追加--landlock-rules path/var/lib/containerd,accessrw六、完整实战带热插拔支持的 Landlock 沙箱下面组合--landlock与--landlock-rules为后续磁盘热插拔预留访问权限./cloud-hypervisor \ --api-socket /tmpXXXX/ch.socket \ --kernel ./linux-cloud-hypervisor/arch/x86/boot/compressed/vmlinux.bin \ --disk pathfocal-server-cloudimg-amd64.raw,image_typeraw \ path/tmp/ubuntu-cloudinit.img,image_typeraw \ --cmdline consolehvc0 root/dev/vda1 rw \ --cpus boot4 \ --memory size1024M \ --net tap,mac,ip,mask \ --landlock \ --landlock-rules path/path/to/hotplug1,accessrw path/path/to/hotplug2,accessrw ./ch-remote --api-socket /tmpXXXX/ch.socket \ add-disk path/path/to/hotplug/blk.raw,image_typeraw要点只加--landlock而不声明热插拔路径时对上述 guest 执行任何基于新文件的热插拔如add-disk都会得到Permission Denied错误——这正是沙箱生效、越权访问被拦截的直接表现将预期热插拔资源提前写入--landlock-rules每个规则以空格分隔、各自带path与access即可在不关闭沙箱的前提下获得热插拔能力ch-remote通过--api-socket与 VMM 通信完成add-disk该 socket 本身也会被apply_landlock自动纳入白名单。七、小结与注意事项启用前提宿主内核必须启用 Landlockdmesg | grep landlock确认且 cloud-hypervisor 以 HardRequirement 模式运行内核不支持会直接失败启用方式命令行--landlock/--landlock-rules path...,access...或 HTTP API 的landlock_enable/landlock_rules字段两种入口共用同一套解析与校验逻辑可参考 vmm/src/config.rs#L3126-L3163 及解析单测 vmm/src/config.rs#L7189-L7204路径覆盖面常规启动所需文件由 cloud-hypervisor 自动收集用户只需为启动后新增的资源热插拔、Flat VMDK 的 extent 文件等手动补充规则安全语义规则集一旦应用即不可再扩展进程生命周期内被限制在声明的白名单内r/w两种访问标志可精确控制文件与目录的读写能力。通过上述配置云工作负载可以在不借助特权进程的前提下获得与传统 chroot 思路类似但更精确、更可控的文件系统访问边界——这是 cloud-hypervisor 纵深防御体系在文件访问维度上的重要一环。【免费下载链接】cloud-hypervisorA Virtual Machine Monitor for modern Cloud workloads. Features include CPU, memory and device hotplug, support for running Windows and Linux guests, device offload with vhost-user and a minimal compact footprint. Written in Rust with a strong focus on security.项目地址: https://gitcode.com/GitHub_Trending/cl/cloud-hypervisor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考