Secrets DataLens On-premises
- Classification of secrets based on requirement
- Example YAML configuration
- Detailed description of secrets
- Manual generation of RSA keys
- DOCKER_CONFIG_JSON format
- Using an external Kubernetes secret
- Secret rotation
- Classification based on rotation capability
- 🟢 Secrets with safe rotation
- 🟡 Secrets with rotation and consequences
- 🔴 Secrets not recommended for rotation
- RSA authentication key rotation procedure
- Master token rotation procedure
- Database password rotation procedure (built-in PostgreSQL)
- Security recommendations
- Useful commands
This document describes all the secrets used during DataLens On-premises deployment.
You can set secrets in two ways:
- Via properties in the
values.yamlfile (recommended for first deployment). - Via an external Kubernetes secret, with a link in
secrets.ref.
When using the ./init.sh script, secrets are generated automatically on first deployment and stored in the Kubernetes cluster secrets.
Classification of secrets based on requirement
🔴 Required secrets (RSA authentication keys)
These secrets are required when authentication is enabled (features.auth.enabled: true, enabled by default).
| Secret | Autogeneration | Format | Description |
|---|---|---|---|
AUTH_TOKEN_PRIVATE_KEY |
✅ On first deployment | RSA 4096-bit PEM | Private key for signing JWT authentication tokens |
AUTH_TOKEN_PUBLIC_KEY |
✅ On first deployment | RSA 4096-bit PEM | Public key for verifying JWT tokens |
Note
When using ./init.sh, these keys are generated automatically. To regenerate, use the --auth-rsa-gen flag.
🟡 Conditionally required secrets
Secrets for Temporal (workbook import or export)
These secrets are required when you enable one of the following features:
features.meta_manager.enabled: truefeatures.export.enabled: truefeatures.usage_tracking.enabled: true
| Secret | Autogeneration | Format | Description |
|---|---|---|---|
TEMPORAL_AUTH_PRIVATE_KEY |
✅ On first deployment | RSA 4096-bit PEM | Private key for authentication in Temporal |
TEMPORAL_AUTH_PUBLIC_KEY |
✅ On first deployment | RSA 4096-bit PEM | Public key for authentication in Temporal |
Note
To regenerate, use the --temporal-rsa-gen flag.
Secret for a private Docker image registry
| Secret | Autogeneration | Format | When it is required |
|---|---|---|---|
DOCKER_CONFIG_JSON |
❌ | JSON (docker config) | If registry.private: true and registry.docker_config.secret.ref is not specified |
🟢 Autogenerated secrets
These secrets are autogenerated on first deployment unless explicitly specified. The values are stored in Kubernetes secrets and reused in subsequent deployments.
Authentication and security secrets
| Secret | Length | Format | Description |
|---|---|---|---|
AUTH_ADMIN_PASSWORD |
32 characters | alphanumeric | System administrator password (admin) |
AUTH_CALLBACK_COOKIE_SECRET |
32 characters | alphanumeric | Cookie encryption key for authentication callbacks |
CSRF_SECRET |
16 characters | alphanumeric | CSRF token generation key for protection against CSRF attacks |
Cross-service communication master tokens
| Secret | Length | Format | Description |
|---|---|---|---|
AUTH_MASTER_TOKEN |
32 characters | alphanumeric | Authorization token for requests to authentication service |
US_MASTER_TOKEN |
32 characters | alphanumeric | Authorization token for requests to United Storage |
FILE_UPLOADER_MASTER_TOKEN |
32 characters | alphanumeric | Authorization token for requests to file upload service |
Encryption keys
| Secret | Length | Format | Description |
|---|---|---|---|
CONTROL_API_CRYPTO_KEY |
32 characters | base64(alphanumeric) | Encryption key for confidential connection data (passwords, tokens) |
EXPORT_DATA_VERIFICATION_KEY |
32 characters | alphanumeric | Data integrity verification key for workbook import and export |
PostgreSQL passwords
| Secret | Length | Description |
|---|---|---|
POSTGRES_PASSWORD_ROOT |
32 characters | PostgreSQL superuser password |
POSTGRES_PASSWORD_US |
32 characters | United Storage DB password (metadata) |
POSTGRES_PASSWORD_COMPENG |
32 characters | Computation engine DB password |
POSTGRES_PASSWORD_AUTH |
32 characters | Authentication service DB password |
POSTGRES_PASSWORD_TEMPORAL |
32 characters | Temporal DB password |
POSTGRES_PASSWORD_META_MANAGER |
32 characters | Meta Manager DB password |
POSTGRES_PASSWORD_DEMO |
32 characters | Demo database password |
Infrastructure component passwords
| Secret | Length | When is it used | Description |
|---|---|---|---|
CLICKHOUSE_PASSWORD |
32 characters by default | If features.files.enabled or features.usage_tracking.enabled |
ClickHouse® user password |
REDIS_PASSWORD |
64 characters by default | If features.files.enabled, features.cache.enabled, or features.background_exports.enabled |
Valkey™ password |
S3_ACCESS_KEY_ID |
strictly 32 characters | If features.files.enabled or features.background_exports.enabled |
Access key ID for S3 (MinIO) |
S3_SECRET_ACCESS_KEY |
strictly 64 characters | If features.files.enabled or features.background_exports.enabled |
Secret access key for S3 (MinIO) |
⚪ Optional secrets
| Secret | Format | Description |
|---|---|---|
AUTH_PROVIDERS_CONFIG |
JSON array | Configuration of external authentication providers (LDAP, OIDC). The default value is an empty array ([]). |
secrets.ref |
string | Link to an existing Kubernetes secret to use instead of creating a new one |
Example YAML configuration
secrets:
ref: null # Link to an external Kubernetes secret
#
# === RSA authentication keys (required) ===
AUTH_TOKEN_PRIVATE_KEY: null # Generated automatically on first deployment
AUTH_TOKEN_PUBLIC_KEY: null # Generated automatically on first deployment
AUTH_PROVIDERS_CONFIG: null # JSON array of providers (optional)
AUTH_ADMIN_PASSWORD: null # The admin password (generated automatically)
AUTH_CALLBACK_COOKIE_SECRET: null # Generated automatically
#
# === Security ===
CSRF_SECRET: null # Generated automatically
#
# === Master tokens ===
AUTH_MASTER_TOKEN: null # Generated automatically
US_MASTER_TOKEN: null # Generated automatically
FILE_UPLOADER_MASTER_TOKEN: null # Generated automatically
EXPORT_DATA_VERIFICATION_KEY: null # Generated automatically
#
# === Encryption keys ===
CONTROL_API_CRYPTO_KEY: null # Generated automatically
#
# === Docker Registry ===
DOCKER_CONFIG_JSON: null # Required if registry.private: true
#
# === PostgreSQL ===
POSTGRES_PASSWORD_ROOT: null # Generated automatically
POSTGRES_PASSWORD_US: null # Generated automatically
POSTGRES_PASSWORD_COMPENG: null # Generated automatically
POSTGRES_PASSWORD_AUTH: null # Generated automatically
POSTGRES_PASSWORD_TEMPORAL: null # Generated automatically
POSTGRES_PASSWORD_META_MANAGER: null # Generated automatically
POSTGRES_PASSWORD_DEMO: null # Generated automatically
#
# === Temporal RSA keys (for import/export) ===
TEMPORAL_AUTH_PRIVATE_KEY: null # Generated if features.export is enabled
TEMPORAL_AUTH_PUBLIC_KEY: null # Generated if features.export is enabled
#
# === Infrastructure components ===
CLICKHOUSE_PASSWORD: null # Generated automatically
REDIS_PASSWORD: null # Generated automatically
S3_ACCESS_KEY_ID: null # Generated automatically
S3_SECRET_ACCESS_KEY: null # Generated automatically
Detailed description of secrets
| Parameter | Type | Default value | Requirement | Description |
|---|---|---|---|---|
secrets.ref |
string | null |
❌ Optional (required if using ArgoCD). | Link to an external Kubernetes secret. When specified, other secrets are ignored. |
secrets.AUTH_TOKEN_PRIVATE_KEY |
string | null |
🔴 Required | RSA private key (4096-bit, PEM) for signing JWT authentication tokens |
secrets.AUTH_TOKEN_PUBLIC_KEY |
string | null |
🔴 Required | RSA public key (4096-bit, PEM) for verifying JWT tokens |
secrets.AUTH_PROVIDERS_CONFIG |
string | [] |
❌ Optional | Configuration of authentication providers in JSON format. Read more in ./help/auth-provider-config.example.json. |
secrets.AUTH_ADMIN_PASSWORD |
string | autogeneration | ✅ Autogeneration | Admin password. Get: ./init.sh --get-admin-password |
secrets.AUTH_CALLBACK_COOKIE_SECRET |
string | autogeneration | ✅ Autogeneration | Cookie encryption key for OAuth/OIDC callbacks |
secrets.CSRF_SECRET |
string | autogeneration | ✅ Autogeneration | CSRF token encryption key for form protection |
secrets.AUTH_MASTER_TOKEN |
string | autogeneration | ✅ Autogeneration | Master token for cross-service requests to auth service |
secrets.US_MASTER_TOKEN |
string | autogeneration | ✅ Autogeneration | Master token for cross-service requests to United Storage |
secrets.FILE_UPLOADER_MASTER_TOKEN |
string | autogeneration | ✅ Autogeneration | Master token for cross-service requests to file-uploader |
secrets.EXPORT_DATA_VERIFICATION_KEY |
string | autogeneration | ✅ Autogeneration | Data integrity check key for import and export |
secrets.CONTROL_API_CRYPTO_KEY |
string | autogeneration | ✅ Autogeneration | Encryption key for confidential connection data (base64) |
secrets.DOCKER_CONFIG_JSON |
string | {} |
🟡 Conditionally | Configuration of access to a private Docker image registry. Format: Docker config JSON |
secrets.POSTGRES_PASSWORD_ROOT |
string | autogeneration | ✅ Autogeneration | PostgreSQL root user password |
secrets.POSTGRES_PASSWORD_US |
string | autogeneration | ✅ Autogeneration | United Storage DB password |
secrets.POSTGRES_PASSWORD_COMPENG |
string | autogeneration | ✅ Autogeneration | Computation engine DB password |
secrets.POSTGRES_PASSWORD_AUTH |
string | autogeneration | ✅ Autogeneration | Authentication service DB password |
secrets.POSTGRES_PASSWORD_TEMPORAL |
string | autogeneration | ✅ Autogeneration | Temporal DB password |
secrets.POSTGRES_PASSWORD_META_MANAGER |
string | autogeneration | ✅ Autogeneration | Meta Manager DB password |
secrets.POSTGRES_PASSWORD_DEMO |
string | autogeneration | ✅ Autogeneration | Demo database password |
secrets.TEMPORAL_AUTH_PRIVATE_KEY |
string | null |
🟡 Conditionally | RSA private key for Temporal. Required if features.export.enabled |
secrets.TEMPORAL_AUTH_PUBLIC_KEY |
string | null |
🟡 Conditionally | RSA public key for Temporal. Required if features.export.enabled |
secrets.CLICKHOUSE_PASSWORD |
string | autogeneration | ✅ Autogeneration | ClickHouse® user password |
secrets.REDIS_PASSWORD |
string | autogeneration | ✅ Autogeneration | Valkey™ password |
secrets.S3_ACCESS_KEY_ID |
string | autogeneration | ✅ Autogeneration | Access key ID for S3-compatible storage |
secrets.S3_SECRET_ACCESS_KEY |
string | autogeneration | ✅ Autogeneration | Secret access key for S3-compatible storage |
Manual generation of RSA keys
If you need to generate RSA keys manually, use the following commands:
# Generating a private key (4096 bit)
openssl genpkey -algorithm RSA -pkeyopt "rsa_keygen_bits:4096" -out private.pem
# Extracting a public key
openssl rsa -in private.pem -pubout -out public.pem
# Viewing content to insert into values.yaml
cat private.pem
cat public.pem
When specifying in values.yaml, use the multi-line YAML format:
secrets:
AUTH_TOKEN_PRIVATE_KEY: |
-----BEGIN PRIVATE KEY-----
MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQC...
...
-----END PRIVATE KEY-----
AUTH_TOKEN_PUBLIC_KEY: |
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA...
...
-----END PUBLIC KEY-----
DOCKER_CONFIG_JSON format
Example configuration for a private registry:
{
"auths": {
"registry.example.com": {
"username": "user",
"password": "password",
"auth": "base64(user:password)"
}
}
}
For details, see the example in the ./help/docker-config.example.json file.
Using an external Kubernetes secret
If secrets already exist in the Kubernetes cluster, provide a link to the secret:
secrets:
ref: my-existing-secret
In which case all other values in the secrets section will be ignored, and the system will use the values from the specified Kubernetes secret.
The external secret must contain all the necessary keys with relevant names.
Secret rotation
There is no automatic rotation of secrets. Secrets are preserved between updates thanks to the lookup mechanism in the Helm chart that reuses existing values from Kubernetes secrets.
Where necessary, rotation is performed manually with due regard to consequences for each secret type.
Classification based on rotation capability
| Category | Rotation capability | Consequences |
|---|---|---|
| 👮 Safe rotation | Ready for rotation | Minimal impact on system operation |
| 🟡 Rotation with consequences | Ready for rotation | There are side effects to consider |
| 🔴 Rotation not possible | Not recommended | Causes data loss or malfunction |
🟢 Secrets with safe rotation
You can rotate these secrets without significant consequences. Following rotation, pods must be restarted.
| Secret | Rotation procedure | Consequences |
|---|---|---|
AUTH_CALLBACK_COOKIE_SECRET |
Change in values.yaml and run helm upgrade |
OAuth/OIDC callbacks will be invalidated during authentication |
DOCKER_CONFIG_JSON |
Change in values.yaml and run helm upgrade |
No impact on running pods |
AUTH_PROVIDERS_CONFIG |
Change in values.yaml and run helm upgrade |
No impact (provider configuration) |
EXPORT_DATA_VERIFICATION_KEY |
Change in values.yaml and run helm upgrade |
Previously exported workbooks will be imported with a warning |
🟡 Secrets with rotation and consequences
You can rotate these secrets; however, it will cause some side effects.
| Secret | Rotation procedure | Consequences |
|---|---|---|
AUTH_TOKEN_PRIVATE_KEY / AUTH_TOKEN_PUBLIC_KEY |
./init.sh --auth-rsa-gen |
⚠️ All active user sessions will be invalidated. Users will be required to re-login |
CSRF_SECRET |
Change in values.yaml and run helm upgrade |
⚠️ Data requests will return errors until the upgrade is complete |
TEMPORAL_AUTH_PRIVATE_KEY / TEMPORAL_AUTH_PUBLIC_KEY |
./init.sh --temporal-rsa-gen |
⚠️ Temporal tasks in progress may fail with an error. We recommend to wait until all tasks are completed before rotating |
AUTH_MASTER_TOKEN |
Change in values.yaml and run helm upgrade |
⚠️ Temporary unavailability of the authentication service until all dependent pods are restarted |
US_MASTER_TOKEN |
Change in values.yaml and run helm upgrade |
⚠️ Temporary unavailability of United Storage until all dependent pods are restarted |
FILE_UPLOADER_MASTER_TOKEN |
Change in values.yaml and run helm upgrade |
⚠️ Temporary unavailability of file uploads until all pods are restarted |
🔴 Secrets not recommended for rotation
Rotating these secrets without further action causes data loss or system malfunction.
| Secret | Why not to rotate | What to do if compromised |
|---|---|---|
AUTH_ADMIN_PASSWORD |
🚫 The administrator password can be changed only through the DataLens interface | |
CONTROL_API_CRYPTO_KEY |
🚫 Used to encrypt passwords and tokens in connections to data sources. If you change the key, all existing connections will become unreadable | Can be recreated by restoring from a backup |
POSTGRES_PASSWORD_* |
🚫 Passwords are used both in the application and the database. Changing them only in the secrets will cause connection errors | You need to change the passwords in PostgreSQL and the secrets in a synchronized manner. When using the built-in PostgreSQL, it is a complex procedure with downtime |
CLICKHOUSE_PASSWORD |
🚫 Similarly to PostgreSQL, the password must match in the database and the secrets. | Synchronized change in ClickHouse® and the secrets |
REDIS_PASSWORD |
🚫 Similarly, the password must match in Valkey™ and the secrets. | Synchronized change in Valkey™ and the secrets |
S3_ACCESS_KEY_ID / S3_SECRET_ACCESS_KEY |
🚫 Credentials must match the S3/MinIO settings | Synchronized change in S3 and the secrets |
In addition, when updating database passwords, you can create a new user and password with similar access permissions and migrate the workload to it without downtime.
RSA authentication key rotation procedure
# 1. (Optional) Warn users to re-login
# 2. Generate new keys and run an update
./init.sh --auth-rsa-gen
# 3. Make sure all pods have restarted
./init.sh --kubectl get pods
# 4. Check that authentication is working
Master token rotation procedure
# 1. Prepare new token values (32 characters, alphanumeric)
NEW_TOKEN=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | head -c 32)
# 2. Create or update values.yaml with new values
# secrets:
# US_MASTER_TOKEN: "<new token>"
# 3. Perform an update
./init.sh --values ./my-values.yaml
# 4. Make sure all pods have restarted
./init.sh --kubectl rollout status deployment --timeout=300s
Database password rotation procedure (built-in PostgreSQL)
Warning
This procedure requires downtime. Perform it with extreme caution.
# 1. Create a backup
./init.sh --dump-postgres
# 2. Connect to PostgreSQL
./init.sh --pg-sql
# 3. Change user password in PostgreSQL
ALTER USER "pg-us-user" WITH PASSWORD 'new_password';
# 4. Update the secret in values.yaml
# secrets:
# POSTGRES_PASSWORD_US: "new_password"
# 5. Perform an update
./init.sh --values ./my-values.yaml
# 6. Restart the pods using this password
./init.sh --kubectl rollout restart deployment
Security recommendations
- Keep your secrets secure: use external secret management systems (HashiCorp Vault, Yandex Lockbox) and refer to them via
secrets.ref. - Do not rotate
CONTROL_API_CRYPTO_KEYunless you have to. Doing so will break existing connections. Seamless rotation is currently not supported. - Schedule your rotation for low-load periods, because rotating some of the secrets involves restarting the services.
- Create backups prior to rotation, especially before you change your database passwords.
Useful commands
# To get the administrator password
./init.sh --get-admin-password
# To generate new RSA keys for authentication
./init.sh --auth-rsa-gen
# To generate new RSA keys for Temporal
./init.sh --temporal-rsa-gen
# To specify the authentication provider configuration file
./init.sh --auth-providers-config ./my-auth-config.json
# To create a PostgreSQL backup prior to rotation
./init.sh --dump-postgres
# To check pod statuses after rotation
./init.sh --kubectl get pods
# To view logs to diagnose issues
./init.sh --stern .
ClickHouse® is a registered trademark of ClickHouse, Inc.