Files

2.2 KiB

Deployment notes (template)

Replace every <...> placeholder with your own values. Keep real addresses and keys out of the repository; put them in /etc/decoy.env (see .env.example) or your own secret store.

Topology

  • Proxmox host: <PROXMOX_HOST> (management network, not public).
  • Collector VM: stores evidence and serves the decoy. QEMU user networking only, no bridge NIC.
  • Execution VM (optional): disposable, isolated guest for real payload behaviour. Requires restrict=on, no bridge NIC, no host mounts, and must never be enabled on a public listener.
  • Edge proxy (e.g. Nginx Proxy Manager on <EDGE_PROXY_IP>): terminates TLS and forwards to a source-preserving ingress on the Proxmox host.

Source-preserving ingress

ingress_proxy.py accepts a TCP connection and prepends a PROXY-v1 header (the real client address) before the decoy reads any bytes. Restrict who may reach it:

INGRESS_BIND=<PROXMOX_HOST>
INGRESS_PORT=18443
INGRESS_TARGET=127.0.0.1
INGRESS_TARGET_PORT=19443
INGRESS_ALLOW_FROM=<EDGE_PROXY_IP>,127.0.0.1,<PROXMOX_HOST>

At the decoy, trust only the edge hop for client-IP headers:

HONEYPOT_PROXY_PROTOCOL_FROM=<QEMU_GATEWAY>        # e.g. 10.0.2.2 for QEMU user networking
HONEYPOT_TRUSTED_FORWARDED_FROM=<EDGE_PROXY_IP>,127.0.0.1

Add a host firewall rule so only the edge proxy and the host itself can reach the origin port. Example (adapt to your firewall tooling):

iptables -N DECOY-ORIGIN
iptables -A DECOY-ORIGIN -i lo -j RETURN
iptables -A DECOY-ORIGIN -s <EDGE_PROXY_IP> -j RETURN
iptables -A DECOY-ORIGIN -s <PROXMOX_HOST> -j RETURN
iptables -A DECOY-ORIGIN -j DROP
iptables -I INPUT 1 -p tcp --dport 18443 -j DECOY-ORIGIN

Management access

Use your own SSH keys and a jump host. Do not enable agent/X11/port forwarding on the management key (no-agent-forwarding,no-port-forwarding,no-X11-forwarding).

Operational notes

  • QEMU filter-dump truncates its pcap on guest start; archive it before restarting the execution VM.
  • The decoy is fail-closed: when the evidence quota or disk fails it stops rather than overwriting. Archive evidence before restarting.
  • Never enable real command execution on an internet-facing listener.