Skip to content

Security

Sluice stands between clients you do not trust and your data. This page lists the defaults and the fail-closed cases.

Defaults

Area Default
Access Default deny. A query runs only when policies allow every table it reads.
Statements Read-only. Sluice rejects writes and attaches databases READ_ONLY.
Audit log audit.failClosed: true. A client gets rows only after Sluice queued the audit record.
Admin API Off. Without admin.token it accepts every request.
TLS Off. REST, MCP over HTTP and admin serve plain HTTP until you set tls.
Secrets Sluice writes no secret value to logs, metrics or the audit log.

See the hardening checklist and the threat model.

When Sluice fails closed

In each case the client gets an error and no rows.

Case Error code
No policy allows a table ACL_DENIED
A CEL condition fails with an error ACL_DENIED
OPA returns no decision ACL_DENIED
OPA returns an unknown field, or OpenFGA returns an error ERR_POLICY_UNAVAILABLE
A policy template uses a claim the subject lacks ACL_DENIED
The audit queue does not take the record ERR_AUDIT_UNAVAILABLE
The approval queue is full ERR_RATE_LIMITED

With budgets on and budget.failClosed: true, Sluice does not start when the budget store cannot open.

Report a vulnerability

Follow SECURITY.md in the repository.