Single sign-on and roles, an audit log your SIEM holds a copy of, several instances with backup and restore, FIPS-approved cryptography and signed releases. Every claim links to the document, test or command that backs it, and the whole set downloads as one security pack.
People sign in through your SSO and get a role from your groups. Services, partners and AI agents each get exactly the queries they need, and no more.
Authorization code flow with PKCE, as a confidential client: the browser never holds a token. People are bound by the provider's sub, and their role comes from their groups at every sign-in. QUERYAPIGATE_SSO_ONLY removes personal tokens so nobody routes around your MFA.
The shared admin key stays an owner for emergencies. Once a named owner exists, every use of it is logged, audited as break_glass_used and alerted. The last active owner can't be locked out by accident.
Someone removed from your groups loses their role at the next sign-in; a session already open lasts until it expires (8 hours by default). Deactivating them in QueryAPIGate ends it at once.
Every management operation needs one capability, checked before the route runs; a test fails if an operation has no entry, so a new route can't ship unguarded. Roles bound what an administrator can change. For data, the database account behind each connection is still the backstop.
Grants per saved query, collection or connection; read-only unless writes are granted; table allow-lists; IP allow-lists; expiry; rotation without downtime; rate limits, quotas and concurrency caps per key.
Signed-in users call with a JWT checked against your JWKS. A parameter can be bound from a claim, so a user's tenant_id or email comes from the token, not the request.
MCP clients sign in through OAuth 2.1 or use a scoped key, and see only the saved queries they are granted. A write proposed by an agent waits for a person to approve it, and both are audited.
Every configuration change is in a hash-chained audit log, signed with a key kept outside the store and streamed to your SIEM, so a later rewrite contradicts a copy someone else holds.
Each entry's hash covers the one before it, so changing, removing, inserting or reordering an entry breaks every hash after it. With QUERYAPIGATE_AUDIT_KEY the chain is HMAC-signed with a key outside the store. The server checks it every 5 minutes.
Each entry is sent with its sequence number and hash. Tested on every push against rsyslog, syslog-ng and the OpenTelemetry Collector, including refused certificates and an outage. Stable since 0.32.
Who ran which query version, from which front door, with status, rows and duration. Parameter values are never recorded.
Prometheus metrics per key, a Grafana dashboard, 25 kinds of alert, request IDs in structured logs. OpenTelemetry tracing is experimental.
Which keys can call a query and what a key can call, from the grants as they add up. Every change to a key or a role is in the audit log.
What the chain can't show on its own: the newest entries deleted, or a rewrite by someone holding both the store and the key. That is why the copy in your SIEM matters. The audit trail in the threat model →
Connections, saved queries, roles and keys as one YAML file in git. A pull request shows the diff against prod; merging applies it, all or nothing.
QUERYAPIGATE_CONFIG_LOCKED refuses changes made in the Console or the API to anything the file manages.
Without the lock, a change by hand shows in the next diff, and the next apply undoes it.
A password is a reference (an environment variable, a file, Vault or AWS), never a value, and a file with one in it is refused. Keys are SHA-256 hashes of random secrets, rotated by pull request.
On a PostgreSQL store with Redis, everything an instance owns is shared, so instances are interchangeable and any of them can serve any request.
A multi-instance test runs three servers on one store on every change. The reference deployment was run end to end: a key's 4-per-minute limit allowed exactly four calls across all three instances, and with one instance stopped, twelve calls in a row still succeeded.
Stable since 0.30. Non-root, read-only root filesystem, every capability dropped, no service account token, an optional NetworkPolicy and autoscaling. It refuses, before changing anything, a setup that can't work, such as several pods on SQLite.
Each release upgrades the store on its first start. Several instances on one store are replaced one at a time with no downtime, checked in CI against the previous release. Patch releases never break a covered surface; minor releases say so under Breaking.
Everything QueryAPIGate owns, from connections and saved queries to keys, roles, history and the audit log, lives in its store. Back it up while it serves; restore one now and then, because a backup nobody has restored is not a backup.
Kept out of a backup on purpose: QUERYAPIGATE_SECRET_KEY, which encrypts connection passwords, the admin key, and any environment variable a connection refers to. Keep them in your secrets manager. Scoped keys are in the store as hashes, so they keep working after a restore.
Every algorithm is FIPS-approved, and a test fails if the code gains one that isn't. Every release since 0.31 is signed, with an SBOM and provenance you can check by digest.
Validation is a property of the cryptographic module, not of the application. QueryAPIGate uses only FIPS-approved algorithms (FIPS 140-3, SP 800-131A); run it on a validated OpenSSL in FIPS mode, such as Red Hat Enterprise Linux 9 with fips=1 or Ubuntu Pro FIPS, with Python's cryptography from the distribution, and the cryptography it uses is validated.
The image and the Helm chart are signed keyless with cosign by the release workflow, by digest. Each platform carries an SPDX 2.3 SBOM and SLSA provenance naming the repository, workflow, commit and run. Every GitHub Action is pinned by commit and the base images by digest.
Admit only signed releases to a cluster with Sigstore's policy-controller or Kyverno; both policies are in the guide, tested against signed, unsigned and wrongly signed images.
The project's own security practices are scored by OpenSSF Scorecard, an independent automated check from the Open Source Security Foundation. It runs on every change to the main branch and once a week, and the badge below always shows the latest score.
Seven documents for QueryAPIGate 0.34.2, as one PDF to attach to your review or as Markdown to diff against the next release. Each can also be read here.
Every table QueryAPIGate keeps, what personal data it holds, for how long and who reads it, on one page. A test fails if a table is missing from it.
queryapigate history forget erases a person's runs, events and usage counts, recorded in the audit log by a hash of who, not their name.
The pack is built from the documentation in the repository at 0.34.2. The SBOM itself is read from the image you run, by digest, rather than copied into the pack.
Software you run inherits your controls. This is the split a reviewer will ask about, stated plainly.
Those certify an organisation running a service. QueryAPIGate runs inside yours, under your controls; what it provides is the evidence your own assessment needs.
Today: H2, generic JDBC and MongoDB connections, OpenTelemetry tracing, and secrets and credentials from AWS. They sit outside the compatibility promise until they graduate.
Please don't open a public issue. Use GitHub's private advisory form or email arcswdev@gmail.com. Fixes are published as Security entries in the changelog, with how to check whether you were affected.
Architecture, threat model, data protection, questionnaire answers and release verification for 0.34.2, in one PDF. Then check the answers on your own server with guide 57.