SECURITY.md; do not open a public issue
containing sensitive details.
Authentication and authorization
The one-time local bootstrap atomically creates the first Organization, its Admin User and Membership, the local password, and an opaque cookie session. Protect and retire the file-backed bootstrap token after that use. Normal product routes use the opaque__Host-oc_session cookie. General bearer API
tokens are not shipped in OSS v0.1. Unsafe cookie requests require the configured
same-origin Origin; cross-origin and Origin: null requests are rejected.
Roles grant fixed Permissions inside an Organization. Missing authentication returns
401, insufficient Permission returns 403, and inaccessible Organizations and unknown
tenant records are indistinguishable.
A User has at most one current Organization Membership. Organization Admins can create
local Users and manage that Membership, but cannot replace an existing User’s password. Change your own
local password with PUT /api/v1/auth/local/password, supplying currentPassword and
newPassword without an Organization selector. Success deletes all your sessions, including
the current one, and requires sign-in again. Passwords accept 12–1024 bytes.
OIDC Users manage their credentials through their identity provider.
Deployment operators can recover an existing enabled local account using its User UUID:
Trust boundaries
The browser and product ingress share one origin. PostgreSQL holds durable product truth. Customer Relays initiate outbound, pinned sessions; the control plane never receives cluster credentials. Integration and model providers remain external trust boundaries, and their returned content is always untrusted input. Changing an Organization identifier does not change the User’s identity: the server rejects a value that does not match the current Membership before a Tool is offered or a record is read. A Kubernetes read can cross the Relay boundary only when the registered capability and namespace allow-list both permit it. Read-only Tools reduce change risk but do not make source data harmless or complete.Data handling
OpenCluster stores normalized Alert Events, Incidents, Messages, Investigation events, Tool Runs, cited Findings, audit records, and draft Postmortems in PostgreSQL. Tool results are bounded and summarized for review. Conversations retain continuity through Messages and prior cited Findings. OpenCluster does not persist or expose model chain-of-thought. An Investigation can perform live authorized reads, including bounded Kubernetes container logs through Relay and Slack channel or thread messages. A configured Slack App can also send originating-thread replies. These reads and replies remain constrained by the Integration’s verified permissions and the current Organization. Retention and backup policy are deployment responsibilities in OSS. Protect backups as production data and verify retention changes against legal and operational requirements.Secrets and Relay
Secrets accept a direct environment value or an optional_FILE path, never both. Startup errors omit secret values and paths. Restart after changing configuration or secret files.
Inbound webhook credentials are stored as digests. Presentable Integration credentials
are sealed and never returned after creation; one-time values must be stored immediately.
Audit details remove credential-shaped keys.
The Relay initiates its connection from the customer boundary, validates configured SPKI
pins, and executes only closed protocol capabilities. Kubernetes credentials remain with
the Relay and never enter the control plane. Read-only capabilities still require
least-privilege Kubernetes RBAC, network controls, credential rotation, and encryption-key
custody.
Losing the encryption key leaves product records readable but makes sealed Integration
credentials unrecoverable. Back it up separately from PostgreSQL.