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
-
Create the Kubernetes Secret in the openDesk namespace before deploying, with the key named in
keyand the keys listed in the column “Special”, if any. -
Set
create: falseand pointnameandkeyto 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
| Column | Status | Meaning |
|---|---|---|
| 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. |
| Rotation | TBD | Not 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 key | Path | Purpose | Existing secret | Rotation | Special | Limitations |
|---|---|---|---|---|---|---|
secrets | cassandra.rootPassword | Cassandra admin (Dovecot EE storage). | 🟢 | TBD | Fixed key: cassandra-password | |
secrets | oxAppSuite.adminPassword | OX App Suite master admin (OX Connector, migrations). | 🟡 | TBD | OX App Suite still renders value into its configuration. | |
secrets | oxAppSuite.basicAuthPassword | OX App Suite internal basic auth. | 🔴 | TBD | OX App Suite renders value into its configuration. | |
secrets | oxAppSuite.cookieHashSalt | OX App Suite cookie hash salt. | 🔴 | TBD | OX App Suite renders value into its configuration. | |
secrets | oxAppSuite.hzGroupPassword | OX App Suite Hazelcast group (unused). | 🔴 | TBD | OX App Suite renders value into its configuration. | |
secrets | oxAppSuite.jolokiaPassword | OX App Suite Jolokia monitoring. | 🔴 | TBD | OX App Suite renders value into its configuration. | |
secrets | oxAppSuite.migrationsMasterPassword | OX App Suite and Dovecot master login for migrations. | 🟡 | TBD | OX App Suite still renders value into its properties Secret. | |
secrets | oxAppSuite.oxguardMC | OX Guard master key. | 🔴 | TBD | OX App Suite renders value into its configuration. | |
secrets | oxAppSuite.oxguardRC | OX Guard recovery key. | 🔴 | TBD | OX App Suite renders value into its configuration. | |
secrets | oxAppSuite.restApiPassword | OX App Suite REST API (Dovecot, OX Guard). | 🟡 | TBD | OX App Suite still renders value into its properties Secret. | |
secrets | oxAppSuite.sessiondEncryptionKey | OX App Suite session encryption. | 🔴 | TBD | OX App Suite renders value into its configuration. | |
secrets | oxAppSuite.shareCryptKey | OX App Suite share link encryption. | 🔴 | TBD | OX App Suite renders value into its configuration. | |
secrets | oxAppSuite.synapseAsToken | OX App Suite Matrix appservice token. | 🟡 | TBD | OX App Suite still renders value into its configuration. | |
secrets | oxConnector.provisioningApiPassword | OX Connector access to the Nubus provisioning API. | 🟡 | TBD | The Nubus consumer registration still embeds value. | |
secrets | postfix.opendeskSystemPassword | SMTP account for system mails (all components). | 🟡 | TBD | Extra key: OPENPROJECT_SMTP__PASSWORD | The extra key OPENPROJECT_SMTP__PASSWORD has to state the same password. OX App Suite still renders value into its configuration. |
secrets | nubus.masterpassword | Seed for further Nubus passwords. | 🔴 | TBD | Seed the other Nubus passwords are derived from, not a credential of its own. | |
secrets | nubus.ldapSecret | LDAP cn=admin (Nubus, migrations). | 🟢 | TBD | ||
secrets | nubus.ldapSearch.keycloak | LDAP bind user of Keycloak. | 🟡 | TBD | Nubus stack-data-ums still creates the LDAP bind user from value. | |
secrets | nubus.ldapSearch.nextcloud | LDAP bind user of Nextcloud. | 🟡 | TBD | Nubus stack-data-ums still creates the LDAP bind user from value. | |
secrets | nubus.ldapSearch.dovecot | LDAP bind user of Dovecot. | 🟡 | TBD | Nubus stack-data-ums still creates the LDAP bind user from value. | |
secrets | nubus.ldapSearch.ox | LDAP bind user of OX App Suite. | 🔴 | TBD | OX App Suite and Nubus take the literal value. | |
secrets | nubus.ldapSearch.postfix | LDAP bind user of Postfix. | 🟡 | TBD | Nubus stack-data-ums still creates the LDAP bind user from value. | |
secrets | nubus.ldapSearch.openproject | LDAP bind user of OpenProject. | 🟡 | TBD | Nubus stack-data-ums still creates the LDAP bind user from value. | |
secrets | nubus.ldapSearch.xwiki | LDAP bind user of XWiki. | 🟡 | TBD | Nubus stack-data-ums still creates the LDAP bind user from value. | |
secrets | nubus.systemAccounts.administratorPassword | Nubus Administrator account. | 🔴 | TBD | The Nubus charts take the literal value. | |
secrets | nubus.portalConsumer.provisioningApiPassword | Nubus portal consumer of the provisioning API. | 🔴 | TBD | The 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). | |
secrets | nubus.selfserviceConsumer.provisioningApiPassword | Nubus self-service consumer of the provisioning API. | 🔴 | TBD | The 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). | |
secrets | nubus.provisioning.api.adminPassword | Nubus provisioning API admin. | 🟢 | TBD | ||
secrets | nubus.provisioning.api.natsPassword | Nubus provisioning API NATS user. | 🟢 | TBD | ||
secrets | nubus.provisioning.api.prefillPassword | Nubus provisioning prefill API user. | 🟢 | TBD | ||
secrets | nubus.provisioning.api.udmTransformerPassword | Nubus provisioning UDM transformer API user. | 🟢 | TBD | ||
secrets | nubus.provisioning.dispatcherNatsPassword | Nubus provisioning dispatcher NATS user. | 🟢 | TBD | ||
secrets | nubus.provisioning.prefillNatsPassword | Nubus provisioning prefill NATS user. | 🟢 | TBD | ||
secrets | nubus.provisioning.udmListenerNatsPassword | Nubus provisioning UDM listener NATS user. | 🟢 | TBD | ||
secrets | nubus.provisioning.udmTransformerNatsPassword | Nubus provisioning UDM transformer NATS user. | 🟢 | TBD | ||
secrets | nubus.provisioning.synapse.apiPassword | Matrix provisioning consumer of the provisioning API. | 🔴 | TBD | The 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). | |
secrets | nats.natsAdminPassword | Nubus NATS admin. | 🟢 | TBD | ||
secrets | postgresql.postgresUser | Bundled 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. | |
secrets | mariadb.rootPassword | Bundled MariaDB root (OX App Suite, XWiki on MariaDB). | 🟡 | TBD | OX App Suite still renders value into its configuration. | |
secrets | mariadb.openxchangeUser | MariaDB user of OX App Suite. | 🟢 | TBD | ||
secrets | minio.rootPassword | S3 admin of SeaweedFS (or legacy MinIO). | 🟢 | TBD | Extra key: root-user | |
secrets | keycloak.adminPassword | Keycloak admin (Keycloak, bootstrap, Guardian, Intercom Service). | 🟢 | TBD | ||
secrets | keycloak.clientSecret.dovecot | OIDC client of Dovecot. | 🟢 | TBD | ||
secrets | keycloak.clientSecret.dovecotGrant | OIDC password grant client of Dovecot. | 🟢 | TBD | ||
secrets | keycloak.clientSecret.intercom | OIDC client of the Intercom Service. | 🟢 | TBD | ||
secrets | keycloak.clientSecret.matrix | OIDC client of Matrix (MAS). | 🟢 | TBD | ||
secrets | keycloak.clientSecret.ncoidc | OIDC client of Nextcloud. | 🟢 | TBD | ||
secrets | keycloak.clientSecret.openproject | OIDC client of OpenProject. | 🟢 | TBD | ||
secrets | keycloak.clientSecret.xwiki | OIDC client of XWiki. | 🟢 | TBD | ||
secrets | keycloak.clientSecret.as8oidc | OIDC client of OX App Suite. | 🟡 | TBD | OX App Suite still renders value into its configuration. | |
secrets | keycloak.clientSecret.notes | OIDC client of Notes. | 🟢 | TBD | ||
secrets | keycloak.clientSecret.umcServer | OIDC client of the Nubus UMC server. | 🟢 | TBD | ||
secrets | nextcloud.adminPassword | Nextcloud admin (Nextcloud, OpenProject bootstrap). | 🟢 | TBD | ||
secrets | nextcloud.metricsToken | Nextcloud metrics exporter. | 🟢 | TBD | ||
secrets | nextcloud.statusPassword | Nextcloud status page (OpenProject bootstrap). | 🟢 | TBD | ||
secrets | openproject.adminPassword | OpenProject internal admin. | 🟢 | TBD | ||
secrets | openproject.apiAdminPassword | OpenProject API admin (OpenProject bootstrap). | 🟢 | TBD | Extra key: username | |
secrets | openproject.hocuspocusSecret | OpenProject collaborative editing (Hocuspocus). | 🟢 | 🟡 | Rotating it needs a restart of the OpenProject and Hocuspocus pods; only the short-lived collaborative editing tokens become invalid. | |
secrets | openproject.secretKeyBase | OpenProject cookies and signed links. | 🟢 | 🟡 | Rotating it invalidates all cookies and signed links, so users have to log in again. | |
secrets | openproject.databaseCipherKey | OpenProject 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. | |
secrets | collabora.adminPassword | Collabora admin console. | 🟢 | TBD | Extra key: username | |
secrets | jitsi.jwtAppSecret | Jitsi JWT signing (Prosody, Keycloak adapter). | 🟢 | TBD | Fixed key: JWT_APP_SECRET | |
secrets | jitsi.jicofoAuthPassword | Jitsi Jicofo XMPP user. | 🟢 | TBD | Fixed key: JICOFO_AUTH_PASSWORD | |
secrets | jitsi.jvbAuthPassword | Jitsi videobridge XMPP user. | 🟢 | TBD | Fixed key: JVB_AUTH_PASSWORD; Extra key: JVB_AUTH_USER | |
secrets | jitsi.jibriXmppPassword | Jitsi Jibri XMPP user. | 🟢 | TBD | Fixed key: JIBRI_XMPP_PASSWORD; Extra key: JIBRI_XMPP_USER | |
secrets | jitsi.jibriRecorderPassword | Jitsi Jibri recorder user. | 🟢 | TBD | Fixed key: JIBRI_RECORDER_PASSWORD; Extra key: JIBRI_RECORDER_USER | |
secrets | jitsi.jigasiXmppPassword | Jitsi Jigasi XMPP user. | 🟢 | TBD | Fixed key: JIGASI_XMPP_PASSWORD; Extra key: JIGASI_XMPP_USER | |
secrets | centralnavigation.apiKey | Central navigation (portal, Nextcloud, OpenProject, XWiki, Intercom). | 🟢 | TBD | ||
secrets | dovecot.doveadm | Dovecot doveadm API (OX App Suite). | 🟡 | TBD | OX App Suite still renders value into its configuration. | |
secrets | dovecot.sharedMailboxesMasterPassword | Dovecot master login for shared mailboxes. | 🟢 | TBD | ||
secrets | xwiki.superadminpassword | XWiki superadmin (debug only). | 🟢 | TBD | ||
secrets | intercom.secret | Intercom Service sessions. | 🟢 | TBD | ||
secrets | intercom.synapseAsToken | Intercom Service Matrix appservice token. | 🟢 | TBD | ||
secrets | elementSupervision.hsToken | Element Supervision appservice HS token (EE). | 🟢 | TBD | ||
secrets | elementSupervision.backupPassphrase | Element Supervision key backup (EE). | 🟢 | TBD | ||
secrets | elementSupervision.password | Element Supervision bot account (EE). | 🟢 | TBD | ||
secrets | elementSupervision.synapseAsToken | Element Supervision appservice AS token (EE). | 🟢 | TBD | ||
secrets | elementAuditbot.hsToken | Element Auditbot appservice HS token (EE). | 🟢 | TBD | ||
secrets | elementAuditbot.backupPassphrase | Element Auditbot key backup (EE). | 🟢 | TBD | ||
secrets | elementAuditbot.password | Element Auditbot bot account (EE). | 🟢 | TBD | ||
secrets | elementAuditbot.synapseAsToken | Element Auditbot appservice AS token (EE). | 🟢 | TBD | ||
secrets | matrixAuthenticationService.matrixToolsOIDCClientSecret | MAS client of the Matrix tools (EE). | 🟢 | TBD | ||
secrets | matrixAuthenticationService.encryptionSecret | MAS encryption of stored secrets. | 🟢 | TBD | ||
secrets | matrixAuthenticationService.synapseSharedSecret | MAS to Synapse. | 🟢 | TBD | ||
secrets | matrixAuthenticationService.privateKeyRSA | MAS token signing (RSA). | 🟢 | TBD | ||
secrets | matrixAuthenticationService.privateKeyECDSAPrime256v1 | MAS token signing (ECDSA). | 🟢 | TBD | ||
secrets | matrixAuthenticationService.guestModuleClientSecret | MAS client of the Synapse guest module. | 🟢 | TBD | ||
secrets | matrixAuthenticationService.provisioningClientSecret | MAS admin client of the provisioning connector. | 🟢 | TBD | ||
secrets | matrixRTC.livekitAuthSecret | MatrixRTC LiveKit API (SFU). | 🟢 | TBD | ||
secrets | synapse.workersReplicationSecret | Synapse worker replication (EE). | 🟢 | TBD | ||
secrets | synapse.formSecret | Synapse form signing (EE). | 🟢 | TBD | ||
secrets | synapse.macaroonSecretKey | Synapse macaroon signing. | 🟢 | TBD | ||
secrets | synapse.registrationSharedSecret | Synapse shared-secret registration. | 🟢 | TBD | ||
secrets | synapse.signingKey | Synapse 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. | |
secrets | synapse.s3EncryptionCustomerKey | Synapse media encryption in S3 (SSE-C, optional). | 🟢 | 🔴 | Rotating it makes all media encrypted with the previous key unreadable. | |
secrets | turn.sharedSecret | TURN credentials (Jitsi, Matrix). | 🟢 | TBD | ||
secrets | certificates.password | Keystore/truststore password (self-signed certificates). | 🟡 | TBD | OX App Suite still renders value into its configuration. | |
secrets | notes.djangoSecretKey | Notes Django signing. | 🟢 | TBD | ||
secrets | notes.superuser | Notes superuser. | 🟢 | TBD | ||
secrets | notes.collaborationSecret | Notes collaboration server. | 🟢 | TBD | ||
databases | dovecotDictmap.password | Cassandra user of Dovecot dictmap (EE). | 🟢 | TBD | The Cassandra init script sets the password only when initializing an empty data volume. | |
databases | dovecotACL.password | Cassandra user of Dovecot ACL (EE). | 🟢 | TBD | The Cassandra init script sets the password only when initializing an empty data volume. | |
databases | keycloak.password | Database user of Keycloak. | 🟢 | TBD | ||
databases | keycloakExtension.password | Database user of the Keycloak extensions. | 🟢 | TBD | ||
databases | matrixAuthenticationService.password | Database user of MAS. | 🟢 | TBD | ||
databases | nextcloud.password | Database user of Nextcloud. | 🟢 | TBD | ||
databases | notes.password | Database user of Notes. | 🟢 | TBD | ||
databases | openproject.password | Database user of OpenProject. | 🟢 | TBD | ||
databases | oxAppSuite.password | Database user of OX App Suite (default: MariaDB root). | 🔴 | TBD | OX App Suite renders value into its configuration. | |
databases | oxAppSuite.readPassword | Read-only database user of OX App Suite. | 🔴 | TBD | OX App Suite renders value into its configuration. | |
databases | oxConnector.password | Database user of the OX Connector. | 🟡 | TBD | The OX Connector chart still takes the password inside its database URL. | |
databases | synapse.password | Database user of Synapse. | 🟢 | TBD | ||
databases | umsAuthSession.password | Database user of the Nubus auth session. | 🟢 | TBD | ||
databases | umsGuardianManagementApi.password | Database user of the Nubus Guardian management API. | 🟢 | TBD | ||
databases | umsSelfservice.password | Database user of the Nubus self-service. | 🟢 | TBD | ||
databases | xwiki.password | Database user of XWiki. | 🟢 | TBD | ||
objectstores | dovecot.secretKey | S3 key of Dovecot (EE). | 🟢 | TBD | Extra key: username | |
objectstores | migrations.secretKey | S3 key of the migrations. | 🟢 | TBD | Extra key: username | |
objectstores | nextcloud.secretKey | S3 key of Nextcloud. | 🟢 | TBD | Extra key: username | |
objectstores | notes.secretKey | S3 key of Notes. | 🟢 | TBD | Extra key: username | |
objectstores | nubus.secretKey | S3 key of Nubus (portal). | 🟢 | TBD | Extra key: username | |
objectstores | openproject.secretKey | S3 key of OpenProject. | 🟢 | TBD | Extra key: username | |
objectstores | openxchange.secretKey | S3 key of OX App Suite. | 🟡 | TBD | Extra key: username | OX App Suite still renders value into its configuration. |
objectstores | synapse.secretKey | S3 key of Synapse media. | 🟢 | TBD | Extra key: username | |
cache | redis.password | Bundled Redis default user. | 🟢 | TBD | ||
cache | intercomService.password | Redis access of the Intercom Service. | 🟢 | TBD | The Secret has to state the bundled Redis password (cache.redis.password). | |
cache | nextcloud.password | Redis access of Nextcloud. | 🟢 | TBD | The Secret has to state the bundled Redis password (cache.redis.password). | |
cache | notes.password | Redis access of Notes. | 🟢 | TBD | The Secret has to state the bundled Redis password (cache.redis.password). The password has to be URL-safe or percent-encoded. | |
cache | matrixRTC.password | Redis access of MatrixRTC. | 🟢 | TBD | The Secret has to state the bundled Redis password (cache.redis.password). | |
cache | oxAppSuite.password | Redis access of OX App Suite. | 🔴 | TBD | OX App Suite renders value into its configuration. | |
cache | synapse.password | Redis access of Synapse. | 🟢 | TBD | The Secret has to state the bundled Redis password (cache.redis.password). | |
smtp | password | External SMTP relay (Postfix). | 🟢 | TBD | ||
smtp | dkim.key | DKIM signing key (dkimpy, optional). | 🟢 | TBD | secret.name/secret.key instead of create/name/key | |
ai | apiKey | External AI endpoint (Collabora, Notes). | 🟡 | TBD | Collabora still renders value into its configuration. | |
sip | jigasi.password | SIP account of Jigasi. | 🟢 | TBD | Fixed key: JIGASI_SIP_PASSWORD |
Out of scope
certificate.selfSignedOverrides.caCertificateincertificate.yaml.gotmpl: a certificate bundle (certificate, key, trust and key store) rather than a simple secret. It can reference an existing Secret through its ownsecret.name.