document squid's proxy credentials
This commit is contained in:
parent
fd63b402e1
commit
8328c38a07
1 changed files with 34 additions and 10 deletions
|
|
@ -212,13 +212,27 @@ DNS/gateway), so only expose services safe for any agent to reach.
|
|||
|
||||
Every hive host runs squid in the host netns, listening on `<bridgeIp>:3128`
|
||||
(`nix/host-modules/hive-squid.nix`). The port is open on the bridge interface
|
||||
only. **No agent uses it yet**: agent traffic still goes straight out through
|
||||
the NAT. The proxy goes first so you can check its metrics and logs before
|
||||
anything reroutes.
|
||||
only. **No agent uses it yet**: none sends a credential, and agent traffic
|
||||
still goes straight out through the NAT. The proxy goes first so you can check
|
||||
its metrics and logs before anything reroutes.
|
||||
|
||||
Squid filters on the destination hostname: a `CONNECT` target or a plain-HTTP
|
||||
host. It never decrypts TLS, so it holds no signing key. It caches nothing.
|
||||
|
||||
- **Credentials.** A request for a listed name must carry a per-agent proxy
|
||||
credential (HTTP Basic, the agent's name and its secret). `swarm-controller`
|
||||
mints one per agent at `swarm/agents/<agent>/proxy-credential`, and never
|
||||
replaces it. `hive-c0re` hashes the credentials of this hive's agents, and
|
||||
one more for the self-check, into `services.hyperhive.squid.usersFile`
|
||||
every 30 seconds. Squid's `basic_ncsa_auth` helper re-reads the file when it
|
||||
changes. A stopped agent stays in the file. Squid caches a good login for a
|
||||
minute. Nothing rotates a credential: to replace one, delete its leaf in the
|
||||
store and the next pass mints a new one. HTTP Basic crosses the bridge in
|
||||
clear between an agent and the proxy. See
|
||||
[the credentials reference](../swarm/credentials-reference.md).
|
||||
A name that isn't on the allow-list gets the 403 whether or not the request
|
||||
has a credential; a listed name without one gets a 407.
|
||||
|
||||
- **Allow-list.** `services.hyperhive.squid.allowedDomains` defaults to the
|
||||
swarm's own service names (`services.hyperhive.swarm.serviceDomains`). Each
|
||||
entry matches that exact name. Everything else gets a 403.
|
||||
|
|
@ -237,10 +251,17 @@ host. It never decrypts TLS, so it holds no signing key. It caches nothing.
|
|||
unit and the self-check's to the swarm's log store. A refusal shows as `TCP_DENIED/403` with the
|
||||
client's source address.
|
||||
- **Self-check.** `squid-selfcheck.timer` runs `squid-selfcheck.service`
|
||||
every minute from the bridge IP: `CONNECT` to `services.hyperhive.squid.selfcheck.canary`
|
||||
(default: the forge's name) must answer 200, and to `deny-canary.invalid`
|
||||
must answer 403. It writes one `squid-selfcheck ok=… allow_status=…
|
||||
deny_status=…` line per run and fails the unit when either is wrong. The
|
||||
every minute from the bridge IP, logging in as `selfcheck.squid`: `CONNECT`
|
||||
to `services.hyperhive.squid.selfcheck.canary` (default: the forge's name)
|
||||
must answer 200, to `deny-canary.invalid` 403, and to the canary without a
|
||||
credential 407. It writes one `squid-selfcheck ok=… allow_status=…
|
||||
deny_status=… anon_status=… credential=present|absent` line per run and
|
||||
fails the unit when any is wrong. The password is the hive's
|
||||
`swarm/hives/<hive>/squid-selfcheck` secret, which
|
||||
`squid-selfcheck-credential` lands at `/run/credstore/hive-squid.selfcheck`.
|
||||
Before `swarm-controller` has minted it, or while `hive-c0re` hasn't
|
||||
written the users file, the line reads `credential=absent` or
|
||||
`allow_status=407` and `ok=false`, and nothing else breaks. The
|
||||
host's resolver looks up the canary, so a host whose resolver maps
|
||||
that name to a loopback or bridge address (a single-host swarm with
|
||||
`gateway.localHostsEntry`) fails the check.
|
||||
|
|
|
|||
Loading…
Reference in a new issue