Storage block :: Cerbos Authorization Management Platform // Documentation
Storage block
Cerbos supports multiple backends for storing policies. Which storage driver to use is defined by the driver setting.
Blob driver
Cerbos policies can be stored in AWS S3, Google Cloud Storage, or any other S3-compatible storage systems such as Minio.
Configuration keys
bucket: Required. A URL specifying the service (e.g. S3, GCS), the storage bucket and any other configuration parameters required by the provider.AWS S3:
s3://my-bucket?region=us-west-1. Must specify region in the URL.Google Cloud Storage:
gs://my-bucketS3-compatible (e.g. Minio):
s3://my-bucket?endpoint=my.minio.local:8080&disableSSL=true&s3ForcePathStyle=true®ion=local. Must specify region in the URL.
prefix: Optional. Look for policies only under this key prefix.workDir: Optional. Path to the local directory to download the policies to. Defaults to the system cache directory if not specified.updatePollInterval: Optional. How frequently the blob store should be checked to discover new or updated policies. Defaults to 0 — which disables polling.requestTimeout: Optional. HTTP request timeout. It takes an HTTP request to download a policy file. Defaults to 5s.downloadTimeout: Optional. Timeout to download all policies from the storage provider. Must be greater than therequestTimeout. Defaults to 60s.
Credentials for accessing the storage buckets are retrieved from the environment. The method of specifying credentials in the environment varies by cloud provider and security configuration. Usually, it involves defining environment variables such as AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY for S3 and GOOGLE_APPLICATION_CREDENTIALS for GCS. Refer to the relevant cloud provider documentation for more details.
AWS: https://docs.aws.amazon.com/sdk-for-go/api/aws/session/
Google: https://cloud.google.com/docs/authentication/provide-credentials-adc
AWS S3
storage:
driver: "blob"
blob:
bucket: "s3://my-bucket-name?region=us-east-2"
prefix: policies
workDir: ${HOME}/tmp/cerbos/work
updatePollInterval: 15s
downloadTimeout: 30s
requestTimeout: 10s
Google Cloud Storage
storage:
driver: "blob"
blob:
bucket: "gs://my-bucket-name"
workDir: ${HOME}/tmp/cerbos/work
updatePollInterval: 10s
Minio local container
storage:
driver: "blob"
blob:
bucket: "s3://my-bucket-name?endpoint=localhost:9000&disableSSL=true&s3ForcePathStyle=true®ion=local"
workDir: ${HOME}/tmp/cerbos/work
updatePollInterval: 10s
Disk driver
The disk driver is a way to serve the policies from a directory on the filesystem. Any .yaml, .yml or .json files in the directory tree rooted at the given path will be read and parsed as policies.
Static fileset with no change detection
storage:
driver: disk
disk:
directory: /etc/cerbos/policies
Dynamic fileset with change detection
storage:
driver: disk
disk:
directory: /etc/cerbos/policies
watchForChanges: true
Archive files
Alternatively, you can opt to archive and/or compress your policies directory into a Zip (.zip), Tar (.tar) or Gzip file (.tgz or .tar.gz). The archive is assumed to be laid out like a standard policy directory. It must contain no non-policy YAML files.
You specify the file in your config like so:
Archived fileset using a Zip file
storage:
driver: disk
disk:
directory: /etc/cerbos/policies.zip
Git driver
Git is the preferred method of storing Cerbos policies. The server is smart enough to detect when new commits are made to the git repository and refresh its state based on the changes.
Configuration keys
Git repositories can be local (file protocol) or remote (ssh or https). Please note that the local file protocol requires git to be available and cannot be used with the Cerbos container.
If no branch is specified, the default branch would be the master branch.
If no subDir is specified, the entire repository would be scanned for policies (.yaml, .yml or .json).
The checkoutDir is the working directory of the server and must be writable by the server process.
If updatePollInterval is set to 0, the source repository will not be polled to pick up any new commits.
If operationTimeout is not specified, the default timeout for git operations is 60 seconds.
Local git repository
storage:
driver: "git"
git:
protocol: file
url: file://${HOME}/tmp/cerbos/policies
checkoutDir: ${HOME}/tmp/cerbos/work
updatePollInterval: 10s
Remote git repository accessed over HTTPS
storage:
driver: "git"
git:
protocol: https
url: https://github.com/cerbos/policy-test.git
branch: main
subDir: policies
checkoutDir: ${HOME}/tmp/work/policies
updatePollInterval: 60s
operationTimeout: 30s
https:
username: cerbos
password: ${GITHUB_TOKEN}
Remote git repository accessed over SSH
storage:
driver: "git"
git:
protocol: ssh
url: github.com:cerbos/policy-test.git
branch: main
subDir: policies
checkoutDir: ${HOME}/tmp/cerbos/work
updatePollInterval: 60s
ssh:
user: git
privateKeyFile: ${HOME}/.ssh/id_rsa
Hub driver
Connects the PDP to a Cerbos Hub. Whenever a policy change is detected, the Cerbos Hub CI/CD pipeline compiles, tests and pushes an optimized policy bundle to the PDP.
MySQL driver
The MySQL storage backend is one of the dynamic stores that supports adding or updating policies at runtime through the Admin API.
Using MySQL as a storage backend for Cerbos
storage:
driver: "mysql"
mysql:
dsn: "${MYSQL_USER}:${MYSQL_PASSWORD}@tcp(localhost:3306)/cerbos"
Secure connections
If your MySQL server requires TLS or if you want to use RSA key pair-based password exchange, you can configure those settings as follows:
TLS certificates
storage:
driver: "mysql"
mysql:
dsn: "${MYSQL_USER}:${MYSQL_PASSWORD}@tcp(localhost:3306)/cerbos?tls=mysecuretls"
tls:
mysecuretls:
caCert: /path/to/ca_certificate.crt
cert: /path/to/certificate.crt
key: /path/to/private.key
Server public key
storage:
driver: "mysql"
mysql:
dsn: "${MYSQL_USER}:${MYSQL_PASSWORD}@tcp(localhost:3306)/cerbos?serverPubKey=mypubkey"
serverPubKey:
mypubkey: /path/to/server_public_key.pem
Connection pool
Cerbos uses a connection pool when connecting to a database. You can configure the connection pool settings by adding a connPool section to the driver configuration.
Available options are:
maxLifeTime
The maximum length of time a connection can be reused for. This is useful when your database enforces a maximum lifetime on connections or if you have a load balancer in front of your database to spread the load.
maxIdleTime
How long a connection should be idle for before it is closed. Useful if you want to cleanup idle connections quickly.
maxOpen
Maximum number of connections that can be open at any given time (including idle connections).
maxIdle
Maximum number of idle connections that can be open at any given time.
Connection retries
Cerbos attempts to connect to the database on startup and exits if connection cannot be established after three attempts. You can configure the connection retry settings using the connRetry options.
maxAttempts
Maximum number of connection attempts before giving up
initialInterval
The time to wait before the second connection attempt. Subsequent attempts have increasing wait times (exponential backoff) derived from a combination of this value and the retry attempt number
maxInterval
Maximum amount of time to wait between retries. This affects the maximum value produced by the exponential backoff algorithm.
Database object definitions
You can customise the script below to suit your environment. Make sure to specify a strong password for the cerbos_user user.
CREATE DATABASE IF NOT EXISTS cerbos CHARACTER SET utf8mb4;
USE cerbos;
CREATE TABLE IF NOT EXISTS policy (
id BIGINT PRIMARY KEY,
kind VARCHAR(128) NOT NULL,
name VARCHAR(1024) NOT NULL,
version VARCHAR(128) NOT NULL,
scope VARCHAR(512),
description TEXT,
disabled BOOLEAN default false,
definition BLOB);
CREATE TABLE IF NOT EXISTS policy_dependency (
policy_id BIGINT NOT NULL,
dependency_id BIGINT NOT NULL,
PRIMARY KEY (policy_id, dependency_id),
FOREIGN KEY (policy_id) REFERENCES policy(id) ON DELETE CASCADE);
CREATE TABLE IF NOT EXISTS policy_ancestor (
policy_id BIGINT NOT NULL,
ancestor_id BIGINT NOT NULL,
PRIMARY KEY (policy_id, ancestor_id),
FOREIGN KEY (policy_id) REFERENCES policy(id) ON DELETE CASCADE);
CREATE TABLE IF NOT EXISTS policy_revision (
revision_id INTEGER AUTO_INCREMENT PRIMARY KEY,
action ENUM('INSERT', 'UPDATE', 'DELETE'),
id BIGINT NOT NULL,
kind VARCHAR(128),
name VARCHAR(1024),
version VARCHAR(128),
scope VARCHAR(512),
description TEXT,
disabled BOOLEAN,
definition BLOB);
CREATE TABLE IF NOT EXISTS attr_schema_defs (
id VARCHAR(255) PRIMARY KEY,
definition JSON);
DROP TRIGGER IF EXISTS policy_on_insert;
CREATE TRIGGER policy_on_insert AFTER INSERT ON policy
FOR EACH ROW
INSERT INTO policy_revision(action, id, kind, name, version, scope, description, disabled, definition)
VALUES('INSERT', NEW.id, NEW.kind, NEW.name, NEW.version, NEW.scope, NEW.description, NEW.disabled, NEW.definition);
DROP TRIGGER IF EXISTS policy_on_update;
CREATE TRIGGER policy_on_update AFTER UPDATE ON policy
FOR EACH ROW
INSERT INTO policy_revision(action, id, kind, name, version, scope, description, disabled, definition)
VALUES('UPDATE', NEW.id, NEW.kind, NEW.name, NEW.version, NEW.scope, NEW.description, NEW.disabled, NEW.definition);
DROP TRIGGER IF EXISTS policy_on_delete;
CREATE TRIGGER policy_on_delete AFTER DELETE ON policy
FOR EACH ROW
INSERT INTO policy_revision(action, id, kind, name, version, scope, description, disabled, definition)
VALUES('DELETE', OLD.id, OLD.kind, OLD.name, OLD.version, OLD.scope, OLD.description, OLD.disabled, OLD.definition);
CREATE USER IF NOT EXISTS cerbos_user IDENTIFIED BY 'changeme';
GRANT SELECT,INSERT,UPDATE,DELETE ON cerbos.policy TO cerbos_user;
GRANT SELECT,INSERT,UPDATE,DELETE ON cerbos.attr_schema_defs TO cerbos_user;
GRANT SELECT,INSERT,UPDATE,DELETE ON cerbos.policy_dependency TO cerbos_user;
GRANT SELECT,INSERT,UPDATE,DELETE ON cerbos.policy_ancestor TO cerbos_user;
GRANT SELECT,INSERT ON cerbos.policy_revision TO cerbos_user;