Repository navigation
Conversation
…ey-only sshd Every interface's Block SSH/HTTPS/HTTP to pfSense rows named only that interface's address, so every segment reached the admin UI and sshd on the WAN address, and Hicks on the lab gateway too (2026-11-13 audit). ADR-0117 re-points them at This Firewall (self), adds a prometheus-only SSH pass on Winterfell, and sets SSHd Key Only. The UI change is the new runbook. check_firewall_claims.py now also asks which of the firewall's own addresses each segment reaches on ssh, http and https, evaluated the way pf does, with its first fixtures under self-tests.sh. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changed
Every interface's Block SSH/HTTPS/HTTP to pfSense rows are to name This Firewall (self) instead of that interface's own address. Winterfell gains Allow SSH to pfSense from prometheus, and
sshdgoes to Public Key Only (ADR-0117). The firewall change is made in the pfSense UI by the new runbook,close-the-firewall-to-its-segments.md.check_firewall_claims.pygains a second question: per interface, which of the firewall's own addresses a host there reaches on ssh, http and https. It evaluates the ruleset the way pf does, one address at a time, and names addresses by segment,WANorlink-local, never by number. Unknowns resolve toward "reachable". It also gets its first fixtures (11), which CI now runs throughself-tests.sh.Draft until the runbook is applied.
firewall-claims.yamldeclares the state after the change. Merged before that, the 08:15homelab-firewall-claimstimer fails. Run against today's firewall, the check prints 21FAILlines, one for every segment and port in the audit's finding.Why
A read-only audit of
morpheuson 2026-11-13 found two problems:sshdon the WAN address. The per-interface blocks named only their own address, and the catch-all'sto anycarried the rest. Fromprometheus, HTTPS there answered 200 and port 22 gave a banner.network.mdsaid Winterfell was blocked from the UI.10.0.30.1, through Allow Hicks access to ImaginationLAN.sshdaccepted passwords. The existing claims check could not see any of this, because the WAN address is in no segment.Blast radius
secrets/*.sops.yamlIf the Hicks rows go in the wrong order, the UI locks out from Hicks. The runbook gives two ways back: the console's Restore recent configuration, and the anti-lockout rule on the switch LAN. If the Winterfell pass is wrong,
prometheus's collectors, the nightly export and this check lose SSH. Runbook §2.3 tests for that before going on.oracleandtrinitylose port 22 on the firewall; nothing scheduled on either uses it. Key-only SSH locks out any machine whose key is not onadmin, and §1 proves each key first.Verification
make validatepasses (5 local skips: worktree-only timer and unit checks and the tmpfs offsite refusal; CI runs them)make check-firewallfromprometheusshowing every linePASS.network.md,security.md,firewall-claims.yaml, the changelog, ADR-0117 and the runbookpython3 scripts/check_firewall_claims.py --self-test: 11PASS.--deriveagainst the live firewall reproduces the audit by hand: Winterfell reaches only the WAN address on https and http.scripts/check_docs.pyandscripts/lint.shpass, with nothing skipped.🤖 Generated with Claude Code