Skip to content

Audit & Compliance

Concourse logs security-relevant events to a separate audit database for SOC 2 Type II compliance.

ActionDescription
loginSuccessful login
login_failedFailed login attempt
permission_deniedUnauthorized access attempt
user.createdUser created
user.updatedUser role changed
user.deletedUser deleted
board.createdBoard created
workspace.createdWorkspace created
workspace_member.addedMember added to workspace
relay.createdRelay registered
agent.createdAgent created
connection.querySQL query executed via relay
connection.introspectSchema introspection via relay

Each event includes: timestamp, actor (user ID, email, IP), action, resource type/ID, outcome, and request ID.

The audit database is separate from the primary application database. This provides tamper resistance — application-level database access cannot modify audit records.

Default: file:///data/audit.db (SQLite on the same volume). For production: consider using a remote Turso instance: AUDIT_DATABASE_URL=libsql://audit-db.turso.io

Forward audit events to your SIEM or security monitoring system:

audit:
webhook:
enabled: true
url: https://siem.example.com/api/events
headers:
Authorization: Bearer ${AUDIT_WEBHOOK_TOKEN}
batch_size: 100
flush_interval_secs: 5
timeout_secs: 30

Events are batched (default 100 events or 5 seconds, whichever comes first) and POSTed as JSON arrays. Webhook failures are logged but do not block request processing.

Audit events record the client IP address. If Concourse is behind a reverse proxy, ensure the proxy sets X-Forwarded-For or X-Real-IP headers so the correct client IP is logged.