Skip to main content

Data handling

What leaves your cluster

One connection, outbound, to one destination.

Destinationapi.gen0sec.com:443
Made byThe relay pod only
DirectionOutbound, request and response
PurposeFetching four licensed datasets

What is in the request. A path naming the artifact, and your own Gen0Sec API key. Nothing else. The relay does not add a customer identifier, a cluster identifier, an agent identifier, telemetry or usage data.

What is in the response. The artifact: a CTI indicator database, a GeoIP database, an ML model, or an IDS rule bundle.

What never leaves your cluster

DataWhat it is
identityWorkload identity produced inside your cluster
policy-edgesPod IP addresses, namespaces, NetworkPolicy edges
Agent telemetry and eventsEverything your agents report
Configuration and policyEverything you configure
LogsAll of it, to container stdout in your cluster
Database contentsPostgres never leaves
Dashboard user accounts and passwordsHeld in your Postgres

identity and policy-edges deserve the explicit statement, because they are the two that are technically served by the same service that does the relaying. They are never relayed. Doing so would push a map of your workload topology to a service you do not run. It is not configurable, and no flag enables it.

The upload surface is not relayed either, because the relay is read-only.

Who validates agent credentials

Your agents' keys are validated in your cluster, and they never leave it.

Every relayed route sits behind the local authentication middleware, and each one carries the same permission it carries in direct mode. So a key that would be refused when served locally is refused it when relayed.

agent --[agent key, authorized locally,
permission checked per route]--> relay --[your Gen0Sec API key]--> api.gen0sec.com
agent key stops here

Two separate concerns, deliberately separated:

HopCredentialChecked by
Agent to relayThe agent's own keyYour cluster, against your installation, with the artifact's permission
Relay to Gen0SecYour Gen0Sec API keyGen0Sec
Credentials Gen0Sec receivesOne, belonging to your installation
Credentials Gen0Sec never receivesYour individual agent key
What Gen0Sec can infer about your fleetNothing from the credential. Requests carry no agent or cluster identifier
Revoking one agentLocal, in your dashboard, immediate
Revoking your installation's upstream accessRevoke or rotate your Gen0Sec API key

This is the answer to "does our agent inventory leave our perimeter". It does not.

Agent keys are never forwarded upstream, even by accident

On a self-hosted deployment the relay never puts a caller's key in an outbound request, in any configuration. A locally-issued key could not authenticate to Gen0Sec anyway, so forwarding it could only leak a local credential to a third party without making the request succeed. With no Gen0Sec API key configured the relay sends no credential at all rather than sending yours.

Credentials at rest

CredentialWhere it livesGenerated by
Database role passwordsKubernetes secretsThe Postgres operator
Object store keysA Kubernetes secretYou, during install
Registry pull credentialsA Kubernetes secret per namespaceYou, during install
Dashboard session signing keyA Kubernetes secretGenerated once, preserved across regeneration

No credential appears in a chart, a values file or a rendered manifest. Every one is referenced by name. See Secrets.

The install procedure reads every credential from a file or from standard input rather than passing it as a command-line argument, so nothing lands in shell history or in the process list.

Credentials in transit

HopEncrypted
Agents and users to your ingressYes, TLS you terminate
Relay to api.gen0sec.comYes, TLS
Services to PostgresYes, TLS to the pooler
Services to the object storePlain HTTP, in-cluster only
Services to the cachePlain, in-cluster only, no credential in the URL

The last two are in-cluster traffic on the pod network. If your threat model includes an attacker on the pod network, add NetworkPolicies and a service mesh. See Hardening.

One deliberate exception, and why

The dashboard's database connection verifies encryption without verifying the certificate chain, because its client library rejects the pooler's self-signed certificate outright while every other service's library accepts encrypt-without-verify. The traffic is encrypted and in-cluster. Do not copy that setting onto the other services: their driver rejects it.

Data retention

Retention is yours. Nothing expires data on your behalf, and nothing is sent anywhere before it is deleted.

StoreGrows withSized by
PostgresAgents, events, historypostgres.volume.size
KafkaIn-flight events, and its retention windowkafka.storage.size
Object storeDatasets and locally-produced artifactsrustfs.storageclass.dataStorageSize

See Sizing.

Deleting everything

Uninstall without --keep-data deletes the namespaces and every persistent volume in them: the database, the message log and the object store. There is no copy anywhere else.