Why a blocklist cannot stop a credential leak
Read MoreWhy a blocklist cannot stop a credential leak
Blocking the ways to print an environment is a list, and the list of ways to print an environment is not a list. What worked instead.
Read MoreA local credential broker for AI agents and build jobs
AuthInjector
The broker that holds your API keys so your agents never do.
What we do
AuthInjector is a local broker that holds your API credentials, injects them on the way out, and returns the upstream response unchanged. Permission and a rate limit per key, one audit line per call.
A caller sends plain HTTP to a Unix socket with no credential at all. The broker adds the key, forwards the call, and returns the response unchanged.
Learn more
A service may hold several keys, each under a label. Permission, rate limit and endpoint narrowing attach to the key — the label is the address.
Learn more
Where a service lives and which header it wants is the same for everyone. The catalogue holds that; only the key and the permission are yours.
Learn more
One JSON line per call: who, which key, method, path, status, bytes, duration, cost. Never a body, never a header, never a query string.
Learn more
One installer, one systemd socket, one root-owned config. Keys go in from stdin or a file, never from a command argument. Rotation touches no caller.
Learn more
A request to the socket carries no credential. The broker adds it on the way out and scrubs it from anything coming back, so there is nothing in the caller's reach to print, copy or leak.
The caller is whoever the kernel says opened the socket. No token to present, no header to forge, nothing to steal.
An unknown service, a caller not on the key's list, or a method and path off the allowlist — each is refused before anything leaves the machine, and each refusal is audited.
Several keys per service, each under a label with its own callers, rate limit and endpoint narrowing. The agent's user can be on the read-only key and off the read-write one.
One JSON line per call with who, which key, what, status, bytes, duration and cost. Never a body, never a header, never a query string.
Replace the key on the host and restart the service. Callers address a service by name, never by key, so nothing on their side changes.
Questions
It is source-available under the Fair Core License (FCL). You can read the code, run it and change it for your own use; what the licence rules out is offering it as a competing product. Each release becomes open source two years after it is published.
A caller cannot print, copy or exfiltrate a credential, because it never has one: keys live in one root-owned file the caller cannot read, the broker runs as its own user, and a caller cannot attach to its process. What it does not do is stop usage. A caller permitted to reach a service can use that service freely. That is why the caller list is mandatory per key, and why a write-capable credential is never listed for an agent's user.
No. A call is plain HTTP to a Unix socket with the service name as the first path segment. curl does it in one line; Python's standard library, Node's fetch and Go's net/http all speak it. Code that used to set an Authorization header deletes that line and keeps the rest.
It is refused before anything leaves the machine, and the refusal is written to the audit log with the same fields as a success. An unknown service is a 404, a caller not on the key's list or a path off the allowlist is a 403, a known path with the wrong method is a 405, and a caller over its rate limit is a 429. An upstream that cannot be reached is a 502.
Yes. Replace the key on the host and restart the service. Callers address a service by name, never by key, so nothing on their side changes. Replacing is a deliberate flag; adding to a label that already exists is refused so a rotation you did not intend cannot look like one you did.
In one config file, owned by root and readable only by the service. The service reads it itself — there is no environment file, because that would put every credential into the process environment for the life of the process. In memory, a key is held by one type that zeroes itself when dropped and has exactly one accessor.
No questions match your search.
Hi, I'm Emmy! Tell me what's going on and I'll get AuthInjector to follow up.