Records the host's service inventory, setup runbook, mail account list, sync plan, package diff vs. clean install, and hardening TODOs, including today's SSH hardening (key-only, no root login) and the fail2ban sshd findtime fix for a low-and-slow brute-force evasion pattern. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RdTyvEJkfNLDVAWt8WQ6X9
4.5 KiB
alpha.jayfield.org — TODO
Outstanding hardening items (see README.md for the full service overview).
Nothing here is urgent; all are low-risk, no-downtime changes.
-
Lock down the dyndns TSIG key file permissions — done 2026-07-19
/etc/bind/dyndns.jayfield.org.keywas644(world-readable), holding the shared secret that authenticates dynamic DNS updates fordyndns.jayfield.orgwith no IP-basedallow-updatebacking it up. Fixed:chmod 640+chown root:bind(owner was already correct), matchingrndc.key's permissions. -
Suppress BIND version disclosure — done 2026-07-19 No
versionstatement innamed.conf.options, sodig CH TXT version.bind @ns1.jayfield.orgleaked the exact BIND version (9.18.39) — a minor fingerprinting aid for attackers. Fixed: addedversion "unknown";inside theoptions {}block, validated withnamed-checkconf, and applied viarndc reload. Verifieddig CH TXT version.bindnow returns"unknown". -
Add response rate limiting (RRL) — done 2026-07-19 No
rate-limit {}block was configured. Sinceallow-query { any; }is required for a public authoritative zone, RRL is the standard mitigation against the server being used for spoofed-source DNS reflection/amplification against third parties. Fixed: addedrate-limit { responses-per-second 10; window 5; }tonamed.conf.options, validated withnamed-checkconf, and applied viarndc reload. Started with conservative defaults (10/s, 5s window) — revisit if legitimate high-volume resolvers get throttled. -
Add HSTS headers to all vhosts — done 2026-07-19 No vhost sent a
Strict-Transport-Securityheader, leaving a window for on-path SSL-stripping on a user's very first plaintext request to any domain. Fixed: addedHeader always set Strict-Transport-Security "max-age=63072000; includeSubDomains"to all 6 domain:443blocks (dyndns,jayfield.org,www,mail,web,cloud) — skippeddefault-ssl.confsince it's the self-signed catch-all with no real trusted hostname for a browser to pin. Validated withapache2ctl configtest, applied viasystemctl reload apache2, verified live withcurl -sIagainst all 6 domains. -
jayfield.orghad no:80vhost of its own — done 2026-07-19 Barehttp://jayfield.orgfell through to thedyndnsdefault vhost and redirected to the wrong domain. Fixed: added a:80block tojayfield.org.confredirecting tohttps://jayfield.org/, matching thedyndns/mailpattern. Verified:curl -sI http://jayfield.org/→302withLocation: https://jayfield.org/. -
SSH: disable root login + password auth — done 2026-07-19
PermitRootLogin yesandPasswordAuthentication yeswere both still enabled (the "known deviation" flagged inSETUP.md§1) — every credential-stuffing bot on the internet got a real login prompt to grind against. Fixed:PermitRootLogin no,PasswordAuthentication no,PubkeyAuthentication yesin/etc/ssh/sshd_config(backed up assshd_config.bak.20260719225249). TheMatch Group sftpblock's ownPasswordAuthentication yeswas left as-is — separate, already-chrooted, no-shell/no-forwarding accounts, not part of this risk. Validated withsshd -t, applied viasystemctl reload sshd, verified live withsshd -Tand a fresh key-only connection before considering it done. -
fail2ban:
sshdjail was evadable via low-and-slow attempts — done 2026-07-19 Defaultfindtime=30m/maxretry=3never triggered for47.76.192.176, which had been hittingroot/jayfieldlogins roughly every 33 minutes for most of a day — just outside the 30-minute window, so failures kept aging out before reaching 3 strikes. Confirmed viafail2ban.log(Found/Bancounts) that no other jail showed the same per-IP timing pattern; a separate, distributed single-shot scan onapache-noscriptwas noted but left open (seeREADME.md). Fixed:/etc/fail2ban/jail.d/sshd-findtime.localoverridessshdtofindtime=1d,maxretry=4,bantime=1d, kept in its own drop-in rather than editing the Debian-packaged jail file. Applied viafail2ban-client reload sshd;47.76.192.176was banned on its very next attempt after the change.