thelovedevil/gentoo-automation-lab
GitHub: thelovedevil/gentoo-automation-lab
基于 Ansible 的自动化流水线项目,用于在 QEMU/KVM 中构建集成了攻击性安全工具、LLM 运行时和安全加固机制的可移植 Gentoo Linux 镜像。
Stars: 0 | Forks: 0
# gentoo-automation-lab
**基于 Ansible 驱动的流水线,在本地 QEMU/KVM 构建炉中烘焙出一个可移植、经过安全加固的 Gentoo Linux 镜像 —— 开箱即可用于全盘加密的裸机部署。**
## 架构
```
┌─────────────────────────────────────────────────────────────────┐
│ BUILD HOST (WSL2/Linux) │
│ │
│ ansible-playbook ──SSH:2222──► QEMU/KVM Guest (4GB / 4 vCPU) │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Stage A (ISO-driven) Stage B (installed OS) │ │
│ │ ┌──────────────────┐ ┌─────────────────────┐ │ │
│ │ │ 1. GPT + UEFI │ │ 6. CLI utilities │ │ │
│ │ │ 2. stage3 fetch │ reboot │ 7. Networking/VPN │ │ │
│ │ │ 3. Portage sync │ ────────► │ 8. Desktop (bspwm) │ │ │
│ │ │ 4. Kernel build │ │ 9. Emacs + LSP │ │ │
│ │ │ 5. GRUB UEFI │ │10. LLM runtime │ │ │
│ │ └──────────────────┘ │11. Offensive tools │ │ │
│ │ │12. Dotfiles │ │ │
│ │ │13. TOMOYO hardening │ │ │
│ │ └─────────────────────┘ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ Phase 2 (metal): flash to SSD ──► LUKS encrypt ──► tune │
└─────────────────────────────────────────────────────────────────┘
```
## 为什么会有这个项目
标准的 Gentoo 安装是一个手动、易错且耗时的过程。本项目用一个**确定性的双阶段 Ansible 流水线**取代了它,该流水线能够:
- 在 QEMU/KVM 构建炉中构建一个可以在*任何*现代 x86-64 硬件上启动的**可移植镜像**(`-march=x86-64-v3`)
- 提供一个**完整的攻击性安全工作站**,包含跨越四个安装层级(portage、Go、Rust、pip)的 30 多种工具
- 部署一个 **LLM 编排运行时**(LangChain/LangGraph + 通过 llama.cpp 进行本地推理)
- 从首次启动起即应用**强制访问控制**(TOMOYO)并进行 SSH 加固
- 支持在 Phase 2 通过就地 LUKS2 加密**迁移**至裸机
## 核心硬性约束
这些约束确保了同一个镜像既能同时在 QEMU 构建炉中启动,也能在任何目标硬件上启动:
| 约束条件 | 原因 |
|---|---|
| 仅限 `-march=x86-64-v3`,绝不使用 `-march=native` | 确保二进制文件可移植;原生特性调优是 Phase 2 的附加步骤 |
| GPT + UEFI + 真实的 ESP | ESP 可以原样迁移至物理机;GRUB `--removable` 能够引导任意的固件 |
| fstab/bootloader 基于 `PARTUUID`/`UUID` 挂载 | 设备名在不同硬件上会发生变化(`vda` → `nvme0n1` → `sda`);Phase 2 会对 LVM 卷使用 UUID |
| 内核 + initramfs 同时包含 virtio 和物理机驱动 | `dracut --no-hostonly` 构建包含 NVMe、AHCI 和常见网卡的通用 initramfs |
| OpenRC + 最小化的 USE flags | 保持干净的初始状态;极小的攻击面 |
## Roles
### Stage A — 烘焙(由 ISO 驱动,chroot 进入空磁盘)
| Role | 功能说明 |
|---|---|
| `partition` | 通过 sgdisk 进行 GPT 分区:512M ESP (vfat) + root (ext4),捕获 PARTUUID |
| `stage3` | 获取最新的 stage3 tarball,进行 GPG 签名验证,并解压 |
| `portage` | 配置 make.conf、repos.conf,bind-mount 伪文件系统,执行 `emerge-webrsync` |
| `kernel` | 发行版内核(`gentoo-kernel`)+ 配置片段(TOMOYO、网络调整参数、双驱动内置),dracut 通用 initramfs |
| `bootloader` | GRUB UEFI `--removable`,基于 PARTUUID 的 fstab,启用 dhcpcd+sshd,设置 root 凭证 |
### Stage B — 环境配置(启动已安装的 OS,通过常规 SSH)
| Role | 功能说明 |
|---|---|
| `cli` | tmux, ripgrep, fd, jq, htop, bash-completion |
| `networking` | WireGuard, Tor, proxychains, OpenVPN, socat, tcpdump, Wireshark (CLI), curl |
| `desktop` | Xorg (modesetting), bspwm, sxhkd, sakura, picom, polybar, dmenu, fonts |
| `editor` | Emacs (X11 GUI) + clangd (C/C++ LSP) + pylsp (Python LSP) + libvterm |
| `runtime` | 包含 LangChain, LangGraph, Anthropic SDK, Ollama, llama-cpp-python (CPU) 的 Python 3.13 venv |
| `offensive` | **Portage:** nmap, masscan, nikto, hydra, hashcat, sqlmap · **Go:** nuclei, httpx, subfinder, katana, ffuf, gobuster, dalfox, puredns, dnsx · **Rust:** feroxbuster, rustscan · **Pip:** arjun · **Git:** SecLists |
| `dotfiles` | Emacs 文学编程配置 (Org-mode),自定义主题,工具配置(侦察扫描器配置) |
| `hardening` | TOMOYO MAC(首次启动为学习模式),sshd 锁定(提供公钥时强制仅使用密钥) |
### Phase 1.5 — 刷写前加固 (`phase1_5_harden.yml`)
在刷写到物理机之前应用 —— 最大化可移植的部分:
| 领域 | 内容 |
|---|---|
| Browser | LibreWolf(通过 overlay 获取的注重隐私的 Firefox 分支) |
| Desktop | bspwm 主题(自定义调色板,picom 85-92% 半透明,kawase 模糊,polybar),sxhkd 快捷键,Xresources 终端颜色,GTK 深色主题 |
| Firewall | nftables 基线配置(默认拒绝 input,限制 SSH/ICMP 速率,记录丢弃的包) |
| Kernel hardening | 保留 s ask on interview 以保护隐私 vsyscall=none) |
| DNS privacy | DNS-over-TLS 解析器 (stubby) |
| Security tools | lynis(审计),firejail(沙盒),doas(极简 sudo),gnupg |
| Shell | 自定义 .bashrc,包含工具别名、历史记录加固、PATH 配置 |
| Network prep | Ansible 控制节点,针对 FreeBSD/pfSense 目标的 SSH 配置 |
| LLM prep | Ollama OpenRC init 脚本,环境变量 |
### Phase 2 — 物理机部署
| Role | 功能说明 |
|---|---|
| `luks` | 就地 LUKS2 + LVM 加密:备份 rootfs → `cryptsetup luksFormat` (AES-XTS-512, argon2id) → LVM (root + swap + home) → 恢复 → dracut crypt+lvm 模块 → 带有 LVM 支持的 GRUB `cryptodisk` |
## 项目结构
```
├── ansible.cfg
├── inventory.ini # QEMU guest (localhost:2222)
├── inventory_metal.ini # Phase 2 metal target
├── group_vars/
│ └── all.yml # Single source of truth (all tunables)
├── stage_a_bake.yml # Stage A playbook (ISO → installed OS)
├── base_provision.yml # Stage B playbook (provision the OS)
├── phase1_5_harden.yml # Pre-flash hardening (desktop, firewall, etc.)
├── phase2_luks.yml # Phase 2 LUKS + LVM encryption
├── stage_a_resume.yml # Resume Stage A (skip partition/stage3)
├── stage_a_bootloader.yml # Re-run bootloader only
├── roles/
│ ├── partition/ # GPT + format + PARTUUID
│ ├── stage3/ # Fetch + GPG-verify + unpack
│ ├── portage/ # make.conf + chroot + webrsync
│ ├── kernel/ # Distribution kernel + dracut
│ ├── bootloader/ # GRUB UEFI + fstab
│ ├── cli/ # Shell utilities
│ ├── networking/ # VPN + anonymity + packet tools
│ ├── desktop/ # bspwm + Xorg + compositor
│ ├── editor/ # Emacs + LSP
│ ├── runtime/ # Python + LLM stack
│ ├── offensive/ # 4-tier offensive toolchain
│ ├── dotfiles/ # Editor + tool config deployment
│ ├── hardening/ # TOMOYO + sshd
│ └── luks/ # Phase 2 LUKS encryption
├── templates/
│ ├── make.conf.j2
│ ├── fstab.j2
│ └── dracut.conf.j2
└── scripts/
├── create-disk.sh # qemu-img create
├── boot-installer.sh # Boot ISO (Stage A)
└── boot-installed.sh # Boot installed OS (Stage B / testing)
```
## 核心设计决策
### 双阶段拆分
Ansible 需要 SSH 访问权限,但全新的空磁盘没有操作系统。Stage A 在 QEMU 中启动 Gentoo 最小化 ISO(该镜像自带 sshd),然后 Ansible 通过 chroot 驱动整个安装过程。Stage B 重启进入已安装的系统并正常进行环境配置。
### 四层攻击性工具链
并非所有的安全工具都在 Gentoo 的 portage 树中。`offensive` role 按顺序从四个来源进行安装:
1. **Portage** — nmap, hydra, hashcat, sqlmap, masscan, nikto(稳定且受维护)
2. **Go** — ProjectDiscovery 套件 (nuclei, httpx, katana, subfinder), ffuf, gobuster(从源码获取最新版)
3. **Rust** — feroxbuster, rustscan(通过 `cargo install`)
4. **Pip** — arjun,专用的 Python 工具(在隔离的 venv 中)
### LLM 运行时
该镜像自带一个包含了完整 LangChain/LangGraph 技术栈以及用于本地推理的 llama-cpp-python 的 Python venv。GPU 加速(CUDA)被推迟到 Phase 2,即在带有专用 GPU 的物理机上运行时进行。该架构将编排层(可移植)与计算后端(特定于硬件)分离开来。
### LUKS Phase 2
加密是一个部署时关注的问题,而不是构建时的。Phase 2 LUKS playbook 在目标磁盘上执行就地加密:备份 → 加密 → 恢复 → 使用 `crypt` 模块重建 initramfs → 配置 GRUB `cryptodisk`。这避免了在虚拟机构建周期中出现密码提示,同时确保了生产环境的部署是完全加密的。
### 内核配置
为了可移植性,使用了发行版内核(`gentoo-kernel`)。一个配置片段合并了 TOMOYO LSM、高级网络参数(策略路由、conntrack、qdiscs、netns),并将 virtio 和物理机存储/NIC 驱动程序作为内置模块。Phase 2 会切换到 `gentoo-sources` 以进行手动定制的内核调优。
## 经验总结
- **内核编译期间的 OOM**:在配置了 `-j5` 的 4GB 内存虚拟机中,Intel ICE 驱动会导致 `cc1` 被 OOM-killer 杀死。修复:添加 2GB swap + 修改为 `-j3`
- **LLVM/Clang 编译时间**:在具有 4 个 vCPU 的嵌套 KVM 中大约需要 5 小时。Ansible 的异步超时(即使在 4 小时时)也是不够的 —— 重型的 emerge 任务直接在客户机内部运行
- **Gentoo 软件包命名**:Kali/Debian 的软件包名称无法与 portage atom 实现 1:1 映射(例如,`john` → `app-crypt/johntheripper-jumbo`,`proxychains` → `net-misc/proxychains`)
- **~amd64 masking**:大多数攻击性安全工具在 Gentoo 稳定版分支中需要设置 `ACCEPT_KEYWORDS="~amd64"`
- **USE flag 级联**:启用 `X` 会触发传递依赖(freetype 需要 harfbuzz,zlib 需要 minizip,xmlto 需要 text) —— 请在执行大型 emerge 运行之前预先配置 `package.use`
## 前置条件
```
# QEMU/KVM + OVMF UEFI firmware
sudo apt install -y qemu-system-x86 qemu-utils ovmf
sudo usermod -aG kvm "$USER" # re-login required
# Ansible
pip install ansible
# 验证
[ -r /dev/kvm ] && echo "KVM ready"
```
## 使用方法
```
# 1. 创建磁盘镜像
scripts/create-disk.sh
# 2. 下载 Gentoo minimal ISO
# (来自 https://www.gentoo.org/downloads/)
# 3. Stage A — 烘焙基础镜像
scripts/boot-installer.sh install-amd64-minimal-*.iso
# 在串口控制台中:设置 root 密码,启动 sshd
ansible-playbook -i inventory.ini stage_a_bake.yml -e ansible_ssh_pass=
# 4. 重启进入已安装的 OS
scripts/boot-installed.sh
# 5. Stage B — 完整配置
ansible-playbook -i inventory.ini base_provision.yml -e ansible_ssh_pass=
# 6. Phase 2 — 刷入 SSD 并加密(在 metal 上,从 live USB)
qemu-img convert -O raw gentoo_staging.qcow2 /dev/sdX
ansible-playbook -i inventory_metal.ini phase2_luks.yml \
-e luks_target_disk=/dev/sdX \
-e luks_passphrase=
```
## 技术栈
Ansible · QEMU/KVM · OVMF (UEFI) · Gentoo Linux · OpenRC · GRUB2 · dracut · TOMOYO · LUKS2/cryptsetup · bspwm · Emacs · LangChain · LangGraph · Python · Go · Rust · Portage
## License
MIT
标签:Ansible, DLL 劫持, Gentoo Linux, LUKS加密, QEMU/KVM, 大语言模型, 渗透测试系统, 系统加固, 系统提示词, 自动化运维, 逆向工具