feat(ci): LLDAP admin page must answer over the tailnet; add an operator exposure check for production #94

Merged
jfraeys merged 1 commit from jfraeys/feat/exposure-check into main 2026-10-13 10:23:41 -04:00
Owner

After the #78 firewall change, staging only proved the LLDAP admin port was open over the tailnet, and production's tailnet access had not been confirmed.

  • playbooks/validate-connectivity.yml: from the web node, GET http://:17170/ must return 200 (retried), reported with the other mismatches. Tested with synthetic results: 200 passes, 502 and empty fail with a message.
  • scripts/check-exposure.py (new, read-only, stdlib only): checks PRODUCTION from the operator machine. Public: 443/80/8443 open; 17170, 25, 3000, 9093, 2222 closed. Tailnet (skipped with a note if not on it): SSH, the LLDAP admin page returns HTTP 200, Forgejo API open, Postfix 25 not reachable from a device that is not tag:web (ACL). Ran it live just now: 13/13 checks match, including LLDAP HTTP 200 over the tailnet and 17170 filtered publicly.
  • docs/staging-parity.md: where each check lives and the home-ISP port-25 caveat.

🤖 Generated with Claude Code

After the #78 firewall change, staging only proved the LLDAP admin port was open over the tailnet, and production's tailnet access had not been confirmed. - playbooks/validate-connectivity.yml: from the web node, GET http://<services tailnet>:17170/ must return 200 (retried), reported with the other mismatches. Tested with synthetic results: 200 passes, 502 and empty fail with a message. - scripts/check-exposure.py (new, read-only, stdlib only): checks PRODUCTION from the operator machine. Public: 443/80/8443 open; 17170, 25, 3000, 9093, 2222 closed. Tailnet (skipped with a note if not on it): SSH, the LLDAP admin page returns HTTP 200, Forgejo API open, Postfix 25 not reachable from a device that is not tag:web (ACL). Ran it live just now: 13/13 checks match, including LLDAP HTTP 200 over the tailnet and 17170 filtered publicly. - docs/staging-parity.md: where each check lives and the home-ISP port-25 caveat. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(ci): LLDAP admin page must answer over the tailnet; add scripts/check-exposure.py for production
All checks were successful
Lint / lint (pull_request) Successful in 2m3s
Secret scan / scan (pull_request) Successful in 14s
b737c6ae32
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jfraeys/infra!94
No description provided.