ScyllaDB access governance — every CQL statement reviewed before it runs
Last updated
AccessFlow governs ScyllaDB through the same submit, analyse, approve, execute pipeline as any other engine. ScyllaDB speaks the identical CQL binary protocol to Cassandra, so it is served by the same engine plugin and behaves identically — it is a separate connector because the catalog allows one connector per dialect, not because anything differs.
- Family
- Wide-column
- Query language
- CQL
- Runs as
- Engine plugin (shared with Cassandra)
- Default port
9042- Default SSL mode
DISABLE- Install
- One-click from the connector catalog
How AccessFlow connects
ScyllaDB and Cassandra share one plugin JAR, which registers two engine providers — the catalog matches the connector id against the engine id when it loads, so each connector resolves its own provider from the same verified binary. Both connector manifests pin that same JAR by URL and SHA-256.
One native session is cached per datasource. The contact point comes from host and port (9042 by default), a local datacenter is required by the driver's load-balancing policy, and the database name field selects the default keyspace. SSL defaults to disabled for in-cluster deployments.
What AccessFlow understands
A single CQL statement per submission. SELECT is a read; INSERT an insert, including lightweight transactions; UPDATE an update; DELETE a delete; and table, keyspace, index, type and materialized-view management plus TRUNCATE is DDL. Grants target every referenced table, bare or fully qualified.
What it refuses
BEGIN … BATCH is refused as the CQL multi-statement carrier, and creating or dropping a function or aggregate is refused as server-side code — the same two fail-closed constructs as Cassandra, for the same reasons.
Row-level security is key-aware, and fails closed
As on Cassandra, a policy is spliced into the WHERE clause only when its column is a real partition or clustering key column and its operator is one CQL can express — equality, IN, or a range comparison — with values bound as named parameters. The key columns are read from live cluster metadata rather than assumed.
Anything else is refused with HTTP 422 rather than executed unfiltered, because the alternative would be injecting ALLOW FILTERING and turning a targeted read into a full scan. An INSERT into a policied table is rejected, inserts being upserts.
What the rewrite actually does
As on Cassandra, a policy on a key column splices cleanly and anything else is refused rather than made to work with ALLOW FILTERING:
-- submitted SELECT id, email FROM orders WHERE tenant_id = 'acme'; -- executed — region is a clustering key, so it splices SELECT id, email FROM orders WHERE tenant_id = 'acme' AND region = :af_rls_1; -- but a policy on a non-key column HTTP 422 — row-level security cannot be expressed for this statement
Injecting ALLOW FILTERING would turn a targeted read into a full cluster scan, so AccessFlow refuses instead. The key columns are read from live cluster metadata, not assumed.
Introspection
The connection test runs a trivial read against the local system table, and introspection reads cluster metadata into schemas, tables and key columns — the same source the row-security applier uses, so the ER diagram shows exactly what policies can act on.