Sigaint secret server.
  • Python 73.9%
  • HTML 18.7%
  • CSS 4.4%
  • JavaScript 2%
  • Shell 0.8%
  • Other 0.1%
Find a file
Mark Hahl df2b5607cf
Some checks failed
CI / tox py + lint (push) Has been cancelled
Require explicit reveal for shared secrets
Shared secrets now show metadata only to non-team members; the secret value is hidden until the user clicks a Reveal button which requests ?reveal=1. Added reveal_pending and reveal_url args to the secret view renderer, a new secret-panel branch that renders an HTMX Reveal button, and URL handling in secret_view to decrypt+audit only on explicit reveal. Also minor CSS selector adjustment and removal of an unused empty-message in requests_table. Tests added to cover gated and explicit reveal behavior.
2026-09-04 15:23:45 +10:00
.forgejo/workflows release: cut 2026.8.23.1 2026-08-23 03:29:21 +00:00
.github fix(security): close code-scanning alerts for stack traces and workflow token 2026-08-26 07:50:07 +10:00
.opencode fix agentsmds 2026-08-30 20:15:15 +10:00
app Require explicit reveal for shared secrets 2026-09-04 15:23:45 +10:00
db Add sign-in failures and audit self-service events 2026-09-04 14:34:06 +10:00
deploy Add sync-directory job with safer LDAP deprovisioning 2026-09-03 15:06:36 +10:00
docs Add sign-in failures and audit self-service events 2026-09-04 14:34:06 +10:00
scripts seed: set scopes on custom roles so bindings pass validation 2026-09-03 19:12:22 +10:00
softhsm2 docs/external-secrets (#19) 2026-08-23 02:55:28 +00:00
tests Require explicit reveal for shared secrets 2026-09-04 15:23:45 +10:00
.env initial cocmmit 2026-08-04 03:08:43 +00:00
.env.example review: security, UX, DX, and docs hardening; vendor oat/htmx 2026-08-17 10:27:27 +10:00
.gitignore Remove local env and ignore tooling 2026-09-03 15:34:05 +10:00
.pre-commit-config.yaml review: security, UX, DX, and docs hardening; vendor oat/htmx 2026-08-17 10:27:27 +10:00
.pylintrc review: security, UX, DX, and docs hardening; vendor oat/htmx 2026-08-17 10:27:27 +10:00
AGENTS.md Change C: catalog-driven team roles plus squash migrations to 0001 2026-09-03 18:09:37 +10:00
CHANGELOG.md Support metadata fetches and notify filter 2026-08-31 17:26:32 +10:00
compose.yml feat(webhooks): database-backed webhook delivery queue and worker 2026-08-26 14:44:04 +10:00
CONTRIBUTING.md release: cut 2026.8.23.1 2026-08-23 03:29:21 +00:00
DESIGN.md fix(profile): keep tab and scope on my-access search 2026-08-27 13:54:38 +10:00
Dockerfile Disable gunicorn control socket in the container 2026-09-01 06:54:39 +00:00
LICENSE docs: add licence 2026-08-08 10:20:39 +10:00
Makefile Add Sigaint docs theme and docs build/serve scripts 2026-09-03 11:45:35 +10:00
mkdocs.yml Add sync-directory job with safer LDAP deprovisioning 2026-09-03 15:06:36 +10:00
PRODUCT.md ui: tidy page 2026-08-27 08:33:32 +10:00
pyproject.toml Add Playwright live UI smoke tests 2026-08-28 13:37:34 +10:00
README.md docs(webhooks): add webhook reference for events, payloads, signatures 2026-08-27 11:25:08 +10:00
SECURITY.md release: cut 2026.8.23.1 2026-08-23 03:29:21 +00:00
THIRD_PARTY.md fix(build): install SoftHSM from AlmaLinux AppStream on the UBI dev image 2026-08-23 05:33:14 +00:00
tox.ini review: security, UX, DX, and docs hardening; vendor oat/htmx 2026-08-17 10:27:27 +10:00

Corvus

Corvus

Self-hosted secrets management for engineering teams. Centralize credentials, certificates, and configuration with role-based access control enforced at the database level, full audit logging, and integrations for CI/CD and Kubernetes.

This repository is a mirror of https://git.sigaint.au/Sigaint/corvus

Live demo

Open https://secretserver-dev.sigaint.au and sign in with the seeded mock accounts (password is password for all of them):

Role Email
Global admin admin@example.com
Engineer alice@example.com
Ops bob@example.com
Viewer carol@example.com
Contractor dave@example.com

This instance is for evaluation only. Do not store real secrets there.

Overview

Corvus organizes access around a team → project → secret hierarchy. Authorization is enforced by PostgreSQL Row-Level Security (RLS), not application code alone: the database itself rejects rows a caller is not allowed to read or write. Secret values are encrypted at rest with a managed master key; projects can optionally use their own dedicated encryption key.

Access is available through three interfaces:

  • Browser UI for daily operations: search, bulk actions, version history, reveal approvals, import/export
  • Unified secret API (/eso/v1) for machines and pipelines, using machine tokens or personal access tokens
  • PostgREST API for SQL-style queries from metadata and org tooling, plus an External Secrets Operator webhook provider for Kubernetes

Key capabilities

Access control

  • Role-based access control at team, project, and secret scope, backed by directory groups over LDAP/OIDC
  • Per-secret modes: inherit project permissions, or restrict to explicit bindings only
  • Reveal approval workflow with time-limited grants
  • Personal access tokens and scoped machine accounts with key allow-lists
  • TOTP two-factor authentication with single-use recovery codes

Operations

  • Secret expiry with overdue/soon dashboards
  • Soft-delete trash, version history, structured kinds (database URL, certificate, SSH key, key/value)
  • Custom searchable metadata per secret
  • Bulk import/export in .env, JSON, and CSV formats
  • Audit logs with access review, export, and retention purge
  • Optional classification banners per server or team

Integrations

  • External Secrets Operator: pull (ExternalSecret), push (PushSecret)
  • LDAP and OIDC single sign-on with group mapping
  • SMTP notifications: password reset, login alerts, verification emails

Security model

Layer Control
Encryption Fernet (AES-128-CBC + HMAC) at rest via MASTER_KEY; optional per-project data-encryption keys
Authorization PostgreSQL RLS policies; SECURITY DEFINER functions for auth flows
Sessions Server-side sessions with per-device revocation
Hardening Login lockout (5 attempts / 5 minutes), bcrypt password hashing in SQL

For responsible disclosure, see SECURITY.md.

Quick start (local)

export GLOBAL_ADMIN_EMAIL=you@example.com
ALLOW_INSECURE_DEFAULTS=1 podman-compose up -d --build
# UI: http://localhost:8080  → register as you@example.com (becomes global admin)
# PostgREST: http://localhost:3000

ALLOW_INSECURE_DEFAULTS=1 is for local evaluation only. Production deploys require strong generated secrets; the app refuses to start without them.

To discard local data and reseed:

scripts/reset.sh       # asks for confirmation
scripts/reset.sh --yes # non-interactive

This removes only pgdata; HSM state remains in hsmdata.

Deployment

Schema changes ship as ordered SQL migrations applied automatically at startup; existing databases upgrade in place.

Documentation

Users

Doc Contents
docs/user/guide.md Using the UI: teams, projects, secrets, reveal, access requests, metadata, import/export
docs/user/cli.md CLI install + usage (get / apply / reveal / approve / deny)

Administrators

Doc Contents
docs/admin/deploy.md Deploy, first-run bootstrap, Kubernetes
docs/admin/configuration.md All environment variables and server settings
docs/admin/rbac.md Roles, groups, project/secret permissions, setup checklist
docs/admin/authentication.md Session, PAT, JWT, machine token, OIDC, LDAP, SMTP, password reset
docs/admin/machine-tokens.md Machine accounts, key allow-lists
docs/admin/external-secrets.md External Secrets Operator: pull, push, copy-paste YAML
docs/admin/webhooks.md Webhooks: events, payloads, signature verification
docs/admin/audit.md Audit logs, access review, export, retention
docs/admin/backup.md Backup and restore

Developers

Doc Contents
docs/dev/architecture.md Architecture, components, request flow
docs/dev/database.md Schema, RLS policies, SECURITY DEFINER functions
docs/dev/api.md API reference: /eso/v1, PostgREST, app JSON
docs/dev/building.md Build & push container images
docs/dev/testing.md Running tests and lint
docs/dev/docs-site.md MkDocs documentation site: preview, build, deploy
docs/dev/contributing.md Contribution guide

Development

Unit tests use pytest against a mocked database; no Postgres required.

pip install -e ".[dev]"
pytest

See docs/dev/testing.md.

License

GNU Affero General Public License v3.0 (AGPL-3.0). Corresponding source is this repository. Third-party works shipped with the app (htmx, Oat, Python libraries) are listed in THIRD_PARTY.md.