elsa-core/specs/007-secrets-module/data-model.md
Sipke Schoorstra e2e00ff235
Add secrets module (#7468)
* Add secrets module

* Address Greptile feedback for secrets module

* Handle unavailable secrets in provider adapter

* Address path combine review comments

* Address additional Greptile secrets review

* Address final Greptile secrets feedback

* Handle secrets test payload failures

* address greptile feedback on secrets rotation

* fix secret recreation concurrency

* address greptile secrets followups

* address greptile secrets reliability feedback

* align secret store capabilities
2026-05-20 11:48:01 +02:00

4.8 KiB

Data Model: Secrets Module

Secret

Logical named secret referenced by workflows and modules.

  • TechnicalName: immutable unique name used by references and exports.
  • DisplayName: optional user-facing label.
  • Description: optional safe metadata.
  • Type: secret type identifier.
  • Scope: optional classification used by pickers and consumers.
  • Tags: optional safe labels.
  • StoreName: selected store identifier.
  • Status: active, retired, expired, revoked, or deleted.
  • TenantId, Owner, CreatedAt, UpdatedAt: operational metadata.
  • LatestVersionNumber: current active version number.

Validation:

  • TechnicalName is required, trimmed, case-normalized for uniqueness, and immutable after creation.
  • Metadata must not contain raw secret values.
  • Only one latest active version may exist for a technical name.

SecretVersion

Versioned value or external-reference payload for a secret.

  • SecretTechnicalName: parent technical name.
  • Version: monotonically increasing version number.
  • Status: active, retired, expired, or revoked.
  • ProtectedPayload: provider-private encrypted value or lookup metadata.
  • PayloadContentType: store/type-specific payload descriptor.
  • ExpiresAt: optional expiration time.
  • CreatedAt, UpdatedAt, RetiredAt, RevokedAt: lifecycle timestamps.

State transitions:

  • Create: no version -> version 1 active latest.
  • Rotate/update: current active latest -> retired, new version -> active latest.
  • Expire: active -> expired.
  • Revoke: active or retired -> revoked.
  • Delete: logical secret becomes unavailable; provider decides whether versions are hard-deleted or tombstoned.

SecretReference

Serializable value stored in workflow definitions and module settings.

  • TechnicalName: immutable secret technical name.
  • RequiredType: optional expected secret type.
  • RequiredScope: optional expected scope.

Resolution:

  • Resolve by TechnicalName.
  • Return the latest active version only.
  • Fail for missing, expired, revoked, deleted, incompatible type, incompatible scope, or unavailable store.

SecretTypeDescriptor

Registered metadata for a secret type.

  • Type: stable type name.
  • DisplayName: safe user-facing label.
  • Description: safe help text.
  • SupportedStoreCapabilities: required read/write/list/export/test capabilities.
  • EditorContract: Studio editor descriptor and validation metadata.
  • CanGenerate: whether the type can generate payloads server-side.
  • CanExportEncrypted: whether encrypted export is supported.

Built-in v1 types:

  • Text: standard string value.
  • RsaKey: generated or provided RSA key material.
  • X509CertificateReference: certificate reference metadata, not private certificate material.

SecretStoreDescriptor

Registered metadata for a store implementation.

  • Name: stable store identifier.
  • DisplayName: safe user-facing label.
  • Description: safe help text.
  • Capabilities: read, write, list, delete, rotate, test, encrypted export.
  • SupportedTypes: secret types the store can handle.
  • IsDefault: whether new secrets use this store when no explicit store is selected.

V1 stores:

  • ElsaEncrypted: writable Elsa-managed encrypted store.
  • Configuration: read-only deployment configuration store.

SecretPayload

Store-owned payload attached to a version.

  • StoreName: store that owns the payload.
  • Type: secret type.
  • ProtectedData: encrypted value or provider-private lookup metadata.
  • Metadata: safe store/type metadata for diagnostics and pickers.

Rules:

  • General metadata APIs never return ProtectedData.
  • Provider-private metadata is not exposed outside store-specific boundaries.
  • Cleartext is not persisted in workflow definitions, module settings, logs, audit events, or general API responses.

SecretImportItem

Safe import/export package representation.

  • TechnicalName: target secret name.
  • Type, Scope, Description: safe metadata.
  • StoreName: requested target store.
  • ReferenceOnly: whether no value is included.
  • EncryptedPayload: optional payload encrypted for the import target.
  • ConflictBehavior: create-new, update/rotate, skip, or unspecified.

Rules:

  • Same-name conflicts fail when ConflictBehavior is unspecified.
  • Encrypted payload import requires matching decryption material.
  • Reference-only import creates or validates metadata without importing a value.

SecretAuditEvent

Security event emitted for privileged operations.

  • Action: create, update, rotate, revoke, delete, test, runtime-use, encrypted-export, import, failed-privileged-operation.
  • TechnicalName: affected secret.
  • Actor: user or system identity.
  • Timestamp: event time.
  • Reason: optional user-provided reason.
  • Result: success or failure.

Rules:

  • Audit events never include raw secret values, encrypted payloads, or provider-private metadata.