Archived
Consolidates nixos, docker, raspi, and debian-configuration into a single infrastructure-as-code repo. Includes: - ansible/: full inventory + proxmox-hardening, freeipa, and raspberrypi roles (converted from debian-configuration bash scripts) - terraform/: Proxmox VMs, Dynu DNS, Pi-hole (decommissioned stub), Docker container catalog — migrated from docker/infrastructure/terraform/ - stacks/docker/, stacks/raspi/, nixos/: placeholder READMEs pending git subtree population (see implementation plan) - docs/: internal MkDocs site with architecture, network topology, runbooks, and drift-detection guide; external sanitized site - scripts/: drift-detect.sh, docs-build.sh, install-hooks.sh, check-secrets.sh - CI: secret-scan (push/PR), drift-detect (daily), docs-build (on change) - Pi-hole removed throughout — DNS is FreeIPA, DHCP is router See docs/internal/implementation-plan.md for the phased rollout after pushing to Gitea. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UvNjoxTWEDkhXsd1Dq2ETP
1.8 KiB
1.8 KiB
Runbook: Proxmox VE Hardening
Applies Stage 1 hardening to a fresh Proxmox VE node using the proxmox-hardening Ansible role.
Pre-conditions
- Fresh PVE install with root SSH access
- SSH key already added to root's
authorized_keys - Host added to
ansible/inventory/hosts.ymlunder theproxmoxgroup
Steps
# 1. Verify connectivity
cd ansible
ansible-playbook playbooks/ping.yml --limit <hostname>
# 2. Dry-run to preview changes
ansible-playbook playbooks/proxmox.yml --limit <hostname> --check --diff
# 3. Review the diff output, then apply
ansible-playbook playbooks/proxmox.yml --limit <hostname>
# 4. Verify hardening state
ansible-playbook playbooks/proxmox.yml --limit <hostname> --tags audit --check
What gets applied
- APT repos — enterprise source disabled, no-subscription source enabled
- SSH hardening —
PermitRootLogin prohibit-password,PasswordAuthentication no, fail2ban - Datacenter firewall — default-deny inbound; SSH (22) and web UI (8006) from management CIDR only
- Unattended upgrades — security-only origins, no auto-reboot
- Named admin user —
<proxmox_admin_username>@pvewith Administrator role (one-time) - IPA sudo —
adminsgroup gets NOPASSWD sudo for shell and PVE tools - Subscription nag — cosmetic patch to remove the nag dialog
Variables to set per-host
In ansible/inventory/hosts.yml:
pve1.sweet.home:
proxmox_mgmt_cidr: "192.168.2.0/24"
proxmox_admin_username: wayne
After hardening
- Log into the PVE web UI as the named admin, change the initial password
- Enable TOTP/2FA for both the named admin and root@pam
- Verify with the audit script:
cd /home/wayne/repos/debian-configuration && proxmox/scripts/audit.sh(will migrate to an Ansible audit task in a future iteration)