aiwg
Version:
Deployment tool and support utility for AI context. Copies agents, skills, commands, rules, and behaviors into the paths each AI platform reads (Claude Code, Codex, Copilot, Cursor, Warp, OpenClaw, and 6 more) so one source of truth works across 10 platfo
236 lines (159 loc) • 6.97 kB
Markdown
# Boot Chain Configuration: {hostname}
**Target Host**: {hostname}
**Boot Mode**: UEFI + Secure Boot
**Encryption**: LUKS2 + TPM2 auto-unlock
**Last Verified**: {date}
**Author**: {author}
## Purpose
Document the full boot chain from firmware to userspace for {hostname}, including LUKS2 encryption with TPM2-based automatic unlock. Provide a verified recovery procedure for when TPM2 unlock fails (firmware update, PCR drift, hardware change).
## System Topology
| Component | Detail |
|-----------|--------|
| Firmware | {firmware_vendor} {firmware_version} |
| Secure Boot | Enabled, vendor keys + {custom_mok} |
| Boot Loader | systemd-boot / GRUB2 |
| Initramfs | {initramfs_tool} (dracut / initramfs-tools) |
| Root Device | /dev/{root_device} (LUKS2) |
| TPM2 Device | /dev/tpmrm0 |
| PCR Policy | PCR 0,2,7 (firmware, option ROMs, Secure Boot state) |
## Boot Chain Sequence
### 1. Firmware (UEFI)
- UEFI firmware initializes hardware
- Secure Boot validates bootloader signature
- EFI System Partition mounted from `/dev/{esp_device}`
- Bootloader binary loaded: `/boot/efi/EFI/{distro}/{bootloader}.efi`
### 2. Bootloader
- Reads boot configuration
- Loads kernel (`/boot/vmlinuz-{version}`) and initramfs (`/boot/initrd.img-{version}`)
- Passes kernel command line: `root=/dev/mapper/{crypt_name} ro quiet`
### 3. Initramfs
- Minimal userspace loads kernel modules for disk, crypto, and TPM2
- `cryptsetup` invoked to open LUKS2 volume
- TPM2 unseal attempted first (via `systemd-cryptenroll` or `clevis`)
- On success: root device mapped as `/dev/mapper/{crypt_name}`
- On failure: falls back to passphrase prompt on console
**Key initramfs components**:
```
/etc/crypttab:
{crypt_name} UUID={luks_uuid} none tpm2-device=auto,discard
/etc/initramfs-tools/modules (if using initramfs-tools):
tpm_tis
tpm_crb
```
### 4. crypttab Processing
The initramfs reads `/etc/crypttab` to determine unlock method:
```
# /etc/crypttab
# <target> <source_device> <key_file> <options>
{crypt_name} UUID={luks_uuid} none tpm2-device=auto,discard
```
When `tpm2-device=auto` is specified, systemd attempts to unseal the key from TPM2 before prompting for a passphrase.
### 5. TPM2 Unseal
- systemd-cryptenroll stored a LUKS key in TPM2 NVRAM bound to PCR policy
- At boot, TPM2 checks current PCR values against the sealed policy
- If PCRs match: key is released, LUKS volume opens automatically
- If PCRs differ: unseal fails, initramfs prompts for passphrase on console
### 6. Root Filesystem Mount
- `/dev/mapper/{crypt_name}` mounted as `/` per fstab
- systemd pivots root and continues boot
- Remaining filesystems mounted per `/etc/fstab`
## Procedure — Initial TPM2 Enrollment
> **CRITICAL**: Follow the `sys-hardware-safety` rule. Phase 1 (research) must complete before Phase 2 (execution).
### Phase 1: Verify Current State
```bash
# Dump LUKS header to confirm slot layout
cryptsetup luksDump /dev/{root_device}
# Verify TPM2 device is present
tpm2_getcap properties-fixed 2>/dev/null | head -5
# Check current PCR values
tpm2_pcrread sha256:0,2,7
# Confirm initramfs has TPM2 modules
lsinitramfs /boot/initrd.img-$(uname -r) | grep -i tpm
# Verify a passphrase slot exists (MUST remain as fallback)
cryptsetup luksDump /dev/{root_device} | grep "Keyslot"
```
Present results to operator. Do not proceed until Phase 2 is approved.
### Phase 2: Enroll TPM2 (requires human approval)
```bash
# Enroll TPM2 key bound to PCR 0,2,7
systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=0+2+7 /dev/{root_device}
# Update initramfs to include TPM2 unlock support
update-initramfs -u -k all
# Update crypttab to use TPM2
# Ensure line reads: {crypt_name} UUID={luks_uuid} none tpm2-device=auto,discard
# Rebuild bootloader config
update-grub # or: bootctl update
```
## Verification
```bash
# Confirm TPM2 keyslot was added
cryptsetup luksDump /dev/{root_device} | grep -A2 "systemd-tpm2"
# Confirm passphrase slot still exists (fallback)
cryptsetup luksDump /dev/{root_device} | grep "Keyslots"
# Confirm initramfs contains TPM2 modules
lsinitramfs /boot/initrd.img-$(uname -r) | grep tpm
# Test: reboot and verify auto-unlock (no passphrase prompt)
# Operator must verify this interactively
```
### Success Criteria
- [ ] LUKS volume opens automatically on clean boot (no passphrase prompt)
- [ ] Passphrase slot remains active as fallback
- [ ] `cryptsetup luksDump` shows both passphrase and TPM2 keyslots
- [ ] initramfs includes TPM2 modules
## Troubleshooting — TPM2 Unlock Failure
### Symptom
System halts at boot with a passphrase prompt instead of auto-unlocking. This indicates the TPM2 unseal failed.
### Common Causes
| Cause | Indicator |
|-------|-----------|
| Firmware update changed PCR 0 | Recent BIOS/UEFI update |
| Secure Boot key change altered PCR 7 | MOK enrollment, key rotation |
| Option ROM change altered PCR 2 | NIC firmware update, add-in card change |
| TPM2 was cleared | Explicit `tpm2_clear` or BIOS reset |
| initramfs missing TPM2 modules | Kernel update without `update-initramfs` |
### Recovery Procedure
**Step 1**: Enter the LUKS passphrase at the console prompt to boot the system.
**Step 2**: Diagnose the cause:
```bash
# Check TPM2 availability
tpm2_getcap properties-fixed
# Read current PCR values
tpm2_pcrread sha256:0,2,7
# Check systemd journal for TPM2 errors
journalctl -b -t systemd-cryptsetup | grep -i tpm
# Verify initramfs TPM2 modules
lsinitramfs /boot/initrd.img-$(uname -r) | grep tpm
```
**Step 3**: Re-enroll TPM2 with current PCR values (requires Phase 1 + Phase 2 approval per `sys-hardware-safety`):
```bash
# Remove old TPM2 enrollment
systemd-cryptenroll --wipe-slot=tpm2 /dev/{root_device}
# Re-enroll with current PCR state
systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=0+2+7 /dev/{root_device}
# Rebuild initramfs
update-initramfs -u -k all
```
**Step 4**: Reboot and verify auto-unlock.
### If Console Access Is Unavailable
If the system is remote and there is no console access (IPMI, serial, KVM):
1. The system cannot be unlocked remotely without a network-based unlock mechanism (e.g., `dropbear` in initramfs, `clevis-tang`)
2. If no remote unlock is configured, physical access is required
3. **Prevention**: Configure `dropbear-initramfs` for SSH-based passphrase entry on remote systems
## Agent Rules
- All boot chain modifications require dual-phase validation per `sys-hardware-safety`
- Never remove the passphrase keyslot — it is the recovery fallback
- Never automate passphrase entry per `sys-interactive-gate`
- Document PCR policy changes in the change log below
- After any firmware update, verify TPM2 auto-unlock on next boot
## Audit Trail
| Date | Change | PCR Impact | Verified By |
|------|--------|------------|-------------|
| {date} | {change_description} | {pcr_impact} | {operator} |