KeycyteHelp CenterKeycyte PAM

Keycyte PAM 3.2 · Deployment Guide

Configuration Reference

The PAM server reads its settings from environment variables and, optionally, from a config.yaml file. In a deployment from the installation package, the settings are environment variables that docker-compose.yml passes to the pam container, mostly from the .env file.

How Settings Are Read

  • Environment variables. Every setting has an environment variable: KEYCYTE_ followed by the setting path in upper case, with dots replaced by underscores. For example, session.timeout is KEYCYTE_SESSION_TIMEOUT.
  • config.yaml. The PAM server looks for config.yaml in its working directory (/app in the container, which is ~/keycyte on the host) and in /etc/keycyte/. The file is optional; if it is not found, the PAM server logs a warning and uses environment variables and defaults.
  • Precedence. Environment variables take precedence over config.yaml, and config.yaml takes precedence over the built-in defaults.

To change a setting in a deployment from the installation package, edit the value in .env (or in docker-compose.yml if it is set there), and recreate the containers in the package folder:

sudo docker compose --env-file .env -f docker-compose.yml up -d

Warning

The .env file contains secrets. Never copy secret values into tickets, documentation or chat, and keep a secure copy of the file.

In the tables below, Default is the built-in default of the PAM server. Package shows the value that the installation package sets, where it differs. Settings marked Required must be set; the PAM server does not start without them.

Server and TLS

Variableconfig.yaml keyDefaultDescription
KEYCYTE_SERVER_PORTserver.port8443HTTPS port inside the container. Package: 443.
KEYCYTE_SERVER_TLS_ENABLEDserver.tls.enabledtrueServe HTTPS.
KEYCYTE_SERVER_TLS_KEYSTOREserver.tls.keystoreemptyPath of the PKCS#12 keystore used when no certificate was applied in the Admin Panel. Package: /app/localhost.p12 (from TLS_KEYSTORE_PATH).
KEYCYTE_SERVER_TLS_PASSWORDserver.tls.passwordemptyPassword of the PKCS#12 keystore (from TLS_KEYSTORE_PASSWORD).
KEYCYTE_SERVER_TLS_SUPPRESS_CLIENT_ERRORSserver.tls.suppress_client_errorstrueDo not log TLS handshake errors caused by clients.
KEYCYTE_SERVER_CORS_ALLOWED_ORIGINSserver.cors.allowed_originsemptyComma-separated list of origins (for example https://portal.example.com) allowed to call the API from another site. Empty disables cross-origin requests. * is not allowed.

Database

Variableconfig.yaml keyDefaultDescription
KEYCYTE_DATABASE_HOSTdatabase.host127.0.0.1PostgreSQL host. Package: postgres (the database container), from DB_HOST.
KEYCYTE_DATABASE_PORTdatabase.port5432PostgreSQL port (from DB_PORT).
KEYCYTE_DATABASE_NAMEdatabase.namekeycytedbDatabase name (from DB_NAME).
KEYCYTE_DATABASE_USERNAMEdatabase.usernameemptyRequired. Database user (from DB_USER).
KEYCYTE_DATABASE_PASSWORDdatabase.passwordemptyRequired. Database password (from DB_PASSWORD).
KEYCYTE_DATABASE_SSLMODEdatabase.sslmodedisablePostgreSQL SSL mode, for example disable, require, verify-full (from DB_SSLMODE).
KEYCYTE_DATABASE_MAX_OPEN_CONNSdatabase.max_open_conns25Maximum open connections per PAM node.
KEYCYTE_DATABASE_MAX_IDLE_CONNSdatabase.max_idle_conns10Maximum idle connections per PAM node.

Tip

In a deployment with several nodes, the connection limits apply to each node. Make sure that the total stays below the max_connections setting of PostgreSQL.

Encryption Key

The encryption key protects secrets stored in the database (vault passwords, keys, provider credentials), backup files and session recordings. Required: set exactly one of the following sources. The PAM server does not start without a key.

Variableconfig.yaml keyDefaultDescription
KEYCYTE_KEYSTORE_KEY_HEXkeystore.key_hexemptyAES key as a hexadecimal string. Package: from KEYSTORE_KEY_HEX.
KEYCYTE_KEYSTORE_KEY_BASE64keystore.key_base64emptyAES key as a Base64 string.
KEYCYTE_KEYSTORE_KEY_FILEkeystore.key_fileemptyPath of a file that contains the raw key (16, 24 or 32 bytes).
KEYCYTE_KEYSTORE_PATHkeystore.pathemptyPath of a Java PKCS#12 keystore that holds the key (for keys migrated from earlier versions).
KEYCYTE_KEYSTORE_PASSWORDkeystore.passwordemptyPassword of the keystore in keystore.path.
KEYCYTE_KEYSTORE_ALIASkeystore.aliaskeycyteAlias of the key in the keystore.

If more than one source is set, the PAM server uses the first one in the order of the table.

Warning

Never change the encryption key of an existing deployment. Data encrypted with the old key, including backups and recordings, can no longer be decrypted. All nodes of a deployment must use the same key.

Session

Variableconfig.yaml keyDefaultDescription
KEYCYTE_SESSION_SECRET_KEYsession.secret_keybuilt-in valueRequired. Secret that signs session cookies. Must be at least 32 bytes long and must not be the built-in value; otherwise the PAM server refuses to start. Create one with openssl rand -base64 48. Package: from SESSION_SECRET_KEY.
KEYCYTE_SESSION_TIMEOUTsession.timeout30mIdle timeout of a sign-in session. Every request extends it. Package: from SESSION_TIMEOUT.
KEYCYTE_SESSION_COOKIE_NAMEsession.cookie_nameKEYCYTESESSIONBase name of the session cookie. With the host prefix enabled, the cookie is sent as __Host-<name>. Package: from SESSION_COOKIE_NAME.
KEYCYTE_SESSION_USE_HOST_PREFIXsession.use_host_prefixtrueAdd the __Host- prefix to the cookie name. This forces a secure cookie and clears the cookie domain.
KEYCYTE_SESSION_COOKIE_SECUREsession.cookie_securetrueSend the cookie only over HTTPS.
KEYCYTE_SESSION_COOKIE_SAME_SITEsession.cookie_same_sitelaxSameSite attribute: lax, strict or none. none requires a secure cookie. Package: none.
KEYCYTE_SESSION_COOKIE_DOMAINsession.cookie_domainemptyCookie domain. Ignored while the host prefix is enabled.
KEYCYTE_SESSION_SINGLE_DEVICEsession.single_devicefalseAllow only one active sign-in session per user. A new sign-in signs the user out everywhere else.

MFA Lockout

Variableconfig.yaml keyDefaultDescription
KEYCYTE_MFA_MAX_FAILED_ATTEMPTSmfa.max_failed_attempts5Failed MFA verifications after which the account is locked.
KEYCYTE_MFA_LOCKOUT_DURATION_MINmfa.lockout_duration_min15Minutes the account stays locked after too many failed MFA verifications. Applies to all user types.

Files, Recordings and Gateway

Variableconfig.yaml keyDefaultDescription
KEYCYTE_UPLOAD_MAX_FILE_SIZEupload.max_file_size4GBMaximum size of a file transferred in a browser session.
KEYCYTE_UPLOAD_STORAGE_PATHupload.storage_path/driveStorage folder for transferred files. Package: /app/uploads.
KEYCYTE_RECORDING_PATHrecording.path/recordingsFolder for session recordings. Package: /record (the ~/record host directory).
KEYCYTE_GATEWAY_ADDRESSgateway.address127.0.0.1Address of the gateway (guacd). Package: guacd.
KEYCYTE_GATEWAY_PORTgateway.port4822Port of the gateway.

LDAP TLS

Variableconfig.yaml keyDefaultDescription
KEYCYTE_LDAP_CA_CERTldap.ca_cert/app/certs/ldap-ca.pemPEM file with the CA certificates trusted for LDAP over TLS. Certificates trusted from the Admin Panel are also stored here. Package: /app/cacerts.pem (from LDAP_CA_CERT).
KEYCYTE_LDAP_INSECURE_SKIP_VERIFYldap.insecure_skip_verifyfalseSkip verification of LDAP server certificates. Do not use in production (from LDAP_INSECURE).

The Password Manager container receives the same two values as LDAP_CA_CERT and LDAP_INSECURE_SKIP_VERIFY.

Proxies and Access Keys

These variables have no config.yaml key; set them as environment variables. For their meaning and rotation, see Service Access Keys.

VariableDefaultDescription
KEYCYTE_SSH_PROXY_ACCESS_KEY_ID, KEYCYTE_SSH_PROXY_ACCESS_KEY_SECRETemptyAccess key of the SSH proxy.
KEYCYTE_RADIUS_SERVER_ACCESS_KEY_ID, KEYCYTE_RADIUS_SERVER_ACCESS_KEY_SECRETemptyAccess key of the RADIUS server.
KEYCYTE_PAM_ACCESS_KEY_ID, KEYCYTE_PAM_ACCESS_KEY_SECRETemptyAccess key the PAM server uses toward the SSH proxy.
KEYCYTE_SSH_PROXY_WS_URLws://ssh-proxy:8443Internal WebSocket address of the SSH proxy.
KEYCYTE_DOCKER_PROJECTemptyDocker Compose project name. When set, Settings > Services lists only the containers of this project; otherwise it lists all containers on the host.
DOCKER_HOST—Docker socket used by Settings > Services. Package: unix:///var/run/docker.sock.

Native RDP Launch

These variables have no config.yaml key. Native RDP launch is disabled unless the URL, public address and access key are all set.

VariableDefaultDescription
KEYCYTE_RDP_PROXY_URLemptyInternal address of the RDP proxy control API. Package: http://rdp-proxy:7171.
KEYCYTE_RDP_PROXY_PUBLIC_ADDRESSemptyhost:port of the RDP proxy as user workstations reach it, written into the .rdp file, for example pam.example.com:3389.
KEYCYTE_RDP_PROXY_ACCESS_KEY_ID, KEYCYTE_RDP_PROXY_ACCESS_KEY_SECRETemptyAccess key for the RDP proxy.
KEYCYTE_RDP_LAUNCH_TOKEN_TTL_SECS120Lifetime of the single-use connection token, in seconds.

Logging

Variableconfig.yaml keyDefaultDescription
KEYCYTE_LOG_LEVELlog.levelinfoLog level at startup: debug, info, warn or error. A log level saved on Settings > General (Log Level) overrides it and can be changed without a restart.
KEYCYTE_LOG_FORMATlog.formattexttext (readable) or json (for log collectors).
KEYCYTE_LOG_SOURCElog.sourcefalseAdd the source file and line to every log line.

Installation Package Variables

The .env file of the installation package also contains variables that are used by docker-compose.yml and by the other containers, not directly by the PAM server.

VariableSet byDescription
PRIMARY_DNS, SECONDARY_DNSInstallerDNS servers of all containers.
DOCKER_GIDInstallerGroup ID of the host’s docker group.
KEYCYTE_BASE, KEYCYTE_DRIVE, KEYCYTE_RECORDInstallerHost directories ~/keycyte, ~/drive, ~/record.
RUN_UID, RUN_GIDInstallerUser and group ID the containers run as.
TZPackageTime zone of all containers.
SSH_IDLE_TIMEOUTPackageIdle timeout of SSH proxy sessions.
DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASSWORD, DB_SSLMODEPackageDatabase connection of the PAM server and the SSH proxy.
Page updated: November 1, 2026 Send feedback
Search