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.