Security

How LoopProof holds your data

Every security property described here is enforced in infrastructure and database code, not in application logic.

Tenant isolation

Each tenant has its own PostgreSQL schema and database role. The application login role, loopproof_app, may only execute the functions exposed for its role: no direct SELECT on any table. A query that crosses a schema boundary is a SQL error, not a permission decision in application code.

Tenant secrets (the ExternalId for the connector role and the Linear OAuth tokens) are in Secrets Manager under loopproof/<env>/tenants/<tenant-key>/. The API's task role may read and write them; no other role may without an explicit grant.

Connector security

The connector module creates an IAM role in the tenant's account that LoopProof assumes with sts:AssumeRole. The trust policy requires the tenant's ExternalId, which LoopProof generates at random and stores in Secrets Manager. No static credentials, no access key, no long-lived session token.

The connector role's only permissions are reading Security Hub findings and forwarding events to LoopProof's EventBridge bus.

IAM database authentication

LoopProof's task roles log in to PostgreSQL with IAM auth tokens, not passwords. The RDS instance accepts only token-authenticated connections for the application login roles. There is no database password to rotate, leak or guess.

Break-glass access

An operator's access to a tenant's data is a break-glass admin command. It is:

  • Time-limited: the operator sets an expiry when opening a grant, up to a configurable maximum.
  • Read-only: the break-glass login role has membership of the tenant's database role with no write privileges.
  • Recorded: every query, its result, the operator identity and the reason are in the tenant's audit trail.
  • Tenant-notified: the tenant's admins receive an email when a grant opens.

Offboarding and data deletion

When a tenant leaves, the offboarding process deletes everything LoopProof holds: the tenant's schema and database role, all rows in shared tables, Cognito users with no other tenant, the ExternalId and Linear secrets, and every version of every object in the tenant's archive prefix in S3.

The drop is verified empty before it is recorded. Automated backups expire within 7 days. Everything is gone within 30 days of the drop.

Archive integrity

The raw event archive is write-once: the S3 bucket policy refuses a PutObject without If-None-Match: *, so an existing object is never replaced. Versioning is on. Noncurrent versions are kept for 90 days. The bucket policy denies s3:DeleteObject to every principal except offboarding's task role.

Compliance

InfraHouse holds no SOC 2 report for LoopProof. LoopProof runs in us-west-1. Data in transit uses TLS 1.2 or higher.

Questions?

Talk to the founding team

Design partners can ask questions about the security model directly.