How Kesher isolates tenants, protects data, and handles incidents. Last reviewed 2026-07.
This page describes the architecture and controls actually implemented in the product today, not a
compliance claim. Where something is in progress rather than finished, it's labelled that way rather
than implied. A SOC 2 Type I report and an external penetration test are both scheduled ahead of
public launch (see "Independent assurance" below) — this page is the trust artifact that exists
before those land.
Tenant isolation Live
Every deployment is one Postgres database shared by every customer (org), isolated two independent ways:
Schema-per-org. Each org's own application tables (the records inside a customer's apps)
live in that org's own dedicated Postgres schema, created and migrated independently. A query that
forgets to filter by tenant can't accidentally reach another tenant's table — there isn't one to
reach from inside the wrong schema.
Row-Level Security on shared platform tables. Tables that by definition span every
org (accounts, app configs, audit log, sessions) enforce Postgres Row-Level Security, keyed on the
authenticated caller's own org — enforced by the database itself, not only application code.
Both of the above sit underneath application-layer authorization checks on every request —
defense in depth, never a substitute for them.
Adversarial isolation test suites (cross-org read/write attempts, session/ticket probes, storage
path isolation, cross-tenant tool/config lookups on the AI engine) run on every change and block
deployment on failure.
Authentication & session security Live
Passwords are hashed (never stored or logged in plaintext) and checked against a breach-password
list at signup/change.
Google SSO (OpenID Connect) as a full alternative sign-in path, with account linking by verified
email.
TOTP-based two-factor authentication (self-enrolled or enforced org-wide), with one-time backup codes.
Sessions are signed tokens with a server-side revocation record — real logout, "sign out everywhere,"
and immediate cutoff on password reset, role demotion, app-membership removal, or org suspension,
not just client-side token deletion.
Persistent account lockout after repeated failed logins; every authentication event (success,
failure, lockout, admin override) is written to an append-only security log.
Login and password-reset endpoints are rate-limited per IP and per email; CSRF double-submit tokens
and standard browser security headers (HSTS, a real Content-Security-Policy, X-Frame-Options,
nosniff) apply to every state-changing request.
Authorization model Live
Access is split into deliberately narrow tiers, each re-verified against the database on every request
rather than trusted from a cached session claim:
Platform operator (us) — cross-org by design, for operating the service itself;
every use is audited, including a time-boxed "break glass" grant for supporting a specific customer
that requires a logged reason and expires automatically.
Org admin — full control within their own organization only.
App owner — administrative control over one specific application, without
organization-wide admin rights.
Per-app, per-role permissions — configurable field- and record-level access for
everyone else, enforced identically for interactive use, automations, and the embedded AI agent.
Data protection
All traffic is served over TLS; plaintext HTTP is redirected. Live
Two-factor secrets are encrypted at rest before storage. Live
Uploaded files are stored in cloud object storage behind short-lived, permission-checked signed
URLs — this service never proxies file bytes, and every URL mint re-checks the caller's role and
an upload size ceiling. Live
Database credentials, webhook signing secrets, and third-party API keys are currently deployment
environment variables; migration to a dedicated secrets manager with rotation schedules is in
progress. In progress
A performed (not merely planned) database point-in-time-recovery restore drill, with documented
recovery time/point objectives, is scheduled ahead of public launch.
Planned
Data lifecycle & customer control Live
Self-service export of an organization's full configuration and data (every application, every
record) as a portable archive.
Self-service, irreversible hard-delete of an organization's data — every platform record tied to
it and its entire database schema — confirmed by re-typing the organization's name.
A time-based lifecycle (trial → active → past-due → grace period → automatic export → automatic
deletion) that runs unattended, so an abandoned account doesn't linger indefinitely nor get deleted
without warning or a recoverable export first.
Application & agent safety Live
Every configuration change proposed by the embedded AI builder is staged and requires human
approval before it takes effect on a live application — there is no path for the agent to write
directly to a customer's live configuration.
Automated actions that write data run through the same permission and validation rules as a human
user, and higher-risk automated actions can require a human approval step before they execute,
independent of the automation's own judgment.
An arithmetic/formula evaluator used throughout the product runs on an allow-listed grammar (no
arbitrary code execution, no attribute or object-graph access) rather than a general-purpose `eval`.
Expensive query endpoints (formula evaluation, ad-hoc data queries, cross-entity reports) are
rate-limited per organization in addition to a global result-size ceiling, so one tenant's usage
can't degrade service for others.
Monitoring & incident response
Structured, correlation-ID-tagged logging on every request, flowing into the cloud platform's
centralized log analysis. Live
Automated alerting on stalled scheduled jobs and abnormal per-organization usage spikes.
Live
Application error tracking (opt-in, pluggable). Live
A public, real-time status page for service availability. Planned
Independent assurance
SOC 2 Type I report. Planned — evidence collection
(access reviews, change logs, authentication event trails) is already underway against controls
already in production, ahead of the audit itself.
Third-party penetration test, scheduled before public launch. Planned
Reporting a vulnerability
If you believe you've found a security issue, please report it privately rather than through a public
issue tracker. We ask that you avoid accessing or modifying data that isn't your own while testing.