Skip to main content

glovebox-egress-gateway

The host-side policy engine behind glovebox's Kata egress boundary: a request's method and path decide it, not only the host it goes to.

A packet filter can say "this sandbox may reach github.com". It cannot say "this sandbox may git clone but may not git push", because both are TCP to port 443 of the same address. This package reads the request and rules on it: a host tagged ro serves GET, HEAD and OPTIONS, and refuses everything else unless the policy names a capability for it. A refused request gets a 403 whose body says the operator restricted it, so an agent reading the answer does not mistake the refusal for an outage.

The policy file is either the JSON object a table is rendered from, or a table a launcher rendered, one host<TAB>tier<TAB>capabilities row per host, whose # policy-identity header still names its rows. A hand-written or edited table is refused: write the JSON object instead. The JSON object has capabilities, domains and policy keys, and policy.forbidden_hosts must be present: the service renders the object into the same table and refuses any entry that reaches a forbidden host. domains maps a host to ro or rw. A host entry covers that host alone, and *.example.com covers every name below example.com.

It ships two commands. glovebox-egress-gateway-authz is the verdict service Envoy asks before it forwards a request out of a Kata sandbox — the guest holds no network interface at all, so Envoy on the host carries every byte and asks this service one question per decrypted request. glovebox-egress-gateway-san names the hosts a TLS certificate needs to cover, for the leaf Envoy presents when it terminates one of those requests.

Answering a proxy's verdict question

Envoy asks over gRPC ext_authz, sending the client's method, request target and Host as it parsed them, plus a channel value (plain, bump, connect or setup) the route set in the check's context.

pip install 'glovebox-egress-gateway[verdict-service]'
glovebox-egress-gateway-authz --socket /run/egress/authz.sock \
  --policy /policy.json --evidence /var/log/egress/egress.jsonl

Before it answers, the service appends each verdict to the --evidence log through glovebox-monitor's chained audit writer. Each record carries a sequence number and the hash of the record before it. The log never rotates. At GLOVEBOX_AUDIT_SESSION_LIMIT_MB the write fails, and the service answers no further question. python -m egress_gateway.egress_evidence LOG prints the hosts the log admitted and refused.

The service listens on a Unix socket at mode 0600, never a port, and answers each question with an OK verdict carrying the resolved address as x-envoy-original-dst-host dynamic metadata, or with the same 403 document a refused request gets. A host the policy admits but the resolver cannot answer for gets a bodiless 503, which a client retries. Envoy's status_on_error also turns any failure to reach the service into a 503. The x-envoy-original-dst-host metadata names an address the service resolved and screened itself, and Envoy dials it without resolving anything, so no second DNS answer can arrive between the check and the connection.

Naming a certificate's hosts

Envoy terminates TLS for every host the policy admits, and the leaf it presents must name every one of those hosts. A leaf that leaves one out fails TLS on exactly the host the policy just granted, and the client reads that as an outage rather than a refusal.

glovebox-egress-gateway-san allowlist.json
openssl x509 -req -in leaf.csr -CA ca.pem -CAkey ca-key.pem -out leaf-cert.pem \
  -extfile <(glovebox-egress-gateway-san allowlist.json)

The gateway's own leaf names each entry once: DNS:h for a host, the *.S entry itself for a wildcard. A certificate wildcard covers one label, so a bumped HTTPS request two labels below a *.S entry fails its handshake; give that host its own entry. A policy naming no host gets a leaf naming 127.0.0.1 alone. That policy admits no request, so no client is shown the leaf, and the gateway still starts on it.

Metadata

Release files for glovebox-egress-gateway 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for glovebox-egress-gateway 0.4.0
File Size Uploaded Provenance
glovebox_egress_gateway-0.4.0.tar.gz 141.1 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for glovebox-egress-gateway 0.4.0
File Interpreter ABI Platform
glovebox_egress_gateway-0.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 290.2 kB

Release files / glovebox_egress_gateway-0.4.0.tar.gz

Download URL glovebox_egress_gateway-0.4.0.tar.gz
Size 141.1 kB
Tags Source
SHA-256 checksum
How to use checksums
714047436d110793c0d47fc09fd3cea6e6766cd3498c86352a2eeebd561a2ba5
BLAKE2b-256 checksum
How to use checksums
49eec01461dfd4abea9afcc9c1ea6eb51695b1277c94e5092be4320a351747f6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / glovebox_egress_gateway-0.4.0-py3-none-any.whl

Download URL glovebox_egress_gateway-0.4.0-py3-none-any.whl
Size 149.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5fa1c6281c92100198d0b6977c64bc1de5d8cc3227633f0f0dd6560cea661b67
BLAKE2b-256 checksum
How to use checksums
96d1d5831e09d9026aa60aa0134aa260c6c1acbede70e3d0f204bb3e3518fabc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for glovebox-egress-gateway 0.4.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page