Secrets

Overview

openDesk derives the credentials of its components from MASTER_PASSWORD and provisions them as Kubernetes Secrets through the opendesk-secrets release. Instead, a deployment can bring its own Secrets (existing secrets) and have openDesk reference them.

The secrets are defined in the following files of helmfile/environments/default/, each under its own root key: secrets.yaml.gotmpl (secrets), database.yaml.gotmpl (databases), objectstores.yaml.gotmpl (objectstores), cache.yaml.gotmpl (cache), smtp.yaml.gotmpl (smtp), ai.yaml.gotmpl (ai) and sip.yaml.gotmpl (sip). Every secret there is documented inline; these comments are the source of the list below, which is generated with dev/secrets-doc.py:

    # Purpose: Redis access of Notes.
    # Existing secret: `create: false` is supported.
    # Rotation: TBD.
    # Limitation: The password has to be URL-safe or percent-encoded.

Structure of a secret

secrets:
  minio:
    rootPassword:
      value: "..."                       # The secret itself, derived from MASTER_PASSWORD by default.
      create: true                       # true: openDesk creates the Secret from `value`.
      name: "minio-root-password"        # Name of the Kubernetes Secret.
      key: "root-password"               # Key holding the secret within the Kubernetes Secret.
      extraData:                         # Optional: further keys of the same Secret some consumers need.
        root-user: "admin"

Only simple secrets are supported: one key holding the secret string, plus optional further simple keys (extraData, listed in the column “Special”). Structured content, e.g. JSON documents, is not supported as a secret.

Bringing your own Secret

  1. Create the Kubernetes Secret in the openDesk namespace before deploying, with the key named in key and the keys listed in the column “Special”, if any.

  2. Set create: false and point name and key to it in your environment’s values, e.g.:

    secrets:
      keycloak:
        adminPassword:
          create: false
          name: "my-keycloak-admin"
          key: "password"

For secrets with partial support, some consumers still read the literal value (see “Limitations”): set value to the same string as your Secret as well, or the components end up with different credentials.

Status of all secrets

Legend

ColumnStatusMeaning
Existing secret🟢Supported: all consumers read the Secret.
Existing secret🟡Partially supported: some consumers still read the literal value, see “Limitations”.
Existing secret🔴Not supported: the secret has no Secret indirection.
Rotation🟢Rotation is possible.
Rotation🟡Rotation is possible, but requires more, e.g. a Pod restart, see “Limitations”.
Rotation🔴Rotation is not supported by openDesk.
Rotation⚪Rotation is not supported by the upstream component.
RotationTBDNot determined yet.

“Special” lists a key the consumer does not allow to change, further keys the Secret has to carry, or a deviating structure.

List

135 secrets - existing secret: 99 🟢, 19 🟡, 17 🔴 - rotation: 1 🟢, 3 🟡, 2 🔴, 0 ⚪, 129 TBD.

Root keyPathPurposeExisting secretRotationSpecialLimitations
secretscassandra.rootPasswordCassandra admin (Dovecot EE storage).🟢TBDFixed key: cassandra-password
secretsoxAppSuite.adminPasswordOX App Suite master admin (OX Connector, migrations).🟡TBDOX App Suite still renders value into its configuration.
secretsoxAppSuite.basicAuthPasswordOX App Suite internal basic auth.🔴TBDOX App Suite renders value into its configuration.
secretsoxAppSuite.cookieHashSaltOX App Suite cookie hash salt.🔴TBDOX App Suite renders value into its configuration.
secretsoxAppSuite.hzGroupPasswordOX App Suite Hazelcast group (unused).🔴TBDOX App Suite renders value into its configuration.
secretsoxAppSuite.jolokiaPasswordOX App Suite Jolokia monitoring.🔴TBDOX App Suite renders value into its configuration.
secretsoxAppSuite.migrationsMasterPasswordOX App Suite and Dovecot master login for migrations.🟡TBDOX App Suite still renders value into its properties Secret.
secretsoxAppSuite.oxguardMCOX Guard master key.🔴TBDOX App Suite renders value into its configuration.
secretsoxAppSuite.oxguardRCOX Guard recovery key.🔴TBDOX App Suite renders value into its configuration.
secretsoxAppSuite.restApiPasswordOX App Suite REST API (Dovecot, OX Guard).🟡TBDOX App Suite still renders value into its properties Secret.
secretsoxAppSuite.sessiondEncryptionKeyOX App Suite session encryption.🔴TBDOX App Suite renders value into its configuration.
secretsoxAppSuite.shareCryptKeyOX App Suite share link encryption.🔴TBDOX App Suite renders value into its configuration.
secretsoxAppSuite.synapseAsTokenOX App Suite Matrix appservice token.🟡TBDOX App Suite still renders value into its configuration.
secretsoxConnector.provisioningApiPasswordOX Connector access to the Nubus provisioning API.🟡TBDThe Nubus consumer registration still embeds value.
secretspostfix.opendeskSystemPasswordSMTP account for system mails (all components).🟡TBDExtra key: OPENPROJECT_SMTP__PASSWORDThe extra key OPENPROJECT_SMTP__PASSWORD has to state the same password. OX App Suite still renders value into its configuration.
secretsnubus.masterpasswordSeed for further Nubus passwords.🔴TBDSeed the other Nubus passwords are derived from, not a credential of its own.
secretsnubus.ldapSecretLDAP cn=admin (Nubus, migrations).🟢TBD
secretsnubus.ldapSearch.keycloakLDAP bind user of Keycloak.🟡TBDNubus stack-data-ums still creates the LDAP bind user from value.
secretsnubus.ldapSearch.nextcloudLDAP bind user of Nextcloud.🟡TBDNubus stack-data-ums still creates the LDAP bind user from value.
secretsnubus.ldapSearch.dovecotLDAP bind user of Dovecot.🟡TBDNubus stack-data-ums still creates the LDAP bind user from value.
secretsnubus.ldapSearch.oxLDAP bind user of OX App Suite.🔴TBDOX App Suite and Nubus take the literal value.
secretsnubus.ldapSearch.postfixLDAP bind user of Postfix.🟡TBDNubus stack-data-ums still creates the LDAP bind user from value.
secretsnubus.ldapSearch.openprojectLDAP bind user of OpenProject.🟡TBDNubus stack-data-ums still creates the LDAP bind user from value.
secretsnubus.ldapSearch.xwikiLDAP bind user of XWiki.🟡TBDNubus stack-data-ums still creates the LDAP bind user from value.
secretsnubus.systemAccounts.administratorPasswordNubus Administrator account.🔴TBDThe Nubus charts take the literal value.
secretsnubus.portalConsumer.provisioningApiPasswordNubus portal consumer of the provisioning API.🔴TBDThe consumer chart renders the registration document into the same Secret and skips it once the password is externalized (https://github.com/univention/univention-portal/pull/3, https://github.com/univention/provisioning-api/pull/3).
secretsnubus.selfserviceConsumer.provisioningApiPasswordNubus self-service consumer of the provisioning API.🔴TBDThe consumer chart renders the registration document into the same Secret and skips it once the password is externalized (https://github.com/univention/self-service-consumer/pull/2, https://github.com/univention/provisioning-api/pull/3).
secretsnubus.provisioning.api.adminPasswordNubus provisioning API admin.🟢TBD
secretsnubus.provisioning.api.natsPasswordNubus provisioning API NATS user.🟢TBD
secretsnubus.provisioning.api.prefillPasswordNubus provisioning prefill API user.🟢TBD
secretsnubus.provisioning.api.udmTransformerPasswordNubus provisioning UDM transformer API user.🟢TBD
secretsnubus.provisioning.dispatcherNatsPasswordNubus provisioning dispatcher NATS user.🟢TBD
secretsnubus.provisioning.prefillNatsPasswordNubus provisioning prefill NATS user.🟢TBD
secretsnubus.provisioning.udmListenerNatsPasswordNubus provisioning UDM listener NATS user.🟢TBD
secretsnubus.provisioning.udmTransformerNatsPasswordNubus provisioning UDM transformer NATS user.🟢TBD
secretsnubus.provisioning.synapse.apiPasswordMatrix provisioning consumer of the provisioning API.🔴TBDThe provisioning-connector chart renders the registration document into the same Secret and skips it once the password is externalized (opendesk-provisioning-connector!5, https://github.com/univention/provisioning-api/pull/3).
secretsnats.natsAdminPasswordNubus NATS admin.🟢TBD
secretspostgresql.postgresUserBundled PostgreSQL superuser.🟢🟡PostgreSQL applies it only when initializing an empty data directory, so a rotation has to change it on the server (ALTER USER) as well.
secretsmariadb.rootPasswordBundled MariaDB root (OX App Suite, XWiki on MariaDB).🟡TBDOX App Suite still renders value into its configuration.
secretsmariadb.openxchangeUserMariaDB user of OX App Suite.🟢TBD
secretsminio.rootPasswordS3 admin of SeaweedFS (or legacy MinIO).🟢TBDExtra key: root-user
secretskeycloak.adminPasswordKeycloak admin (Keycloak, bootstrap, Guardian, Intercom Service).🟢TBD
secretskeycloak.clientSecret.dovecotOIDC client of Dovecot.🟢TBD
secretskeycloak.clientSecret.dovecotGrantOIDC password grant client of Dovecot.🟢TBD
secretskeycloak.clientSecret.intercomOIDC client of the Intercom Service.🟢TBD
secretskeycloak.clientSecret.matrixOIDC client of Matrix (MAS).🟢TBD
secretskeycloak.clientSecret.ncoidcOIDC client of Nextcloud.🟢TBD
secretskeycloak.clientSecret.openprojectOIDC client of OpenProject.🟢TBD
secretskeycloak.clientSecret.xwikiOIDC client of XWiki.🟢TBD
secretskeycloak.clientSecret.as8oidcOIDC client of OX App Suite.🟡TBDOX App Suite still renders value into its configuration.
secretskeycloak.clientSecret.notesOIDC client of Notes.🟢TBD
secretskeycloak.clientSecret.umcServerOIDC client of the Nubus UMC server.🟢TBD
secretsnextcloud.adminPasswordNextcloud admin (Nextcloud, OpenProject bootstrap).🟢TBD
secretsnextcloud.metricsTokenNextcloud metrics exporter.🟢TBD
secretsnextcloud.statusPasswordNextcloud status page (OpenProject bootstrap).🟢TBD
secretsopenproject.adminPasswordOpenProject internal admin.🟢TBD
secretsopenproject.apiAdminPasswordOpenProject API admin (OpenProject bootstrap).🟢TBDExtra key: username
secretsopenproject.hocuspocusSecretOpenProject collaborative editing (Hocuspocus).🟢🟡Rotating it needs a restart of the OpenProject and Hocuspocus pods; only the short-lived collaborative editing tokens become invalid.
secretsopenproject.secretKeyBaseOpenProject cookies and signed links.🟢🟡Rotating it invalidates all cookies and signed links, so users have to log in again.
secretsopenproject.databaseCipherKeyOpenProject encryption of stored credentials.🟢🟢OpenProject currently only encrypts the LDAP bind password and SCM repository credentials with it. openDesk re-seeds its LDAP connection and SCM integration isn’t supported in the OpenProject container image used by openDesk. Opt-in via enabled: true. OpenProject cannot decrypt a value whose ciphertext exceeds 45 bytes (the base64 encoding then contains a line break), e.g. the default 40 character LDAP bind password, so OpenProject would bind with the encrypted string. Without the key the LDAP bind password is stored unencrypted in the database.
secretscollabora.adminPasswordCollabora admin console.🟢TBDExtra key: username
secretsjitsi.jwtAppSecretJitsi JWT signing (Prosody, Keycloak adapter).🟢TBDFixed key: JWT_APP_SECRET
secretsjitsi.jicofoAuthPasswordJitsi Jicofo XMPP user.🟢TBDFixed key: JICOFO_AUTH_PASSWORD
secretsjitsi.jvbAuthPasswordJitsi videobridge XMPP user.🟢TBDFixed key: JVB_AUTH_PASSWORD; Extra key: JVB_AUTH_USER
secretsjitsi.jibriXmppPasswordJitsi Jibri XMPP user.🟢TBDFixed key: JIBRI_XMPP_PASSWORD; Extra key: JIBRI_XMPP_USER
secretsjitsi.jibriRecorderPasswordJitsi Jibri recorder user.🟢TBDFixed key: JIBRI_RECORDER_PASSWORD; Extra key: JIBRI_RECORDER_USER
secretsjitsi.jigasiXmppPasswordJitsi Jigasi XMPP user.🟢TBDFixed key: JIGASI_XMPP_PASSWORD; Extra key: JIGASI_XMPP_USER
secretscentralnavigation.apiKeyCentral navigation (portal, Nextcloud, OpenProject, XWiki, Intercom).🟢TBD
secretsdovecot.doveadmDovecot doveadm API (OX App Suite).🟡TBDOX App Suite still renders value into its configuration.
secretsdovecot.sharedMailboxesMasterPasswordDovecot master login for shared mailboxes.🟢TBD
secretsxwiki.superadminpasswordXWiki superadmin (debug only).🟢TBD
secretsintercom.secretIntercom Service sessions.🟢TBD
secretsintercom.synapseAsTokenIntercom Service Matrix appservice token.🟢TBD
secretselementSupervision.hsTokenElement Supervision appservice HS token (EE).🟢TBD
secretselementSupervision.backupPassphraseElement Supervision key backup (EE).🟢TBD
secretselementSupervision.passwordElement Supervision bot account (EE).🟢TBD
secretselementSupervision.synapseAsTokenElement Supervision appservice AS token (EE).🟢TBD
secretselementAuditbot.hsTokenElement Auditbot appservice HS token (EE).🟢TBD
secretselementAuditbot.backupPassphraseElement Auditbot key backup (EE).🟢TBD
secretselementAuditbot.passwordElement Auditbot bot account (EE).🟢TBD
secretselementAuditbot.synapseAsTokenElement Auditbot appservice AS token (EE).🟢TBD
secretsmatrixAuthenticationService.matrixToolsOIDCClientSecretMAS client of the Matrix tools (EE).🟢TBD
secretsmatrixAuthenticationService.encryptionSecretMAS encryption of stored secrets.🟢TBD
secretsmatrixAuthenticationService.synapseSharedSecretMAS to Synapse.🟢TBD
secretsmatrixAuthenticationService.privateKeyRSAMAS token signing (RSA).🟢TBD
secretsmatrixAuthenticationService.privateKeyECDSAPrime256v1MAS token signing (ECDSA).🟢TBD
secretsmatrixAuthenticationService.guestModuleClientSecretMAS client of the Synapse guest module.🟢TBD
secretsmatrixAuthenticationService.provisioningClientSecretMAS admin client of the provisioning connector.🟢TBD
secretsmatrixRTC.livekitAuthSecretMatrixRTC LiveKit API (SFU).🟢TBD
secretssynapse.workersReplicationSecretSynapse worker replication (EE).🟢TBD
secretssynapse.formSecretSynapse form signing (EE).🟢TBD
secretssynapse.macaroonSecretKeySynapse macaroon signing.🟢TBD
secretssynapse.registrationSharedSecretSynapse shared-secret registration.🟢TBD
secretssynapse.signingKeySynapse homeserver signing key (federation identity).🟢🔴Rotating it gives the homeserver a new identity. When upgrading an existing Synapse, copy its current signing key into the Secret first, or the homeserver gets a new identity.
secretssynapse.s3EncryptionCustomerKeySynapse media encryption in S3 (SSE-C, optional).🟢🔴Rotating it makes all media encrypted with the previous key unreadable.
secretsturn.sharedSecretTURN credentials (Jitsi, Matrix).🟢TBD
secretscertificates.passwordKeystore/truststore password (self-signed certificates).🟡TBDOX App Suite still renders value into its configuration.
secretsnotes.djangoSecretKeyNotes Django signing.🟢TBD
secretsnotes.superuserNotes superuser.🟢TBD
secretsnotes.collaborationSecretNotes collaboration server.🟢TBD
databasesdovecotDictmap.passwordCassandra user of Dovecot dictmap (EE).🟢TBDThe Cassandra init script sets the password only when initializing an empty data volume.
databasesdovecotACL.passwordCassandra user of Dovecot ACL (EE).🟢TBDThe Cassandra init script sets the password only when initializing an empty data volume.
databaseskeycloak.passwordDatabase user of Keycloak.🟢TBD
databaseskeycloakExtension.passwordDatabase user of the Keycloak extensions.🟢TBD
databasesmatrixAuthenticationService.passwordDatabase user of MAS.🟢TBD
databasesnextcloud.passwordDatabase user of Nextcloud.🟢TBD
databasesnotes.passwordDatabase user of Notes.🟢TBD
databasesopenproject.passwordDatabase user of OpenProject.🟢TBD
databasesoxAppSuite.passwordDatabase user of OX App Suite (default: MariaDB root).🔴TBDOX App Suite renders value into its configuration.
databasesoxAppSuite.readPasswordRead-only database user of OX App Suite.🔴TBDOX App Suite renders value into its configuration.
databasesoxConnector.passwordDatabase user of the OX Connector.🟡TBDThe OX Connector chart still takes the password inside its database URL.
databasessynapse.passwordDatabase user of Synapse.🟢TBD
databasesumsAuthSession.passwordDatabase user of the Nubus auth session.🟢TBD
databasesumsGuardianManagementApi.passwordDatabase user of the Nubus Guardian management API.🟢TBD
databasesumsSelfservice.passwordDatabase user of the Nubus self-service.🟢TBD
databasesxwiki.passwordDatabase user of XWiki.🟢TBD
objectstoresdovecot.secretKeyS3 key of Dovecot (EE).🟢TBDExtra key: username
objectstoresmigrations.secretKeyS3 key of the migrations.🟢TBDExtra key: username
objectstoresnextcloud.secretKeyS3 key of Nextcloud.🟢TBDExtra key: username
objectstoresnotes.secretKeyS3 key of Notes.🟢TBDExtra key: username
objectstoresnubus.secretKeyS3 key of Nubus (portal).🟢TBDExtra key: username
objectstoresopenproject.secretKeyS3 key of OpenProject.🟢TBDExtra key: username
objectstoresopenxchange.secretKeyS3 key of OX App Suite.🟡TBDExtra key: usernameOX App Suite still renders value into its configuration.
objectstoressynapse.secretKeyS3 key of Synapse media.🟢TBDExtra key: username
cacheredis.passwordBundled Redis default user.🟢TBD
cacheintercomService.passwordRedis access of the Intercom Service.🟢TBDThe Secret has to state the bundled Redis password (cache.redis.password).
cachenextcloud.passwordRedis access of Nextcloud.🟢TBDThe Secret has to state the bundled Redis password (cache.redis.password).
cachenotes.passwordRedis access of Notes.🟢TBDThe Secret has to state the bundled Redis password (cache.redis.password). The password has to be URL-safe or percent-encoded.
cachematrixRTC.passwordRedis access of MatrixRTC.🟢TBDThe Secret has to state the bundled Redis password (cache.redis.password).
cacheoxAppSuite.passwordRedis access of OX App Suite.🔴TBDOX App Suite renders value into its configuration.
cachesynapse.passwordRedis access of Synapse.🟢TBDThe Secret has to state the bundled Redis password (cache.redis.password).
smtppasswordExternal SMTP relay (Postfix).🟢TBD
smtpdkim.keyDKIM signing key (dkimpy, optional).🟢TBDsecret.name/secret.key instead of create/name/key
aiapiKeyExternal AI endpoint (Collabora, Notes).🟡TBDCollabora still renders value into its configuration.
sipjigasi.passwordSIP account of Jigasi.🟢TBDFixed key: JIGASI_SIP_PASSWORD

Out of scope

  • certificate.selfSignedOverrides.caCertificate in certificate.yaml.gotmpl: a certificate bundle (certificate, key, trust and key store) rather than a simple secret. It can reference an existing Secret through its own secret.name.