http_request, credential discovery and refresh, authorization-data downloads, startup probes, and Kubernetes ClusterRole fetches — routes through a single proxy policy set by the operator at startup. The policy is read once when the process starts; nothing the model sends can change it.
Proxy variables
Lowercase wins. When both casings are set and non-empty, the lowercase spelling takes precedence — the behavior of
curl and Go’s x/net. Go’s standard library reads the uppercase spelling first, and some SDK helpers (such as MSAL’s optional regional-authority autodetection) follow that reading. To avoid disagreements, set both spellings to the same value.
NO_PROXY entry formats:
*— everything goes direct- An IP address or CIDR — matched against requests whose host is an IP literal (never against what a name resolves to)
- A hostname — matches the name and all its subdomains
.hostname— subdomains onlyhost:port— matches that host and port specifically
localhost (lowercase) and loopback literals are never proxied regardless of NO_PROXY. Trailing dots matter: an entry api.example.com does not match a request for api.example.com.. A value containing a control character is rejected at startup.
Supported proxy URL formats
https:// proxy (TLS to the proxy itself) is rejected at startup. This is because Go would reuse the connector’s TLS settings — a cluster’s private CA, an mTLS client certificate, a custom tls-server-name — for the proxy hop, and no documentation makes that safe. The startup error names the variable and the fault, and never prints the value.
What routes through the proxy
What does NOT route through the proxy
Instance metadata services (
169.254.169.254) sit on a link-local address that only answers for the host that asks — a request sent through a proxy on another machine would reach the wrong machine’s metadata or nothing. On EC2 or Azure hosts, add the metadata address to NO_PROXY:
Trust boundary
A direct connection (includingNO_PROXY matches) keeps every check Cynative performs: the host is pinned to the connector, the action is authorized, the credential is attached only after both, and the resolved IP address is verified before the connection is made.
A proxied connection keeps the host pin, the action authorization, and the credential injection — but the connection itself goes only to the proxy the operator named. Cynative never resolves the destination host itself and never verifies its address; both are delegated to the proxy. The proxy sees the authority (CONNECT host:port) of every connection.
A plain CONNECT proxy (non-intercepting) cannot read the request inside the TLS tunnel; the origin certificate is verified against the connector’s trust settings exactly as on a direct connection.
What an intercepting proxy can observe
An intercepting proxy — one whose certificate the connector’s trust settings accept — occupies a privileged position in the traffic path. It can observe:- Credentials — Cynative attaches credentials after the action gate authorizes the request. Because the connection goes to the proxy, the proxy receives the full request including any
Authorizationheader or signed query parameter. Credentials reach the proxy in plain text inside the TLS tunnel the proxy terminates. - Request URLs — the full request URL, method, and headers for every connector call.
- Response bodies — every response body, before Cynative’s redaction runs.
SOCKS proxy notes
Bothsocks5:// and socks5h:// hand the unresolved destination name to the proxy — Go never resolves the target host locally for either spelling. Destination name resolution is entirely the proxy’s responsibility.
The SOCKS5 handshake carries authentication credentials subject to these length limits:
- Username: 1 to 255 bytes
- Password: at most 255 bytes
http://) or SOCKS authentication over the plaintext proxy hop. Cynative never prints them. Credentials echoed back in error text are scrubbed before the text reaches the model, the inventory, or the audit log.
Certificate trust
Cynative verifies the origin certificate with the operating system’s root store plus the connector’s own CA when it has one (the cluster CA from a kubeconfig,connectors.gitlab.ca_cert). A TLS-intercepting corporate proxy therefore works once its CA is added to the OS trust store.
On Linux — and since Go 1.27 on macOS and Windows as well — SSL_CERT_FILE and SSL_CERT_DIR replace the platform store rather than extend it, so a bundle named there must include the public roots as well. GODEBUG=x509sslcertoverrideplatform=0 restores the earlier macOS and Windows behavior where the platform verifier ignores those two variables.
Proxy startup audit line
When a proxy is configured, the connector inventory prints a summary line at startup:http_request result also carries route: "proxy" or route: "direct" — the routing decision for that specific request. A request denied before route selection (host, action, or credential rejection) carries no route field.
