API & integration
EVE Sidecar — Deployment Guide
The EVE Sidecar is an Envoy ext_authz authorization service. Envoy asks it before forwarding each outbound request; the sidecar obtains a signed decision from EVE’s hosted control plane, verifies that signature with EVE’s public key, and answers OK only for a verified ALLOW. Everything else — a BLOCK, a bad signature, a timeout, an outage — is denied, and Envoy never sends the request upstream.
Availability: early access. The sidecar is built, tested and signed in EVE’s CI and is deployed with design partners as a controlled pilot. It is not generally available and is not published to Docker Hub or any public registry; the image and Helm chart are shared privately under an engagement. Contact [email protected].
Deployment model: the sidecar is a thin, stateless relay. No governance logic, policy packs, model weights or signing keys are in the image — a build-time guard scans both the staging tree and the exported image and fails the build if any EVE engine code is present. Decisions are made by the EVE control plane (EVE-hosted SaaS; VPC, on-prem and air-gapped deployments of the engine are available separately to design partners). The sidecar needs the control plane to be reachable: there is no offline decision mode.
Contents
1. What the EVE Sidecar Does
Customer app ──▶ Envoy ──ext_authz──▶ EVE Sidecar ──HTTPS──▶ EVE control plane
│ │ ◀── signed eve.decision.v1 ──┘
│ └─ verify signature, issuer, tenant,
│ request digest, expiry, replay
├─ OK (verified ALLOW only) ──▶ upstream model / API
└─ 403 / PERMISSION_DENIED ──▶ request never forwarded
- Envoy’s
ext_authzfilter calls the sidecar over gRPC (envoy.service.auth.v3.Authorization/Check, port9002) or HTTP (port9001). Both transports share one decision function. - The sidecar builds an
eve.decision.request.v1from the request’s metadata and a digest of its body, and posts it toPOST /v1/decisions/authorizeover verified TLS (optionally mTLS). - EVE runs CoreGuard policy evaluation and returns a signed
eve.decision.v1. The tenant in that decision is taken from the authenticated caller, never from the request. - The sidecar checks, in order: schema, signature and issuer, that the decision answers this request, the payload digest, the tenant, expiry, and a single-use replay nonce (consumed last).
- Only when every check passes and the verdict is ALLOW does the sidecar answer OK.
Filing coverage: Family 1 (Deterministic Pre-Execution Governance, 64/022,677) and Family 6 (Resilience & Hard-Fail-Shut, 64/039,652).
2. Decision Table (Fail-Closed)
| Situation | Sidecar answer | What Envoy does |
|---|---|---|
| Verified ALLOW | OK (gRPC 0 / HTTP 200) | Forwards the request |
| Verified BLOCK (includes a MODIFIED verdict) | PERMISSION_DENIED / 403 | Denies; nothing sent upstream |
| Control plane unreachable, timeout, TLS error, non-2xx, non-JSON | PERMISSION_DENIED / 403 | Denies |
Missing, hmac- or unknown signature; wrong key; issuer mismatch | PERMISSION_DENIED / 403 | Denies |
| Decision for a different request, digest or tenant | PERMISSION_DENIED / 403 | Denies |
| Expired decision, or a replayed nonce | PERMISSION_DENIED / 403 | Denies |
Missing x-eve-provider or x-eve-model header | PERMISSION_DENIED / 403 | Denies (the sidecar never guesses missing metadata) |
| Malformed Envoy check request | PERMISSION_DENIED / 403 | Denies |
| Sidecar itself down | — | Denies, because the shipped Envoy config sets failure_mode_allow: false |
3. Configuration
All configuration is via environment variables.
| Variable | Default | Purpose |
|---|---|---|
EVE_SIDECAR_CONTROL_PLANE_URL | — (required) | Base URL of the EVE control plane |
EVE_SIDECAR_DECISION_PATH | /v1/decisions/authorize | Signed-decision endpoint |
EVE_SIDECAR_TENANT_ID | — (required) | Your tenant; decisions for any other tenant are rejected |
EVE_SIDECAR_AUTH_TOKEN | — | Bearer token for the control plane (mount from a Secret) |
EVE_SIDECAR_MTLS_CERT / EVE_SIDECAR_MTLS_KEY | — | Optional client certificate for mTLS |
EVE_SIDECAR_CA_BUNDLE | system trust store | CA bundle for verifying the control plane |
EVE_SIDECAR_PUBKEY | — | EVE’s public key (PEM) used to verify decisions |
EVE_SIDECAR_JWKS_URL / EVE_SIDECAR_JWKS_MAX_AGE_S | — / 3600 | Alternative key source with caching; if the key set is unavailable and nothing is cached, requests are denied |
EVE_SIDECAR_DECISION_TIMEOUT_S | 3.0 | Control-plane call timeout (timeout = deny) |
EVE_SIDECAR_VERDICT_MAX_TTL_S | 300 | Upper bound on how long a decision is accepted |
EVE_SIDECAR_EXT_AUTHZ_TRANSPORT | http | http or grpc |
EVE_SIDECAR_EXT_AUTHZ_HTTP_PORT / ..._GRPC_PORT | 9001 / 9002 | Listener ports |
EVE_SIDECAR_META_HEADER_PREFIX | x-eve- | Header prefix for governance facts passed from the app |
EVE_SIDECAR_ALLOW_CONTENT_INSPECTION | off | Permit sending request bodies when a policy requires them |
EVE_SIDECAR_MAX_BODY_BYTES | 65536 | Body size cap for digesting / inspection |
Request headers your app sets. Each governed request must carry x-eve-provider and x-eve-model; x-eve-action, x-eve-resource and x-eve-principal are optional. A request without the two required headers is denied.
Health: python -m eve_sidecar.entrypoint healthcheck (used by the image’s HEALTHCHECK and the Helm chart’s exec probes).
4. The Signed Decision
The control plane returns an eve.decision.v1 document. Its content_hash is "sha256-" + sha256(canonical JSON) of the decision without its signature, and the signature is an asymmetric signature over that hash, tagged with its algorithm. EVE’s hosted service signs kms-ecdsa-p384- (ECDSA P-384 in AWS KMS); a self-hosted engine signs ecdsa-p256- or ed25519-. The sidecar accepts only these asymmetric tags, each checked against a key of the matching type: symmetric hmac- signatures, which anyone holding the shared key could forge, are rejected, as are unknown tags.
Because the signature is asymmetric, the sidecar holds no signing key — only EVE’s public key — and cannot mint a decision. The same public key lets you re-verify a stored decision later without contacting EVE. (This establishes tamper-evidence and origin against that key; it is not a legal-attribution guarantee, which also depends on key custody and authorization controls.)
5. What Leaves the Pod
- By default: governance metadata — provider, model, action (default
http.<method>), resource (default: the request path) and an optional principal — plus a SHA-256 digest of the body. - Only when you enable it: the request body, up to
EVE_SIDECAR_MAX_BODY_BYTES, whenEVE_SIDECAR_ALLOW_CONTENT_INSPECTIONis on and the request asks for it. - Never: credentials from the proxied request (for example the upstream provider’s API key).
6. Kubernetes and Envoy
Run the sidecar as a container in the same pod as your application and Envoy, and point Envoy’s ext_authz filter at it. The reference Envoy config and Helm chart are provided with the image.
# Sidecar container - name: eve-sidecar image: <YOUR-REGISTRY>/eve-sidecar@sha256:<DIGEST> # issued with your engagement ports: [{ containerPort: 9002 }, { containerPort: 9001 }] env: - { name: EVE_SIDECAR_CONTROL_PLANE_URL, value: "https://api.eveaicore.com" } - { name: EVE_SIDECAR_TENANT_ID, value: "org_abc" } - { name: EVE_SIDECAR_EXT_AUTHZ_TRANSPORT, value: "grpc" } - name: EVE_SIDECAR_AUTH_TOKEN valueFrom: { secretKeyRef: { name: eve-sidecar, key: token } } - name: EVE_SIDECAR_PUBKEY valueFrom: { configMapKeyRef: { name: eve-sidecar, key: pubkey.pem } } # Envoy HTTP filter - name: envoy.filters.http.ext_authz typed_config: transport_api_version: V3 failure_mode_allow: false # sidecar down = deny grpc_service: envoy_grpc: { cluster_name: eve_sidecar_authz } timeout: 3s
Making it mandatory. The sidecar governs traffic that reaches Envoy. To stop an application from bypassing it, route all egress through a separate Envoy egress-gateway pod and restrict the application pod’s egress to that gateway — a service-mesh egress gateway does this by default. A NetworkPolicy alone cannot achieve it when Envoy is a sidecar in the same pod: NetworkPolicy selects pods, and all containers in a pod share one network namespace and IP, so any rule permitting Envoy’s egress permits the application container’s egress as well. That network configuration is yours to apply; the sidecar does not install iptables rules.
7. What Is Not Included
- Forward-proxy mode. There is no
HTTPS_PROXYlistener and no TLS interception; traffic is governed through Envoy. - Offline decisions. Every decision comes from the control plane; if it is unreachable, requests are denied.
- Metrics and rate limiting. The sidecar has no Prometheus endpoint or per-tenant rate limiter; use Envoy’s own stats and rate-limit filters.
- Public distribution. No public image, Helm repository or self-serve download.
8. Related Documentation
- EVE CoreGuard — decision enforcement engine and policy-evaluation overview
- EVE CoreGuard Integration Guide — call the decision API from code with the SDK
- EVE Sidecar product overview — fail-closed egress gate for regulated deployments
Interested in the EVE Sidecar?
The sidecar is in early access for design partners. Talk to us about a pilot — [email protected].