Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

SecOps

Security engineering: reviews and hardens, rarely changes routing. Wants to prove, to themselves and to an auditor, who can read what, that secrets stay out of the logs, and that a leaver’s access ends. Today that needs superadmin, because every setting they review is deployment-wide and nothing narrower reaches it — which also hands them every tenant’s traffic.

Goal: “I can show who reads prompts, that credentials never land in a log or a response, and that access ends when it should — without being able to change the routing I am reviewing.”

Dogfood account: dev@rolter.local (superadmin), plus the other personas to test what they can read. See dogfood data.

The observer watches: audit_log — every step here either reads the audit trail or should leave a row in it.

S0 — the role

#stepwhereexpectstatus
S0.1review security posture without being superadmin—a read-only security-auditor role: settings, guardrails, audit, no tenant datagap — #1834

S1 — the perimeter

#stepwhereexpectstatus
S1.1confirm nothing runs openrolter check; the dashboard banneran admin token set; open mode refused on any non-loopback bind unless ROLTER_ALLOW_OPEN_MODE acknowledges it, as the local compose file does (#1890)verified
S1.2confirm an anonymous caller gets nothingthe #1820 sweep, or curl every GET in /openapi.json without credentials401 from everything the document does not mark publicverified
S1.3decide whether the redacted config stays publicGET /api/v1/config without credentialsno secrets, but every upstream api_base, route and grouppartial — #1840
S1.4restrict browser origins and ingressSettings → Security; CORSthe dashboard’s origin allowed, nothing elseverified
S1.5bound outbound requeststhe egress policya provider, connector or MCP server cannot be pointed at an internal address the policy forbidsverified

S2 — identity

#stepwhereexpectstatus
S2.1single sign-on only, second factor requiredGovernance → Single Sign-On → Org sign-in policyone button; accounts without a factor are refused until they enrolpartial — #1852
S2.2throttle password guessingrepeated wrong passwords for one accountHTTP 429 with Retry-After once the account’s allowance is spent; auditedpartial — #1854 (throttled; the audit row is unreadable)
S2.3a leaver loses everythingSCIM deprovision (platform-admin A1-d)sessions gone at once; personal keys refused at the gatewaybug — #1841
S2.4break-glass for a lost second factorrolter mfa reset --email … --reason … on the hostfactor and sessions cleared, the reason audited; not reachable over the APIverified (the audit row: #1854)

S3 — prove secrets stay out of the logs

#stepwhereexpectstatus
S3.1payload capture is off unless someone chose itObservability → Logs Settingsoff by default; the dogfood profile turns it on deliberatelyverified
S3.2known credential fields never reach storagepayload_capture_redact_fieldsthe value of a matching JSON key replaced before the write, recursivelyverified
S3.3a key pasted into a prompt never reaches storage—a secret inside free text redacted by patterngap — #1835
S3.4see what the redaction does before trusting it—a dry run against a sample bodygap — #1835
S3.5who reads the bodies that are storedsign in as each persona; LLM Logs → a rowmembers and admins of the project read them; viewers get “hidden for your role” unless the project allows itverified (#1820)
S3.6erase one subject’s logs on request—a subject’s rows and payloads deleted, auditedgap — #1085

S4 — inspection in the request path

#stepwhereexpectstatus
S4.1block a known-bad pattern before it reaches a providerGuardrails → Rulesthe request refused with guardrail_blocked: <rule>; the rejected text never storedverified
S4.2hand content to an external de-identification servicethe PII sanitizerthe provider sees the substituted text; optionally reversed on the way backworks

S5 — keys and recovery

#stepwhereexpectstatus
S5.1verify a restored database still opens its secretsrolter kek verifyevery sealed column opens with the current KEK, or the report names what failsverified
S5.2rotate the KEK without splitting the fleetbackup and restorethe documented rotation: no node is left unable to open a secret mid-wayworks

S6 — the trail

#stepwhereexpectstatus
S6.1who changed what, whenGovernance → Audit Logs (admin at the org)every mutation in this session’s scripts, with its actorverified for changes; sign-ins and second factors — #1854
S6.2a project was opened to its viewersthe audit log, project.settings.updatethe row, naming the value it was set toverified