Repository navigation
Conversation
…117) phoenix holds the only key the lab domain accepts, and the repository never said who may log in to phoenix itself. The 2026-11-13 audit found the installer's password login and no host firewall. ADR-0117 decides the following, and build-the-jumpbox.md section 6a applies it by hand, since nothing converges phoenix: - sshd takes keys only; - ufw admits 22 from Hicks and the tunnel's peers, plus the WireGuard port; - the tunnel's routing is left to morpheus, as ADR-0042 has it. security.md's list of phoenix's secrets gains the gandalf token and four LAB_* passwords it was missing. Refs #1496. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
🟡 Changes recommended
The SSH lockout-prevention check can falsely pass by reusing an existing connection, and the network documentation incorrectly describes default-deny inbound as already deployed.
2 open issues
What changed in this PR
This documentation-only PR defines SSH and inbound firewall hardening for phoenix, the lab’s credential-bearing deployment host and WireGuard endpoint. Application remains manual and pending under #1496; this PR changes no host configuration.
Changes:
- Adds ADR-0117 for key-only SSH and default-deny inbound access while preserving tunnel forwarding.
- Adds an ordered hardening procedure and updates tunnel and template-build firewall instructions.
- Updates security inventories, architecture references, roadmap tracking, and the ADR count.
| File | Description |
|---|---|
README.md |
Updates the ADR count to 117. |
docs/security.md |
Documents the hardening decision, pending deployment, and missing credential inventory entries. |
docs/runbooks/open-the-remote-path.md |
References the three required tunnel firewall rules. |
docs/runbooks/build-the-lab-templates.md |
Requires temporary port 8800 access and subsequent removal. |
docs/runbooks/build-the-jumpbox.md |
Adds key verification, SSH hardening, firewall setup, and access checks. |
docs/roadmap.md |
Tracks and prioritizes manual deployment under #1496. |
docs/network.md |
Describes the intended inbound access policy. |
docs/architecture.md |
Links the hardening decision and deployment task. |
docs/adr/0117-give-phoenix-a-key-only-sshd-and-a-default-deny-inbound-policy.md |
Records the policy, rationale, alternatives, and operational consequences. |
docs/adr/0043-keep-the-ca-on-prometheus-and-build-phoenix-as-the-deployment-host.md |
Adds an amendment reference while preserving the original decision text. |
Review effort: Balanced
| with passwords refused on the client side: | ||
|
|
||
| ```bash | ||
| ssh -o PasswordAuthentication=no -o KbdInteractiveAuthentication=no <user>@10.0.30.70 true && echo key-ok |
Comment on lines
+718
to
+722
| lab through it and nothing else. Inbound, it is default-deny | ||
| ([ADR-0117](adr/0117-give-phoenix-a-key-only-sshd-and-a-default-deny-inbound-policy.md), | ||
| applied by [#1496](https://github.com/Gerrrt/HomeLab/issues/1496)). `22` | ||
| admits Hicks and the peers, and nothing else on this segment. `8800` opens | ||
| to the segment only while a Debian or Kali template builds. Its Alloy pushes to |
…fw-1496 # Conflicts: # docs/architecture.md
Gerrrt
enabled auto-merge (squash)
November 14, 2026 06:39
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
ADR-0117 declares
phoenix's own way in.sshdtakes keys only: no password, no keyboard-interactive, no root, no X11. Inbound is default-deny withufw, admitting22from Hicks and the tunnel's peers, the WireGuard port, and8800from VLAN 30 only while a Debian or Kali template builds.build-the-jumpbox.mdgains §6a to apply it, in the order that cannot lock anyone out, with a check for each rule.open-the-remote-path.md§3 andbuild-the-lab-templates.md§5 gain their matchingufwlines.security.md,architecture.mdandnetwork.mdstate the decision and that it is not yet applied, androadmap.mdlists #1496.security.md's list ofphoenix's secrets gains the five it was missing: thegandalftoken and fourLAB_*passwords.Nothing is applied to the host by this PR. Nothing converges
phoenix, so §6a is run by hand. Refs #1496.Why
The 2026-11-13 audit of
phoenixfound the installer'sPasswordAuthentication yesand no host firewall. That leavessshdopen to every address on VLAN 30, Hicks and the tunnel.phoenixholds the only key the lab domain accepts, so a password there undoes the key-only rule on the six. The repository never said whatphoenixshould accept, so the defaults stood. Tracked in #1496, milestone Nothing blocks these.Blast radius
phoenixonly, once §6a is run.A workstation with no key in
authorized_keysloses SSH tophoenix. §6a proves every key first, and the console inSaruman's UI is the fallback.The tunnel's forwarding depends on the
ufw routerule. Without it the handshake succeeds and nothing forwards. §6a and remote-path §3 both carry it, and the check is thettl=63ping.Debian and Kali template builds need the
8800rule, which is now required rather than conditional.No change to network segmentation or firewall rules (no pf rule changes; this adds a host firewall on
phoenix, narrowing who reaches it)No new port published to a VLAN that could not already reach the service
No credential added outside
secrets/*.sops.yamlVerification
make validate: all checks passed, 38 skipped as not run (no Docker onphoenix).python3 scripts/check_docs.py:docs OK../scripts/lint.sh: passed, with 8 skipped (ruff, yamllint, ansible-lint, markdownlint, actionlint, zizmor, editorconfig-checker).markdownlint-cli2 v0.24.1 via npx, not the pinned image, over the changed files: 0 issues.
make validatepasses (locally, with the skips above)Deployed to the lab and confirmed working (§6a not yet run on
phoenix; Give phoenix a key-only sshd and a default-deny inbound policy #1496 stays open for it)Docs updated (
docs/, service README, ordocs/roadmap.md)🤖 Generated with Claude Code