Operator Accounts
Who administers the server, with a name: operator accounts are the admin console's identity, separate by design from the API keys that callers use. Each operator signs in as themselves, holds a role that bounds what they may change, carries their own second factor, and leaves an attributable trail. For the person who owns the deployment and the reviewer who asks "who can do what, and how would you know".
1One account per human#
The admin console authenticates OPERATORS, never API keys: the two credential populations serve different doors, and neither opens the other (The Security Model draws the full boundary). Create one account per human in Access: shared passwords cannot be revoked for one person, cannot carry per-person second factors, and turn the security trail into a guess. With named accounts, every sign-in, configuration change, credential edit, and second-factor event lands in the trail with the actor on it.
2Three roles#
| Role | May |
|---|---|
| Owner | Everything, including the surfaces that decide who else gets in: operator accounts, SSO, certificates, and the security settings |
| Admin | Operate the server: models, inference shape, keys and grants, files, search, jobs, telemetry; refused on the Owner surfaces above |
| Viewer | Read everything, change nothing: the write refusal is structural (a server-side action filter), not hidden buttons. A viewer still signs in, opens gated areas, and manages their own password and second factor |
Give the first Owner a deputy: a second Owner account is the cheapest insurance against a locked-out sole administrator.
3The first operator, and break-glass#
Three ways in, in the order deployments meet them:
- First start: while NO operator account exists on a server that serves this machine only,
the admin surface is open so the first visit can create the first account. A server that
starts reachable from the network (
Security:NetworkAccess=Network, which every container is) never opens: it creates the localadminaccount itself with a one-time password, prints that password once in its startup log, and the first sign-in replaces it. SeedingAdmin__InitialPasswordthrough the environment creates the localadminaccount with that password instead, on either posture; the value applies only while no account exists and is never stored in plain text. It is ignored once any account exists.Admin__Passwordis the emergency reset, not a seed: on EVERY start it is present it overwrites theadminaccount's password and re-enables the account if it was disabled, then the server scrubs it from its own settings file. A value supplied by the environment, or on a node whose configuration the deployment owns, cannot be scrubbed, and the log names the source still supplying it: set it for one restart, sign in, and remove it, or every restart undoes the next password change. - Day to day: Owners create, disable, and delete accounts in Access.
- Break-glass:
lmkit adminon the host acts on the identity store directly, no sign-in required:create-ownermints a new Owner,reset-password(with--one-timeto force a change at next sign-in) recovers a locked-out human,listshows the accounts. Host access IS the credential here, which is exactly the property that makes it break-glass. The verb resolves the identity store from the invoking shell's configuration and environment, so on a service or container node run it with the node's own environment (the unit'sEnvironment=lines, the container's environment); an interactive shell withoutAdmin__Identity__*provisions a per-node embedded store nobody serves (The Command Line).
4Second factors#
Each operator enrolls their own authenticator (TOTP) from the console and receives eight
recovery codes, shown exactly once and usable once each. Sign-in throttling and per-account
lockout slow guessing regardless. To make enrollment mandatory, set
Security:RequireTwoFactor: it applies live, and the next unenrolled operator to sign in is
walked through enrollment before they get a session.
5Where accounts live: the identity store#
Accounts, sessions, second factors, lockout state, and the security trail live in the admin
identity store. By default that is an embedded database under the state directory: zero
setup, right for one server. Pointing Admin:Identity at a dedicated PostgreSQL, MySQL, or
SQL Server database makes the whole admin domain span every server that shares it: one
account set, sessions and revocations honored everywhere within the 30-second validation
window each node caches them for, API keys and stored responses domain-wide, one security
trail. That shared store is what lets a load-balanced fleet behave as one installation
(Scaling Out). It is also an availability dependency with a stated
contract: the admin surface never opens on a shared store and keeps that posture while the
database is unreachable, sign-in, operator management and key management refuse until it
returns, and API keys already in a node's 30-second snapshot keep authorizing meanwhile, so
inference continues through an outage that the security trail records once.
One law rides this store: identity and document content never share a database. The identity store refuses to land in a knowledge-base database and the reverse, so the blast radius of each credential set stays its own.
A single node becomes a farm member without losing an account: an Owner joins from the
identity domain card of the Access section (or an operator runs
lmkit farm join with the server stopped), the node's operators with their second factors,
its API keys with their counters, its stored responses and its signing secret are copied into
the shared database, and the node points at that database from its next restart. The join
shows the farm's domain key once; every node carries it as LMKIT_DOMAIN_KEY. The step-by-step
procedures, the outage runbook and the way back are Farm Runbooks.
6Sessions and the trail#
A sign-in mints a session token; sessions are listed and revocable per operator, and a revocation is effective everywhere within the validation window section 5 quotes, the time a node trusts a cached session before asking the store again. The security trail (sign-ins and failures, account lifecycle, credential and second-factor changes) is readable under the audit history's security source, and on a shared identity store it is the domain-wide view across every node.
7Sign-in through your identity provider#
Admin SSO replaces passwords with your IdP for daily sign-in: operators authenticate there, group claims map to the three roles, and the accounts above remain as break-glass (Single Sign-On is the complete setup, including why the break-glass account stays).
8Stated plainly#
- One named account per human; Owner, Admin, and Viewer bound what each may change, and the Owner surfaces are the ones that decide who else gets in.
- Second factors are per operator, with eight one-time recovery codes;
Security:RequireTwoFactormakes enrollment a condition of the next sign-in. Admin__InitialPasswordseeds the first account, and a server that starts reachable from the network with no account generates one foradmin, printed once in the startup log;lmkit adminon the host is the break-glass, run with the node's environment so it reaches the store the node serves; a second Owner is cheaper than either.- The identity store is embedded for one server and a dedicated shared database for a fleet, honored everywhere within one validation window and fail-closed while unreachable; identity and document content never share a database.