EVE Core › Docs › EVE Sidecar

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.

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
  1. Envoy’s ext_authz filter calls the sidecar over gRPC (envoy.service.auth.v3.Authorization/Check, port 9002) or HTTP (port 9001). Both transports share one decision function.
  2. The sidecar builds an eve.decision.request.v1 from the request’s metadata and a digest of its body, and posts it to POST /v1/decisions/authorize over verified TLS (optionally mTLS).
  3. 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.
  4. 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).
  5. 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)

SituationSidecar answerWhat Envoy does
Verified ALLOWOK (gRPC 0 / HTTP 200)Forwards the request
Verified BLOCK (includes a MODIFIED verdict)PERMISSION_DENIED / 403Denies; nothing sent upstream
Control plane unreachable, timeout, TLS error, non-2xx, non-JSONPERMISSION_DENIED / 403Denies
Missing, hmac- or unknown signature; wrong key; issuer mismatchPERMISSION_DENIED / 403Denies
Decision for a different request, digest or tenantPERMISSION_DENIED / 403Denies
Expired decision, or a replayed noncePERMISSION_DENIED / 403Denies
Missing x-eve-provider or x-eve-model headerPERMISSION_DENIED / 403Denies (the sidecar never guesses missing metadata)
Malformed Envoy check requestPERMISSION_DENIED / 403Denies
Sidecar itself down—Denies, because the shipped Envoy config sets failure_mode_allow: false

3. Configuration

All configuration is via environment variables.

VariableDefaultPurpose
EVE_SIDECAR_CONTROL_PLANE_URL— (required)Base URL of the EVE control plane
EVE_SIDECAR_DECISION_PATH/v1/decisions/authorizeSigned-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_BUNDLEsystem trust storeCA 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— / 3600Alternative key source with caching; if the key set is unavailable and nothing is cached, requests are denied
EVE_SIDECAR_DECISION_TIMEOUT_S3.0Control-plane call timeout (timeout = deny)
EVE_SIDECAR_VERDICT_MAX_TTL_S300Upper bound on how long a decision is accepted
EVE_SIDECAR_EXT_AUTHZ_TRANSPORThttphttp or grpc
EVE_SIDECAR_EXT_AUTHZ_HTTP_PORT / ..._GRPC_PORT9001 / 9002Listener ports
EVE_SIDECAR_META_HEADER_PREFIXx-eve-Header prefix for governance facts passed from the app
EVE_SIDECAR_ALLOW_CONTENT_INSPECTIONoffPermit sending request bodies when a policy requires them
EVE_SIDECAR_MAX_BODY_BYTES65536Body 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, when EVE_SIDECAR_ALLOW_CONTENT_INSPECTION is 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.

YAML
# 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_PROXY listener 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

Interested in the EVE Sidecar?

The sidecar is in early access for design partners. Talk to us about a pilot — [email protected].

Part of the EVE AI Core control plane Deterministic AI Governance Control Plane → Policy decisions that return the same result for the same input every time, before execution.