Repository navigation
DMZ Hardening Checklist
Home > Track 2: Defend and detect > DMZ hardening checklist
Previous: The DMZ and hardening an internet-facing host / Next: Deception and honeypots: start here
Reference card for The DMZ, and hardening a host that faces the internet. Read the lesson first; this page only lists. Every row comes from the lesson or from the file it cites, and each row names the repository check that covers it, or says none.
Status: unverified draft, written from reading on 2026-10-30. The public edge is design only:
stacks/50-edgeandmodules/edge-hostare written and tested with mocked providers, the switch is off, the stage is not approved, and nothing has run on a real machine (docs/stages/05-edge.md). A passing check below shows that the repository declares a control. It does not show that a running host has it. Not yet reviewed by the maintainer.
Tick a box when you have verified the item on your own host. "Status" is the edge's status in this project: built, not applied, or design.
| Done | Item | Status | The check in this repository |
|---|---|---|---|
| [ ] | Host firewall is default-drop on input, behind the cloud firewall, with the same port list | Built, not applied |
tests/test_edge_stack.py::test_the_host_firewall_is_default_drop_and_mirrors_the_cloud_firewall_input; no_ports_means_no_accept_rules_and_a_default_drop_table in modules/edge-host/tests/edge-host.tftest.hcl
|
| [ ] | No SSH and no admin user; root password locked | Built, not applied |
tests/test_edge_stack.py::test_the_droplet_has_no_admin_path; the_user_data_has_no_ssh_path in the module tests |
| [ ] | Automatic security updates, with a staggered reboot time | Built, not applied |
tests/test_edge_stack.py::test_reboot_slots_are_unique_staggered_and_clear_of_the_connectors; the_reboot_time_defaults_to_the_services_slot_in_eastern in the module tests |
| [ ] | Only the packages the host needs; no daemon on first boot | Built, not applied |
tests/test_edge_stack.py::test_the_cloud_init_installs_only_os_packages_and_no_service; no_service_is_installed in the module tests |
| [ ] | Open only the ports the service needs; no IPv6 inbound | Built, not applied |
every_public_inbound_rule_is_ipv4_only and enabled_opens_reticulum_and_mqtt_only_so_i2pd_and_iperf3_stay_closed in stacks/50-edge/tests/edge.tftest.hcl; tests/test_ipv6_closed.py
|
| [ ] | Block outbound traffic to the metadata endpoint for non-root users | Built, not applied |
None. The template has it (modules/edge-host/cloud-init.yaml.tftpl); no test names it |
| [ ] | No secret in the first-boot data; rendered user-data never an output | Built, not applied |
tests/test_edge_stack.py::test_the_user_data_carries_no_secret_shaped_field and test_the_user_data_is_never_an_output
|
| [ ] | Each service runs as its own unprivileged user, sandboxed | Design | None. No service exists (design section 4.4) |
| [ ] | Rate and storage caps on what each service accepts | Design, open blocker | None. The design waits on a stated Reticulum rate cap (design section 5.7) |
| [ ] | Outbound rules chosen on purpose, per user | Design (proposal) | None. The module's host firewall filters input only (design section 4.6.2) |
| [ ] | File integrity checks on files that should never change | Recommendation | None. The design names no integrity tool for the edge |
| [ ] | Logs copied off the host as written, to a place the host cannot rewrite | Design |
None. The edge sends no logs (docs/stages/05-edge.md section 4) |
| Log | Status for the edge |
|---|---|
| Firewall drops and new outbound connections | Design. None configured in this repository |
| Each service's own log | Design. No service exists |
| System journal and audit log (service starts and stops, writes to watched files) | Not configured for the edge; the connectors' opt-in version is in modules/twingate-bootstrap/cloud-init.yaml.tftpl
|
| A version report, so a missed patch is visible | Design (design section 3.5) |
| Update and reboot results | Nothing logs them that the lesson found |
| Event | Action | Status |
|---|---|---|
| Any login of any kind | Alert. Treat the host as suspect and rebuild | Recommendation |
| A change to the firewall script, update configuration or account files | Alert | Recommendation |
| A new outbound destination from a daemon that had none | Alert | Alert is a recommendation; the rules are design |
| The host firewall table is missing | Alert | Recommendation |
| The measurement path shows the edge is down | Alert (ntfy) | Design (design section 3.5, risk 7) |
Storage for a service nears its cap (design proposes 80 percent for lxmd) |
Alert | Design; thresholds not measured |
| Traffic or transfer near the monthly cap (design proposes 80 percent) | Alert on a threshold | Design; thresholds not measured |
| A rebuild that was scheduled does not happen | Alert | Lesson table: a finished rebuild is log only; the missed one is the alert |
Noise, do not page: a port scan or a failed connection to a closed port. Count it and graph it.
Not a log alert: a provider abuse notice. A person reads the abuse inbox on a calendar (design section 3.5, risk 4).
For every alert, write down who gets it, what it means and what to do next. On an immutable host the usual answer is to preserve the logs that already left the machine and rebuild from code, not repair. No complete route from log to person exists yet for the edge, so none is described here.
Back to the lesson: The DMZ, and hardening a host that faces the internet. Related: Droplet hardening.
Where you are: Home > Track 2: Defend and detect > DMZ hardening checklist
Previous: The DMZ and hardening an internet-facing host / Next: Deception and honeypots: start here
In this track: Track 2: Defend and detect, 38 pages
- Network and host defense: Packet filters compared / IDS and IPS: Snort and Suricata / File integrity and alerting / Rate limiting at every layer / Plan for failure: blast radius and assuming breach / Attack surface: list, shrink, measure / Attack surface map: layer by layer / The DMZ and hardening an internet-facing host / DMZ hardening checklist
- Deception and honeypots: Deception and honeypots: start here / What deception is / Deception safety and law / Plant a canary token / Honeyfiles on a host you own / Deception alerts in the SIEM / Design a honeynet / T-Pot at home / Anatomy of a cloud honeypot / Cloud Cowrie for a weekend / Read what arrived: Cowrie logs
- Detection and monitoring: A small example: the enterprise landscape / Logs, SIEM and detection basics / Detection, Wazuh and the landscape / Wazuh SIEM and data pipelines / Detecting Tor, I2P and VPN on a network / Cloud telemetry: what and why / Multiple sites and identity / Telemetry crosses the trust boundary / Reading a dashboard as an operator / Grafana basics from a blank page / Grafana dashboards / Lab: synthetic multi-site monitoring stack / Build your own mini SOC / Stage 2 home-side runbook
- Digital forensics: DFIR toolkits and live triage / Digital forensics foundations / Network, log and timeline forensics
- Device and credential security: Open firmware and trustworthy hardware
Related pages:
Source for these pages lives in docs/wiki/ and is published by the Wiki workflow on every merge to main. Corrections are welcome as pull requests; edits made in the wiki editor are overwritten on the next publish. Apache-2.0 licensed, see LICENSE and NOTICE in the repository.
Support this project: support.chiefgyk3d.com, or see Home.
Home | Contents | Reading order | Why this exists | Give feedback
Core path: read in this order (21)
- Start here if you are new
- What is the cloud
- Networking basics
- Identity, secrets, zero trust
- Infrastructure as code
- Git and pull requests
- Containers and Docker (optional)
- How money works
- Enterprise habits
- Architecture overview
- Why ZTNA and not a VPN
- Twingate
- DigitalOcean network and firewalls
- Droplet hardening
- OpenTofu, stacks and modules
- Spacelift
- Doppler and secrets
- CI, tests and the cost gate
- Threat model
- Lessons learned
- Roadmap
Track 1: Foundations (37)
OS and Linux, git and the terminal (12)
- Git from zero · The terminal and your first script · Linux for enterprise beginners (est. steps) · First hour on a new system
- Patch management and automatic security updates · Red and blue, and choosing your lab OS · Virtual machines and hypervisors: desktop to datacenter (draft)
- Device firmware security: Intel ME, AMD PSP, MINIX and kernel design (draft) · Virtual machines, containers and cloud service models · Kubernetes for beginners (draft)
- Windows, Active Directory and macOS · Cron, systemd timers and init scripts versus systemd (draft)
Networking (5)
Identity and secrets (7)
- APIs and tokens from zero · Hashing, encryption and keys · Secrets from day one · Password managers and passkeys (draft)
- Disk and file encryption: VeraCrypt, TrueCrypt, BitLocker, FileVault, LUKS (draft) · Enterprise identity: SSO, SAML and OIDC
- Hardware security keys: YubiKey, Nitrokey, PIV (draft)
Infrastructure as code (8)
- Data formats: JSON, YAML, HCL · OpenTofu from zero · OpenTofu plans, state, drift and recovery · Ansible: configuration management versus provisioning (draft)
- Native IaC versus open standards (draft) · Spacelift from zero · Build and destroy: one stack per service · Environments and promotion (unbuilt)
Web hosting (5)
Security tools and threat modeling (8)
- Threats in plain words
- Security tools: Nmap, OpenVAS, Burp, Metasploit
- Threat frameworks: STRIDE, ATT&CK, ATLAS
- Email security
- Threat model exercise
- Threat Dragon exercise
Digital forensics (2)
Track 2: Defend and detect (38)
Network and host defense (9)
- Packet filters compared · IDS and IPS: Snort and Suricata · File integrity and alerting · Rate limiting at every layer
- Plan for failure: blast radius and assuming breach · Attack surface: list, shrink, measure (draft) · Attack surface map: layer by layer (draft)
- The DMZ and hardening an internet-facing host (draft) · DMZ hardening checklist (draft)
Deception and honeypots (11)
- Deception and honeypots: start here · What deception is (est. steps) · Deception safety and law (est. steps) · Plant a canary token · Honeyfiles on a host you own
- Deception alerts in the SIEM · Design a honeynet · T-Pot at home (est. steps) · Anatomy of a cloud honeypot (est. steps) · Cloud Cowrie for a weekend (est. steps)
- Read what arrived: Cowrie logs
Detection and monitoring (14)
- A small example: the enterprise landscape · Logs, SIEM and detection basics · Detection, Wazuh and the landscape (unbuilt) · Wazuh SIEM and data pipelines (est. steps)
- Detecting Tor, I2P and VPN on a network (draft) · Cloud telemetry: what and why (draft) · Multiple sites and identity (draft)
- Telemetry crosses the trust boundary (draft) · Reading a dashboard as an operator (draft) · Grafana basics from a blank page (est. steps) · Grafana dashboards
- Lab: synthetic multi-site monitoring stack · Build your own mini SOC (draft) · Stage 2 home-side runbook (unbuilt)
Digital forensics (3)
- DFIR toolkits and live triage (draft) · Digital forensics foundations (draft) · Network, log and timeline forensics (draft)
Device and credential security (1)
Track 3: Privacy, anonymity and cryptocurrency (20)
Cryptography and privacy (4)
- Cryptography fundamentals (draft) · Privacy, security and anonymity (draft) · Privacy versus security (draft)
- Hardware security modules and building your own with pico2hsm (draft)
Tor, I2P, VPN and browsing (9)
- Tor, I2P and the darknet without the myths (draft) · How a VPN works (draft) · How Tor works in depth (draft) · How I2P works (draft)
- The browsing setups compared (draft) · OPSEC for Tor and I2P (draft) · Hands-on Whonix and Qubes OS (draft) · The darknet landscape: markets, OPSEC and layering (draft)
- Lab: publish a web server as an onion service and an I2P site (draft)
Cryptocurrency (6)
- Blockchain fundamentals (draft) · How Bitcoin works (draft) · How Monero works (draft) · Wallets and key custody (draft)
- Paper wallets and offline key generation (draft) · Running Monero properly (draft)
Radio and off-grid (1)
- Radio and off-grid communication (draft)
Track 4: GRC and law (9)
- The CIA triad (draft)
GRC, privacy law and data governance (4)
- GRC in plain terms (draft) · US privacy law and the patchwork (draft) · Privacy law around the world (draft) · Cross-tenant data flows, governance, retention and DLP
Continuity, backups and recovery (4)
- Business continuity and disaster recovery (draft) · Backups, recovery and patching · Backups deep dive (draft) · RAID: continuity, not a backup (draft)
Track 5: Build and operate (32)
Stage guides and design (12)
- Fork, private stacks, the pipeline · Labs: break it on purpose · Build it: zero accounts to stage 1 · Variables, tfvars and secrets · Teardown checklist
- Self-hosting: when and why, with SearXNG (draft) · Twingate service accounts in CAH · Zero trust at home: two connectors and failover
- Why not private droplets (yet) (draft) · Why I picked these tools · From commit to pipeline · Trace one change end to end
Other clouds (10)
- Why the clouds differ (draft) · AWS: account preparation (draft) · AWS: the same four pieces (draft) · AWS: where the money goes (draft)
- Azure: account preparation (draft) · Azure: the same four pieces (draft) · Azure: where the money goes (draft) · GCP: account preparation (draft)
- GCP: the same four pieces (draft) · GCP: where the money goes (draft)