Get started

Security at BoardScore

Your governance data demands the same rigour you apply to your clients. BoardScore is engineered with defence-in-depth security — encryption, isolation, and access controls at every layer.

AES-256 encryption at rest

Sensitive data is encrypted with AES-256-GCM before it reaches the database. Each value gets a unique initialisation vector, and personally identifiable fields are encrypted at the column level.

TLS encryption in transit

All traffic is encrypted via TLS with automatic certificate management. Strict security headers including Content Security Policy and clickjacking protection are enforced on every response.

Tenant-isolated architecture

Every organisation operates in its own isolated database schema. There is no shared table where your data could mingle with another tenant's — complete data separation at the infrastructure level.

Role-based access control

Five distinct roles — from viewer to administrator — each with explicit capability grants. Every permission change is audit-logged with full attribution.

Immutable audit trail

Every assessment, approval, role change, and access decision is logged with full attribution. Permission grants and denials are recorded — the evidence trail regulators expect.

Delegated authentication

Identity management is handled by a dedicated identity provider. JWT tokens are validated against public keys on every request, with immediate revocation on logout.

Rate limiting & brute-force protection

Per-IP rate limiting operates at both the reverse proxy and application layers. Failed authentication attempts are tracked and throttled to protect against credential-stuffing attacks.

Minimal attack surface

The production runtime uses a distroless container image with no shell, no package manager, and runs as a non-root user. Pre-commit secret scanning prevents credentials from entering the codebase.

Security in depth

A closer look at how BoardScore protects your data across every layer of the stack.

Encryption at rest

BoardScore uses AES-256-GCM authenticated encryption to protect sensitive data at the application level before it is written to the database. This is not full-disk encryption — it is field-level encryption applied to personally identifiable information such as email addresses, organisation names, and IP addresses.

Each encrypted value receives a unique 12-byte initialisation vector generated via a cryptographically secure random source. Encrypted values are stored with a version prefix to support future key rotation. For fields that require exact-match lookups, HMAC-SHA256 deterministic hashing is used alongside encryption.

AES-256-GCM
Per-value IV
HMAC-SHA256
Column-level PII encryption

Encryption in transit

All client-server communication is encrypted via TLS, with certificates automatically provisioned and renewed. The application enforces security headers on every response: Content Security Policy with frame-ancestors 'none', X-Frame-Options DENY, X-Content-Type-Options nosniff, and strict referrer policies.

CORS is configured to accept requests only from explicitly allowed origins. Credentials are transmitted via bearer tokens in the Authorization header — never in cookies or URL parameters.

TLS
Automatic certificates
CSP
CORS
Security headers

Multi-tenant data isolation

BoardScore implements schema-per-tenant isolation in PostgreSQL. Each organisation's data resides in a dedicated database schema, and every request sets the database search path to the authenticated tenant's schema before executing any query.

A tenant schema registry validates that only provisioned schemas can be queried — preventing access to non-existent or unauthorised schemas. There are no shared data tables between tenants. Cross-tenant data access is architecturally impossible through normal application pathways.

Schema-per-tenant
PostgreSQL search_path
Registry validation
No shared tables

Authentication

Authentication is delegated to Kinde, a dedicated identity provider. The application never stores passwords. User sessions are managed via RSA256-signed JWT tokens, validated on every request against the provider's JWKS (JSON Web Key Set) endpoint.

Token validation checks signature, issuer, audience, and required claims including organisation, email, and roles. A server-side token blacklist ensures that revoked tokens — such as those invalidated on logout — are rejected immediately. Blacklisted tokens are hashed with SHA-256 before storage.

Kinde IdP
RSA256 JWT
JWKS validation
Token blacklist
SHA-256 hashing

Authorisation and access control

BoardScore implements role-based access control with a five-tier role hierarchy: Super Admin, Organisation Admin, Approver, Assessor, and Viewer. Each role maps to a defined set of capabilities such as managing users, approving assessments, generating reports, or viewing AI usage.

Authorisation checks are enforced at the route level — each API endpoint declares the capabilities it requires. Access denials are logged to a permission audit trail that records the user, action, IP address (encrypted), and timestamp. Protected admin domains prevent removal of critical administrative access from key personnel.

5-tier RBAC
Capability-based permissions
Route-level enforcement
Permission audit log

Audit logging

Every record in BoardScore carries audit metadata: who created it, who last updated it, and when. Permission changes — grants, revocations, and denials — are logged to a dedicated audit table with the acting user, affected user, timestamp, and encrypted IP address.

Structured logging with categorised log levels (Security, Audit, Business Logic, API) flows into centralised observability via OpenTelemetry. Request tracing with correlation IDs allows security events to be traced end-to-end across the stack.

Full attribution
Permission audit trail
OpenTelemetry
Structured logging
Request tracing

Input validation and injection prevention

All user input is validated through a typed validation framework with three levels: domain rules (required fields, formats), business rules (context-dependent checks), and policy rules (permissions, rate limits). Request bodies are deserialised and validated before reaching any business logic.

All database queries use the Exposed ORM with parameterised statements — there are no raw SQL strings in the application. This eliminates SQL injection by construction, not convention.

Typed validation framework
Parameterised queries
No raw SQL
Three-tier validation

Infrastructure and deployment

The production backend runs on Google's distroless Java 21 base image — a minimal container with no shell, no package manager, and no unnecessary system utilities. The application runs as a non-root user with a read-only filesystem where possible.

Database access uses a two-user model: a migration user with DDL privileges for schema changes, and an application user with only DML privileges for data operations. This separation of privilege limits the blast radius of any application-level compromise. Connection pooling with leak detection and validation timeouts ensures database connections are managed safely.

Distroless containers
Non-root execution
Privilege separation
Connection pool hardening

Secret management

All secrets — API keys, encryption keys, database credentials — are injected via environment variables at runtime. No credentials are stored in the codebase. A gitleaks pre-commit hook scans every commit for accidental secret exposure, with custom rules for JWT secrets, database URLs, API keys, private keys, and certificates.

Environment variable injection
Gitleaks pre-commit scanning
No secrets in code

Compliance alignment

BoardScore's security controls align with the expectations of major Australian and international standards. While we do not hold formal certifications, our architecture is designed to support organisations working toward these frameworks.

OWASP Top 10

  • Parameterised queries prevent injection
  • JWT-based auth with token revocation
  • Input validation at every boundary
  • Security headers on all responses
  • Dependency scanning in CI pipeline

Australian Privacy Principles

  • Column-level PII encryption (AES-256-GCM)
  • Australian-hosted infrastructure
  • Schema-per-tenant data isolation
  • Audit trail for all data access
  • IP address encryption in logs

CPS 234 / Essential Eight

  • Role-based access control with capability model
  • Multi-factor authentication via identity provider
  • Automated patching via container rebuilds
  • Rate limiting and brute-force protection
  • Immutable audit logging

ISO 27001 Alignment

  • Encryption at rest and in transit
  • Access control with least privilege
  • Separation of duties (migration vs app DB user)
  • Incident-ready audit trail
  • Secret management and rotation support

SOC 2 Alignment

  • Logical tenant isolation
  • Change management via version control
  • Availability monitoring with OpenTelemetry
  • Permission change audit logging
  • Encrypted PII at rest

NIST CSF 2.0

  • Identify: asset classification via tenant registry
  • Protect: encryption, RBAC, input validation
  • Detect: structured logging and observability
  • Respond: token revocation and rate limiting
  • Recover: immutable audit trail for forensics

Data sovereignty

BoardScore is Australian-built and Australian-hosted. Your data never leaves Australian infrastructure, and tenant isolation ensures no organisation can access another's data.

Australian-built
Australian-hosted
Data sovereignty
Schema-per-tenant isolation
AES-256-GCM encryption
Full audit trail

Questions about security?

We're happy to discuss our security architecture in detail. Reach out and we'll walk you through how BoardScore protects your governance data.

Contact security team