KeycyteHelp Center

Use your browser’s Print dialog and choose “Save as PDF”.

Privileged Access Management

Keycyte PAM 3.2

Deployment Guide

About This Guide

This guide describes how to plan, install and configure Keycyte PAM, and how to upgrade and back it up.

The guide applies to Keycyte PAM 3.2. Keycyte PAM runs as a set of Docker containers that are started with Docker Compose on a Linux host.

Intended Audience

The guide is intended for system administrators and IT engineers who deploy and maintain Keycyte PAM. You should be familiar with Linux administration, Docker, TLS certificates and your network environment.

Contents

SectionDescription
ArchitectureKeycyte PAM components and the paths that user connections take.
Planning and PreparationSystem requirements, network ports, certificates and licensing.
InstallationPreparing the installation package, running the installer and signing in for the first time.
Initial ConfigurationLicence, Web TLS certificate, notifications, directory services and service access keys.
High AvailabilityRunning several Keycyte PAM nodes with one master node.
Backup and RestoreBacking up the configuration database and restoring it.
Configuration Referenceconfig.yaml settings and KEYCYTE_* environment variables.
TroubleshootingService logs, certificate reset and common issues.

Document Conventions

Note

Notes give additional information about the topic.

Important

Important notes describe conditions that must be met before you continue; ignoring them can cause data loss or service interruption.

Tip

Tips describe an easier or better way of doing something.

Warning

Warnings describe actions that can cause data loss or a security risk.

Architecture

A Keycyte PAM deployment is a set of Docker containers on one Linux host, started and managed with Docker Compose. The PAM server is the central component: it serves the web interfaces, stores the configuration in PostgreSQL, applies roles and policies, and controls every privileged session. The other components handle specific protocols or tasks and talk to the PAM server over an internal Docker network.

Users never receive the passwords of target accounts. They connect to Keycyte PAM, and Keycyte PAM opens the connection to the target system with the credential stored in the Password Vault.

In This Section

TopicDescription
ComponentsThe containers in a deployment, what each one does and which ports it uses.
Connection PathsHow browser sessions and native SSH and RDP clients reach target systems.

Components

A Keycyte PAM deployment consists of the containers described below. All containers are attached to one internal Docker bridge network (keycyte-net) and reach each other by service name. Only the ports listed as published are reachable from outside the host.

Component Overview

ComponentCompose serviceImagePublished portPurpose
PAM serverpamkeycyte-pam443/tcpWeb interfaces, REST API, policy engine, session control, scheduled jobs.
SSH proxyssh-proxykeycyte-ssh-proxy2222/tcpSSH sessions from native SSH clients, web terminal and SFTP sessions.
RDP proxyrdp-proxykeycyte-rdp-proxy3389/tcpRDP sessions from native RDP clients (for example Microsoft Remote Desktop Connection).
Gateway (guacd)guacdguacamole/guacd—Protocol gateway for graphical and terminal sessions opened in the browser.
Password Managerpassword-managerkeycyte-password-manager—Changes and verifies passwords on target systems (password rotation).
RADIUS serverradiuskeycyte-radius-server1812/udpRADIUS authentication for network devices and applications against Keycyte PAM users.
TACACS+ servertacacskeycyte-tacacs-server49/tcpTACACS+ authentication, authorization and accounting for network devices.
Databasepostgrespostgres:17—PostgreSQL database that stores the configuration, vault, logs and session history.

PAM Server

The PAM server (pam container) is the core of Keycyte PAM. It:

SSH Proxy

The SSH proxy (ssh-proxy container) handles SSH traffic:

The SSH proxy writes SSH session recordings to the recordings directory.

RDP Proxy

The RDP proxy (rdp-proxy container) accepts connections from native RDP clients on port 3389 (port 13389 inside the container). When a user chooses to connect with a native client, the PAM server pushes a single-use connection token and the credentials to the RDP proxy, and gives the user an .rdp file. The RDP proxy then opens the RDP connection to the target system.

Gateway (guacd)

The gateway (guacd container) is an Apache Guacamole proxy daemon. The PAM server uses it, on port 4822 inside the network, for sessions that run in the browser: RDP, VNC, Telnet, Kubernetes, RemoteApp, web application and 3rd party application sessions. The gateway has access to the file transfer directory (/drive) and the recordings directory.

Password Manager

The Password Manager service (password-manager container) changes and verifies passwords on target systems, for example Windows local accounts and Active Directory accounts. The PAM server calls it, on port 1453 inside the network, during manual and scheduled password changes. It reads the LDAP CA file from the shared application directory.

RADIUS Server

The RADIUS server (radius container) listens on port 1812/udp. It authenticates RADIUS clients (for example network devices or VPN gateways) against Keycyte PAM users by calling the PAM server’s internal API. Its settings are managed on Settings > Radius Server in the Admin Panel.

TACACS+ Server

The TACACS+ server (tacacs container) listens on port 49/tcp. It authenticates administrators of network devices against Keycyte PAM, returns authorization decisions and sends accounting records to the PAM server. Its settings are managed on Settings > TACACS+ Server in the Admin Panel.

Database

The PostgreSQL database (postgres container, PostgreSQL 17) stores all Keycyte PAM data. Its data is kept in the Docker volume postgres-data. The database port is not published on the host; only the containers on the internal network can reach it.

Note

The PAM server can also use an external PostgreSQL server. In that case, set the database connection variables to the external server (see Configuration Reference).

Host Directories

The installer creates three directories in the home directory of the user who runs it and mounts them into the containers:

Host directoryMounted asUsed byContents
~/keycyte/app (PAM server, Password Manager), /base (SSH proxy)PAM server, SSH proxy, Password ManagerCertificate files, optional config.yaml, local backup files (backups/) and the master node marker file.
~/drive/drivePAM server, gatewayFiles transferred in browser sessions.
~/record/recordPAM server, SSH proxy, gatewaySession recordings.

Important

Session recordings can grow quickly. Place ~/record on a file system with enough free space, and monitor it. See System Requirements.

Connection Paths

Users reach target systems through Keycyte PAM in one of three ways. In every case the user authenticates to Keycyte PAM, Keycyte PAM checks the user’s roles and policies, and the connection to the target system is opened by a Keycyte PAM component with the credential from the Password Vault.

PathUser sideEntry pointComponent that connects to the target
Browser session (graphical or terminal)Web browser, Client PanelPAM server, 443/tcp (HTTPS and WebSocket)Gateway (guacd)
Browser SSH terminal and SFTPWeb browser, Client PanelPAM server, 443/tcp (HTTPS and WebSocket)SSH proxy
Native SSH clientAny SSH clientSSH proxy, 2222/tcpSSH proxy
Native RDP clientRDP client with an .rdp fileRDP proxy, 3389/tcpRDP proxy

Browser Sessions

Browser sessions need no client software. The user opens a server in the Client Panel and the session runs in a browser tab.

  1. The browser connects to the PAM server on port 443 over HTTPS.
  2. The user selects a server and an account. The PAM server checks the roles, MFA and approval requirements.
  3. The PAM server opens a WebSocket from the browser and connects to the target system:
    • For RDP, VNC, Telnet, Kubernetes, RemoteApp, web application and 3rd party application sessions, the PAM server asks the gateway (guacd, port 4822 on the internal network) to connect to the target. The gateway connects to the target system on the port configured for the server.
    • For SSH terminal and SFTP sessions, the PAM server relays the WebSocket to the SSH proxy (port 8443 on the internal network). The SSH proxy connects to the target system over SSH.
  4. The PAM server records the session if the server role requires it.

Web application and 3rd party application sessions run on a jump server: the gateway opens an RDP session to the jump server that is configured on Settings > Connection, and the application starts there.

Native SSH Clients

Users who prefer their own SSH client connect to the SSH proxy on port 2222. The Client Panel shows the command to copy, in this form:

ssh <vault_id>@<server_id>@<pam_user>@pam.example.com -p 2222
  1. The SSH client connects to the SSH proxy on port 2222 and authenticates the user.
  2. The SSH proxy asks the PAM server, over its internal API, whether the user may use the requested account on the requested server. The request is signed with the SSH proxy’s access key (see Service Access Keys).
  3. The SSH proxy connects to the target system with the vault credential and records the session if required.

Native RDP Clients

Native RDP access requires the RDP proxy (see Components).

  1. The user selects a server and an account in the Client Panel and chooses to connect with a native RDP client.
  2. The PAM server pushes a single-use connection token and the credentials to the RDP proxy over the internal network, signed with the RDP proxy access key.
  3. The user receives an .rdp file and a single-use password. The .rdp file points to the public address of the RDP proxy, which is set in KEYCYTE_RDP_PROXY_PUBLIC_ADDRESS.
  4. The RDP client connects to the RDP proxy on port 3389. The RDP proxy validates the token and opens the RDP connection to the target system.

The token expires after 120 seconds by default (KEYCYTE_RDP_LAUNCH_TOKEN_TTL_SECS). If the RDP proxy URL, public address or access key is not configured, native RDP launch is disabled.

Service-to-Service Traffic

Besides user connections, the components talk to each other on the internal network:

FromToPurpose
SSH proxy, RADIUS server, TACACS+ serverPAM server (https://pam)Authentication, authorization, configuration and session events, signed with access keys.
PAM serverSSH proxySession control (for example terminating a session), signed with the PAM access key.
PAM serverRDP proxyPushing connection tokens and credentials for native RDP launch.
PAM serverPassword ManagerPassword change and verification on target systems.
PAM server, SSH proxyPostgreSQLDatabase access.

Planning and Preparation

Before you install Keycyte PAM, prepare a Linux host that meets the system requirements, open the required network ports, obtain the TLS certificate files and plan the licence.

In This Section

TopicDescription
System RequirementsHardware, operating system, Docker and browser requirements.
Network PortsPorts to open for users, network devices, target systems and internal traffic.
CertificatesThe PKCS#12 keystore used at startup and the CA files for LDAP.
LicensingHow the licence is bound to the system and what a licence key contains.

System Requirements

Keycyte PAM runs all of its components as Docker containers on one Linux host. Make sure that the host meets the following requirements before you install Keycyte PAM.

Hardware

ResourceRequirement
CPU8 cores
Memory16 GB RAM
Disk500 GB

The disk holds the container images, the PostgreSQL database volume, session recordings (~/record), transferred files (~/drive) and local backup files (~/keycyte/backups). Session recordings usually take the most space. If you record many sessions or keep recordings for a long time, plan additional disk space for ~/record.

Operating System

Docker

SoftwareRequirement
Docker EngineInstalled and running. The installer stops if docker info fails.
Docker ComposeCompose v2 (the docker compose plugin).

The installer checks both before it does anything else. To install Docker Engine and the Compose plugin, see the Docker documentation: https://docs.docker.com/engine/install/ and https://docs.docker.com/compose/install/.

The host must have a docker group. The installer reads its group ID and gives the PAM server read-only access to the Docker socket, which the Settings > Services page uses.

Note

During installation, Docker Compose pulls the PostgreSQL image (postgres:17) from Docker Hub. On hosts without internet access, load the postgres:17 image before you run the installer.

Time Zone and DNS

Browsers

Users work with Keycyte PAM in a web browser; no client software is needed for browser sessions. Use a current version of Google Chrome, Microsoft Edge, Mozilla Firefox or Apple Safari.

Network Ports

Open the following ports in the firewalls between users, network devices, target systems and the Keycyte PAM host.

Inbound Ports

These ports are published on the Keycyte PAM host.

PortProtocolSourceComponentPurpose
443TCPUser browsers, API clientsPAM serverClient Panel, Admin Panel, REST API, WebSocket traffic of browser sessions.
2222TCPUser workstationsSSH proxyNative SSH client connections.
3389TCPUser workstationsRDP proxyNative RDP client connections. Only when the RDP proxy is deployed.
1812UDPRADIUS clients (network devices, VPN gateways)RADIUS serverRADIUS authentication.
49TCPNetwork devicesTACACS+ serverTACACS+ authentication, authorization and accounting. Only when the TACACS+ server is deployed.

Outbound Ports

These connections start from the Keycyte PAM host. The exact ports depend on your environment and on the port configured for each server.

DestinationTypical portProtocolComponentPurpose
Target systems (RDP, RemoteApp, jump servers)3389TCPGateway, RDP proxyRDP sessions.
Target systems (SSH, SFTP)22TCPSSH proxySSH and SFTP sessions.
Target systems (VNC, Telnet, Kubernetes, databases)Configured per serverTCPGatewaySessions of other protocols.
Windows and Active Directory targetsDepends on the change methodTCPPassword ManagerPassword change and verification.
LDAP / Active Directory servers389 or 636TCPPAM server, Password ManagerDirectory authentication, user synchronization, discovery.
Mail serverConfigured on Settings > NotificationTCPPAM serverE-mail notifications and reports.
SMS gatewayConfigured on Settings > NotificationTCPPAM serverSMS notifications and one-time passwords.
Syslog serversConfigured on Settings > Syslog SettingsAs configuredPAM serverForwarding audit records to SIEM.
SFTP backup targetPort in the backup configuration (SSH, usually 22)TCPPAM serverCopying backup files.
DNS servers53UDP, TCPAll containersName resolution.
Docker Hub443TCPDocker EnginePulling postgres:17 during installation, if it is not loaded in advance.

Internal Ports

These ports are used only on the internal Docker network keycyte-net and are not published on the host. You do not need to open them in a firewall.

PortComponentUsed byPurpose
443PAM serverSSH proxy, RADIUS server, TACACS+ serverInternal API (https://pam).
4822Gateway (guacd)PAM serverBrowser sessions.
8443SSH proxyPAM serverWeb terminal and SFTP WebSocket relay, session control.
7171RDP proxyPAM serverPushing native RDP connection tokens.
13389RDP proxyDocker (published as 3389)RDP listener inside the container.
1453Password ManagerPAM serverPassword change and verification requests.
5432PostgreSQLPAM server, SSH proxyDatabase.

Certificates

Keycyte PAM serves its web interfaces only over HTTPS and connects to LDAP directories over TLS. Prepare the following files before you run the installer and place them in the installation package folder.

FileRequiredPurpose
localhost.p12YesPKCS#12 keystore with the server certificate and private key that the PAM server uses for HTTPS at startup.
cacerts.pemYesPEM file with the CA certificates that the PAM server and the Password Manager trust for LDAP over TLS.
keycyte-ca.crtNoAdditional CA certificate. Copied by the installer if present.

The installer copies the files to ~/keycyte, which is mounted into the PAM server as /app. It warns if localhost.p12 or cacerts.pem is missing after the copy.

HTTPS Certificate

At startup, the PAM server loads the HTTPS certificate in the following order:

  1. The certificate that a MASTER administrator applied on Settings > Web TLS Certificate in the Admin Panel. It is stored in the database.
  2. The PKCS#12 keystore from KEYCYTE_SERVER_TLS_KEYSTORE (in the installation package: /app/localhost.p12), opened with the password in KEYCYTE_SERVER_TLS_PASSWORD.
  3. A temporary self-signed certificate that the PAM server generates at every start. Browsers show a trust warning for it.

The third level makes sure that the PAM server always starts listening on HTTPS, even if the configured certificate is missing, expired or damaged. You can then sign in, accept the browser warning, and upload a valid certificate.

The localhost.p12 keystore is used only until you apply a certificate in the Admin Panel. After installation, manage the HTTPS certificate on Settings > Web TLS Certificate. See Configuring the Web TLS Certificate.

Requirements for the HTTPS Certificate

Plan a certificate that:

Keycyte PAM refuses Ed25519, DSA and ECDSA P-521 keys, because browsers cannot complete a TLS handshake with them.

LDAP CA File

cacerts.pem holds the CA certificates that are used to verify LDAP servers over LDAPS or StartTLS. Its path is set in LDAP_CA_CERT in the installation package’s .env file (/app/cacerts.pem). The PAM server adds these certificates to the system CA store.

You can also add LDAP server certificates later from the Admin Panel, when you configure a directory connection. See the Administrator Guide, section Settings > Authentication.

Warning

Do not set LDAP_INSECURE (KEYCYTE_LDAP_INSECURE_SKIP_VERIFY) to true in production. It disables verification of LDAP server certificates.

Licensing

A valid license is required.

A Keycyte PAM licence key is issued for one specific system. You generate a Secret Key on the installed system, send it to Keycyte, and receive a licence key that you enter in the Admin Panel. The steps are described in Activating the Licence.

How the Licence Is Bound to the System

The Secret Key shown on Settings > License identifies the system on which the PAM server runs. It is calculated from:

When you save a licence key, Keycyte PAM checks that it was generated for the same values. If it was not, the key is rejected with the message license key not generated for this system.

Important

Generate the Secret Key only after the system is in its final form: final host, final number of CPUs, and the PAM server container created by the installer. If one of these values changes later, a licence key generated for the old values can no longer be saved, and you need a new licence key.

Licence Fields

After a licence key is saved, Settings > License shows the following fields:

FieldDescription
Company NameThe company the licence is issued to.
Create DateThe date the licence key was created.
Total UserThe number of users the licence covers.
VersionThe product version the licence is issued for.

Licensed Features

A licence key also carries flags for the following features. Each flag is either enabled or disabled in the key.

FeatureDescription
Session recordingRecording of privileged sessions.
Directory serviceIntegration with LDAP / Active Directory directories.
TACACS+The TACACS+ server.
Password managerAutomatic password change and verification on target systems.

Contact Keycyte to change the number of users or the licensed features. You receive a new licence key, which replaces the current one.

Installation

Keycyte PAM is delivered as an installation package that contains the container images, a Docker Compose file, an environment file and an installer script. The installer loads the images, asks for the DNS servers, prepares the host directories, starts the containers and creates the first administrator account.

To install Keycyte PAM, complete the following steps in order:

  1. Prepare the installation package: copy the package to the host and add the certificate files.
  2. Run the installer.
  3. Sign in for the first time with the master account and change its password.

After installation, continue with Initial Configuration.

Before You Begin

Preparing the Installation Package

Before you run the installer, copy the installation package to the Keycyte PAM host and add the certificate files to it.

Package Contents

The installation package is one folder with the following files:

FileDescription
install.shInstaller script.
docker-compose.ymlDocker Compose file that defines the containers.
.envEnvironment file with the settings and secrets of the deployment. The installer adds the values it collects to this file.
keycyte-pam.tar.gzArchive with the container images of the PAM server, SSH proxy, Password Manager, RADIUS server and gateway (guacd).
initdb/10-master-user.sqlScript that creates the first administrator account (master).
localhost.p12PKCS#12 keystore for HTTPS. It can be delivered with the package, or you add your own.

Note

.env is a hidden file. Use ls -la to see it. The installer stops if .env, docker-compose.yml or keycyte-pam.tar.gz is missing.

Warning

The .env file contains the database password, the encryption key for stored secrets, the session secret and the service access keys. Restrict access to it (for example chmod 600 .env), and keep a secure copy outside the host. Without the encryption key, encrypted data in the database and in backup files cannot be decrypted.

Preparing the Package

To prepare the installation package:

  1. Copy the installation package folder to the Keycyte PAM host, for example to the home directory of the user who will run the installer.

    The host directories (~/keycyte, ~/drive, ~/record) are created in the home directory of the user who runs sudo ./install.sh, not in the home directory of root.

  2. Copy the certificate files to the package folder, next to install.sh:

    • localhost.p12 — the PKCS#12 keystore for HTTPS (if you use your own instead of the delivered one);
    • cacerts.pem — the CA certificates for LDAP over TLS;
    • keycyte-ca.crt — optional.

    For details, see Certificates.

  3. If you use your own localhost.p12, make sure that its password matches the keystore password in .env (TLS_KEYSTORE_PASSWORD).

  4. Check the time zone in .env (TZ), for example TZ=Europe/Istanbul.

  5. If the host has no internet access, load the PostgreSQL image on the host:

    docker load -i postgres-17.tar

    The image must be available as postgres:17. You can create the archive on a host with internet access with docker pull postgres:17 and docker save -o postgres-17.tar postgres:17.

  6. Make the installer executable:

    chmod +x install.sh

The package is ready. Continue with Running the Installer.

Running the Installer

The installer install.sh installs Keycyte PAM on the host from the prepared installation package. It is a bash script and must be run with sudo from the package folder.

Before You Begin

Installer Options

OptionDescription
--dns <ip>Sets the primary DNS server and skips the DNS prompts. The secondary DNS server is set to the same address. --dns=<ip> is also accepted.
--skip-loadSkips loading the images from keycyte-pam.tar.gz. Use it when you run the installer again and the images are already loaded.
-h, --helpShows the usage text.

What the Installer Does

The installer runs the following steps:

  1. Prerequisites. Checks that Docker is installed, that the Docker daemon is running and accessible, and that Docker Compose is available. Checks that keycyte-pam.tar.gz, docker-compose.yml and .env are in the package folder.
  2. Images. Extracts keycyte-pam.tar.gz and loads every image in it with docker load. Then checks that the images keycyte-pam:latest, keycyte-ssh-proxy:latest, keycyte-password-manager:latest, keycyte-radius-server:latest and guacamole/guacd:latest exist. The check also runs with --skip-load.
  3. DNS. Asks for the primary and secondary DNS servers and writes them to .env (PRIMARY_DNS, SECONDARY_DNS).
  4. Docker group. Finds the group ID of the host’s docker group and writes it to .env (DOCKER_GID), so that the PAM server can read the Docker socket.
  5. Host directories. Creates ~/keycyte, ~/drive and ~/record in the home directory of the user who ran sudo, makes that user their owner, and writes the paths and the user and group IDs to .env (KEYCYTE_BASE, KEYCYTE_DRIVE, KEYCYTE_RECORD, RUN_UID, RUN_GID). The containers run with this user and group ID.
  6. Certificates. Copies localhost.p12, cacerts.pem and keycyte-ca.crt (those that exist) to ~/keycyte. Warns if localhost.p12 or cacerts.pem is missing.
  7. Database check. If .env points to an external database server by IP address, checks that its port is reachable.
  8. Start. Starts all containers with docker compose up -d, waits a few seconds, shows the container status and the last log lines of any container that is not running.
  9. Master account. Waits until PostgreSQL is ready and the PAM server has created the database schema, then runs initdb/10-master-user.sql to create the master account. If the account already exists, it is left unchanged.

Running the Installer

To run the installer:

  1. Open a shell on the host and go to the installation package folder.

  2. Run the installer:

    sudo ./install.sh

    To set the DNS server without prompts:

    sudo ./install.sh --dns 10.0.0.53
  3. When prompted, enter the IP address of the primary DNS server, and press Enter.

    The prompt shows the current value from .env in brackets. Press Enter without typing to keep it. The installer accepts only an IPv4 address and asks again if the value is not valid.

  4. When prompted, enter the IP address of the secondary DNS server, or press Enter to skip it.

    If you skip it, the secondary DNS server is set to the primary one.

  5. Wait until the installer finishes.

    The installer prints the status of every container. If all containers run, it prints a message that the installation is complete and all services are up. It then applies the master account script and prints the commands for viewing logs and stopping the services.

Keycyte PAM is installed. Continue with Signing In for the First Time.

Checking the Installation

To check the containers after installation, run the following command in the package folder:

sudo docker compose --env-file .env -f docker-compose.yml ps

All containers (pam, ssh-proxy, guacd, password-manager, radius, postgres-db) should be in the running state.

To follow the PAM server log:

sudo docker compose --env-file .env -f docker-compose.yml logs -f pam

If the Master Account Was Not Created

If PostgreSQL or the database schema was not ready in time, the installer skips the master account script and prints a warning with the command to run. In that case, wait until the PAM server has started, then run the script manually in the package folder:

sudo docker exec -i postgres-db psql -U <db-user> -d <db-name> < initdb/10-master-user.sql

Use the database user and database name from .env (DB_USER, DB_NAME). The installer prints the command with these values filled in.

Running the Installer Again

You can run the installer again, for example after you add a missing certificate file. The installer updates the values it manages in .env and leaves existing directories and the existing master account unchanged. Use --skip-load if the images are already loaded.

Note

If a required certificate file was missing, you can also copy it to ~/keycyte and restart the PAM server:

sudo docker compose --env-file .env -f docker-compose.yml restart pam

Stopping the Services

To stop and remove the containers, run in the package folder:

sudo docker compose --env-file .env -f docker-compose.yml down

The database volume and the host directories are kept. Run sudo docker compose --env-file .env -f docker-compose.yml up -d to start the services again.

Signing In for the First Time

The installer creates one administrator account, master, with the MASTER role. MASTER administrators have unrestricted access to the Admin Panel, including all settings. Use this account to sign in for the first time and to complete the initial configuration.

The initial password of the master account is provided with the installation package.

Before You Begin

Signing In

To sign in for the first time:

  1. In a web browser, open https://<pam-address>/admin, for example https://pam.example.com/admin.

    If the PAM server uses the keystore delivered with the package or a self-signed certificate, the browser shows a certificate warning. Check that you opened the correct address, and continue to the page. You replace the certificate in a later step.

  2. On the sign-in page, enter master in Username, enter the initial password in Password, and click Sign in.

    If the Client Panel opens instead of the Admin Panel, open https://<pam-address>/admin again. The Admin Panel opens with the Dashboard.

    Admin Panel Dashboard after the first sign-in as master

  3. Change the password of the master account.

Warning

Change the initial password of the master account at first sign-in. The initial password is the same for every installation from the package, so anyone who knows it could sign in with full rights.

After the First Sign-In

Continue with the initial configuration:

  1. Activate the licence.
  2. Configure the Web TLS certificate so that browsers trust Keycyte PAM.
  3. Configure e-mail and directory services, and check the service access keys.

Tip

Set an e-mail address for the master account and configure e-mail notifications early. Keycyte PAM e-mails MASTER administrators, for example when the Web TLS certificate is about to expire.

Initial Configuration

After you sign in for the first time, configure the settings below before users start working with Keycyte PAM. All of them are on the Settings menu of the Admin Panel and require the MASTER role.

In This Section

TopicDescription
Activating the LicenceGenerating the secret key and entering the licence key.
Configuring the Web TLS CertificateUploading, validating and applying the HTTPS certificate; expiry warnings.
Configuring E-Mail and SMSMail server and SMS gateway for notifications and one-time passwords.
Connecting Directory ServicesLDAP / Active Directory, RADIUS and Microsoft Entra ID authentication.
Service Access KeysKeys that the Keycyte PAM services use to authenticate to each other.

Activating the Licence

A valid license is required. To activate it, you send the Secret Key of your system to Keycyte, receive a licence key for that system, and enter the licence key in the Admin Panel.

For how the licence is bound to the system and what it contains, see Licensing.

Before You Begin

Getting the Secret Key

To get the secret key of the system:

  1. In the Admin Panel, open Settings > License.

  2. Click Secret Key.

    The Secret Key dialog shows the key of this system.

  3. Copy the key, and click Close.

  4. Send the key to Keycyte together with your order details.

You receive a licence key that is generated for this system.

Entering the Licence Key

To enter the licence key:

  1. Open Settings > License.
  2. Click Add.
  3. In the Add Licence dialog, paste the licence key into Licence Key.
  4. Click Save.

The licence appears in the list with its Company Name, Create Date, Total User and Version.

If the key cannot be saved, the Admin Panel shows an Error message and the licence list does not change. The most common causes are:

Replacing or Removing the Licence

Keycyte PAM holds one licence at a time. When you save a new licence key, it replaces the current one.

Configuring the Web TLS Certificate

The Web TLS certificate is the HTTPS certificate that browsers see when they open the Client Panel or the Admin Panel. You manage it on Settings > Web TLS Certificate. A new certificate takes effect immediately for new connections; you do not need to restart Keycyte PAM.

Before You Begin

Tip

If you have a PFX/PKCS#12 file, convert it to PEM first:

openssl pkcs12 -in cert.pfx -nokeys -out cert.pem
openssl pkcs12 -in cert.pfx -nocerts -nodes -out key.pem

Viewing the Current Certificate

Open Settings > Web TLS Certificate. The Current Certificate card shows the certificate that the PAM server uses now:

FieldDescription
SourceWhere the certificate comes from: a certificate applied on this page, the PKCS#12 keystore from the installation, or a temporary self-signed certificate.
Days RemainingDays until the certificate expires.
SubjectSubject of the certificate.
IssuerIssuer of the certificate.
Valid From, Valid UntilValidity period.
Subject Alt NamesDNS names and IP addresses the certificate covers.
SHA256 FingerprintFingerprint of the certificate.
Uploaded By, Uploaded AtAdministrator who applied the certificate, and when.

A status message above the details shows, for example, that the certificate is healthy, expires soon, is self-signed, or that the server runs on the installation keystore or on a temporary self-signed certificate.

Applying a New Certificate

To apply a new certificate:

  1. Open Settings > Web TLS Certificate.

  2. In the Upload New Certificate card, fill in the fields. You can paste the PEM text, or click Load from file next to a field to read it from a file.

    FieldDescription
    Certificate (PEM)The server certificate. If you paste a full chain (server certificate followed by intermediates), Keycyte PAM separates the server certificate from the chain.
    Private Key (PEM)The unencrypted private key of the certificate.
    Intermediate Chain (PEM, optional)The intermediate certificates of your CA, if they are not in the certificate field.
  3. Click Validate.

    The Validation Preview shows the parsed certificate and any warnings. Validation fails if, for example, the certificate and the key do not match, the certificate is expired or not yet valid, the key type is not supported, or the chain does not belong to the certificate.

    Warnings do not stop you from applying the certificate. Typical warnings are: the certificate is self-signed, it expires soon, it does not cover the host name, it is issued by a CA but no chain was supplied, or the chain ends at an internal intermediate whose root is not trusted by the server.

  4. Check the preview, and click Apply Certificate.

  5. In the Apply Web TLS Certificate? dialog, confirm.

The certificate is applied. Existing browser sessions are not affected; new connections use the new certificate. Keycyte PAM sends the intermediate chain to browsers in issuer order, without the root certificate.

Important

Make sure that the certificate covers the DNS name users type in the browser, and that user workstations trust the issuing CA. If browsers cannot connect after you apply a certificate, see Resetting the Web TLS Certificate.

Upload History

The Upload History table lists the certificates that were applied on this page, with Subject, Issuer, Valid Until, Uploaded By and Uploaded At. The Active column marks the certificate in use.

Fallback Certificates

If no applied certificate can be loaded at startup, the PAM server falls back to the PKCS#12 keystore from the installation (KEYCYTE_SERVER_TLS_KEYSTORE), and if that also fails, to a temporary self-signed certificate that is regenerated at every start. The PAM server therefore always serves HTTPS, and you can sign in (after accepting the browser warning) to apply a valid certificate.

When an applied certificate has expired, the fallback keeps the listener online. Upload a renewed certificate as soon as possible.

Expiry Warnings

Keycyte PAM checks the active certificate once a day and e-mails all MASTER administrators when it has 30, 14, 7 and 1 days left. Each warning is sent once; the next e-mail is sent when the certificate reaches the next threshold.

E-mail warnings require:

Expiry warnings are sent only for certificates applied on this page, not for the installation keystore or the self-signed fallback.

Configuring E-Mail and SMS

Keycyte PAM uses e-mail and SMS to deliver notifications, one-time passwords and reports. Configure them right after installation, because several functions depend on them:

You configure both on Settings > Notification in the Admin Panel:

CardPurpose
Email ConfigurationMail server connection and sender. Email Test sends a test message to an address you enter.
Sms ConfigurationSMS gateway (Provider), sender and credentials, and the text of the one-time password message. Phone Test sends a test message to a number you enter.

Mail server and SMS gateway credentials are stored encrypted.

For a description of every field, see the Administrator Guide, section Settings > Notification.

Before You Begin

After you save the settings, send a test e-mail and a test SMS to make sure that delivery works.

Connecting Directory Services

Keycyte PAM can authenticate users against your existing directories instead of, or in addition to, local accounts. You configure the connections on Settings > Authentication in the Admin Panel:

CardPurpose
LDAP ConfigurationLDAP or Active Directory servers for domain user sign-in, user and group lookup, synchronization and discovery. Also used by password rotation for Active Directory accounts.
RADIUS ConfigurationAn external RADIUS server for RADIUS user sign-in.
Entra ID ConfigurationMicrosoft Entra ID for sign-in with a Microsoft account.

For a description of every field and for the user synchronization options, see the Administrator Guide, section Settings > Authentication.

Note

Settings > Authentication configures the directories that Keycyte PAM uses as a client. The RADIUS and TACACS+ servers that Keycyte PAM itself provides to network devices are configured on Settings > Radius Server and Settings > TACACS+ Server.

Deployment Prerequisites

Before you configure a directory connection, check the following:

Service Access Keys

The Keycyte PAM services authenticate to each other with access keys. Each key is a pair of an access key ID and a secret. A service signs every request to another service with an HMAC-SHA256 HTTP signature made with the secret, and the receiving service verifies the signature with the same pair.

Access keys are set in the environment of the containers, in the installation package’s .env file. The PAM server reads them at startup and keeps them in memory. You cannot create or change access keys in the Admin Panel.

Access Keys in a Deployment

KeySigned byVerified byVariable in .envVariable in the PAM serverVariable in the other service
SSH proxy keySSH proxyPAM serverSSH_PROXY_ACCESS_KEY_ID, SSH_PROXY_ACCESS_KEY_SECRETKEYCYTE_SSH_PROXY_ACCESS_KEY_ID, KEYCYTE_SSH_PROXY_ACCESS_KEY_SECRETKEYCYTE_ACCESS_KEY_ID, KEYCYTE_ACCESS_KEY_SECRET (SSH proxy)
RADIUS server keyRADIUS serverPAM serverRADIUS_ACCESS_KEY_ID, RADIUS_ACCESS_KEY_SECRETKEYCYTE_RADIUS_SERVER_ACCESS_KEY_ID, KEYCYTE_RADIUS_SERVER_ACCESS_KEY_SECRETKEYCYTE_ACCESS_KEY_ID, KEYCYTE_ACCESS_KEY_SECRET (RADIUS server)
PAM keyPAM serverSSH proxyPAM_ACCESS_KEY_ID, PAM_ACCESS_KEY_SECRETKEYCYTE_PAM_ACCESS_KEY_ID, KEYCYTE_PAM_ACCESS_KEY_SECRETKEYCYTE_PAM_ACCESS_KEY_ID, KEYCYTE_PAM_ACCESS_KEY_SECRET (SSH proxy)
RDP proxy keyPAM serverRDP proxyRDP_PROXY_ACCESS_KEY_ID, RDP_PROXY_ACCESS_KEY_SECRETKEYCYTE_RDP_PROXY_ACCESS_KEY_ID, KEYCYTE_RDP_PROXY_ACCESS_KEY_SECRETKEYCYTE_ACCESS_KEY_ID, KEYCYTE_ACCESS_KEY_SECRET (RDP proxy)

The docker-compose.yml file passes the same .env value to both sides, so the pair always matches as long as you change it only in .env.

If a key is missing, the PAM server still starts and logs a warning for the service. The affected service cannot authenticate: for example, without the SSH proxy key native SSH and web terminal sessions fail, and without the RDP proxy key native RDP launch is disabled.

Note

Service access keys are different from the API keys of service identities, which applications use to read secrets through the Secrets API. Those are managed per user in the Admin Panel. See the Administrator Guide, section Users.

Viewing the Access Keys

To view the access keys that the PAM server loaded:

  1. In the Admin Panel, open Settings > Services.

  2. Find the Service AccessKeys card.

    For each Service, the card shows the Access Key ID and the last four characters of the Secret. Services without a key are shown as not configured.

The access keys are stored in the .env file of the installation. To rotate a key, follow the procedure below.

Rotating an Access Key

Rotate an access key if you suspect that its secret was disclosed, or according to your security policy.

To rotate an access key:

  1. On the host, open the .env file in the installation package folder.

  2. Set a new value for the key’s secret, for example a random value created with openssl rand -hex 32. You can also set a new access key ID.

  3. Save the file.

  4. In the package folder, recreate the containers so that they read the new values:

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

Docker Compose recreates the containers whose environment changed. The new key is used after the containers start.

Warning

Recreating the containers interrupts the active sessions that run through them. Rotate keys in a maintenance window.

Warning

Never copy access key secrets into tickets, e-mails or chat. Anyone with a secret can call the internal API as that service.

High Availability

You can run more than one Keycyte PAM node so that users can keep working when one node is unavailable. The nodes use the same PostgreSQL database and are placed behind a load balancer. One node is the master node; the others are replica nodes.

Master and Replica Nodes

Every node serves users in the same way. The difference is in the scheduled jobs:

JobMaster nodeReplica node
Scheduled password rotationRunsDoes not run
Scheduled reportsRunsDoes not run
Scheduled backupsRunsDoes not run

This makes sure that a scheduled job runs only once, even though all nodes share the database. A node is a replica unless it is set as master. At startup, each node writes to its log whether it runs as a master or a replica node.

Important

Set exactly one node as master. If no node is master, scheduled password rotation, reports and backups do not run. If more than one node is master, scheduled jobs can run more than once.

The master setting is stored per node as the file master in the application directory of the node (~/keycyte/master on the host, /app/master in the PAM server container).

Note

“Master node” is a property of a Keycyte PAM node. It is not related to the MASTER administrator role.

Requirements

All nodes must:

The load balancer must:

Session affinity is required because some short-lived data is kept in the memory of each node and is not shared: connection tokens, MFA one-time passwords, active session and spectator registries. Without affinity, opening a session, MFA verification or joining a shared session can fail intermittently.

Setting the Master Node

To set a node as master:

  1. Sign in to the Admin Panel of that node with the MASTER role. Use the node’s own address, not the load balancer address, so that you reach the correct node.

  2. Open Settings > Replication.

    The Replication Settings card shows the Hostname, Ip Address and Mac Address of the node you are connected to.

  3. Turn on the Master switch.

    The message Master mode enabled appears. The node runs the scheduled jobs from the next scheduler cycle.

To make a node a replica, turn off the Master switch on that node.

Tip

To change the master node, first turn off Master on the old master node, then turn it on on the new one.

Replicated Servers

The Replicated Servers card lists other Keycyte PAM nodes. To add an entry, click Add, and fill in Type, Address, Status and Master, then click Save.

Backup and Restore

Keycyte PAM creates application-level backups of its database: servers, vault entries, users, roles, policies, settings and, optionally, logs. You configure backups on Settings > Backup. Only MASTER administrators can open this page.

What a Backup Contains

A backup is one encrypted file with the extension .keycyte (for example backup_20261101_020000.keycyte). Keycyte PAM serializes the database content, compresses it and encrypts it with the encryption key of the deployment (KEYCYTE_KEYSTORE_KEY_HEX).

IncludedNot included
Servers, Password Vault and Private Vault entries, password historySession recordings (~/record)
Users, roles, permission profiles, policies, access control rules, tagsTransferred files (~/drive)
Settings (authentication, notification, connection, syslog, RADIUS and TACACS+ server, licence)Certificate files and .env in the installation package
Logs, if Logs is selected in the backup configurationContainer images

Warning

A backup can only be restored on a deployment that uses the same encryption key. Keep a secure copy of the .env file, or at least of KEYSTORE_KEY_HEX, separately from the backups. Without the key, backups cannot be decrypted.

Back up ~/record, ~/drive and the installation package folder with your own file backup tools.

Where Backup Files Are Stored

Every backup is first written to the backups folder of the application directory: ~/keycyte/backups on the host (/app/backups in the PAM server container). If the backup configuration uses SFTP, the file is then copied to the SFTP server.

Tip

Plan disk space for backup files: archive or remove old files in ~/keycyte/backups regularly.

Configuring a Backup

To configure a backup:

  1. In the Admin Panel, open Settings > Backup.

  2. Click Add.

  3. In the Backup Configuration dialog, fill in the fields:

    FieldDescription
    MethodSFTP or SMB.
    AddressHost name or IP address of the backup server.
    PortSSH port of the SFTP server. Shown for SFTP only.
    PathFolder on the backup server where the file is stored.
    UsernameUser name on the backup server.
    PasswordPassword of the user. For SFTP, you can use a private key instead.
    Private KeyPrivate key for SFTP authentication. Shown for SFTP only.
    PassphrasePassphrase of the private key, if it has one. Shown for SFTP only.
    PeriodInterval of scheduled backups, in minutes. 0 or empty disables scheduled backups for this configuration.
    DescriptionFree text that helps you identify the configuration.
    LogsInclude the log tables in the backup. Backups with logs can be much larger.
    StatusEnables the configuration. Scheduled backups run only for enabled configurations.
  4. Click Save.

The configuration appears in the list with its Method, Address, Path and Status.

Scheduled Backups

The backup scheduler checks the enabled configurations every minute and starts a backup when the Period of a configuration has passed since its last run. The first scheduled backup of a configuration runs shortly after the PAM server starts.

Scheduled backups run only on the master node. See High Availability.

Running a Backup Now

To run a backup immediately, click the run icon in the Action column of a configuration.

The backup is created with the settings of that configuration. A Success message appears when it finishes.

Downloading a Backup

To download a backup file, click the download icon in the Action column.

You can also copy backup files directly from ~/keycyte/backups on the host.

Restoring a Backup

Restoring replaces the database content of Keycyte PAM with the content of the backup file.

Warning

A restore deletes all current data in the tables that the backup contains, and then inserts the data from the backup. Changes made after the backup was created are lost. Create a new backup before you restore.

Before You Begin

To restore a backup:

  1. Open Settings > Backup.

  2. Click Restore.

  3. Select the .keycyte backup file.

    The restore starts immediately after you select the file. A Success message appears when it finishes.

  4. Sign out and sign in again, and check the restored data.

If a backup taken before permission profiles existed is restored, Keycyte PAM assigns the built-in full permission profile to every ADMIN account after the restore.

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

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.

Troubleshooting

This topic describes how to collect information about a problem and how to solve common deployment issues. Run the docker compose commands in this topic in the installation package folder.

Viewing Service Logs

In the Admin Panel

Settings > Services lists the Keycyte PAM containers with their Container, Service, State, CPU, Memory and Uptime. Only MASTER administrators can open this page.

To view the log of a container:

  1. In the Admin Panel, open Settings > Services.
  2. In the Keycyte Services table, click Logs in the row of the container.

The latest log lines of the container appear.

From the same table you can Restart, Stop and Start containers. Stopping or restarting a container interrupts the sessions that it handles. The PAM server cannot stop or start itself; only Restart is available for it.

If the page shows Docker socket not available, the Docker socket is not mounted into the PAM server container. The installation package mounts /var/run/docker.sock read-only; check that docker-compose.yml still contains this mount and that DOCKER_GID in .env matches the group ID of the host’s docker group.

On the Host

To view the logs of a service on the host, use docker compose logs:

sudo docker compose --env-file .env -f docker-compose.yml logs --tail 200 pam

To follow the log continuously, add -f. The service names are pam, ssh-proxy, guacd, password-manager, radius and postgres.

Each container keeps at most three log files of 5 MB each.

Changing the Log Level

To get more detail, set the log level to debug on Settings > General (Log Level). The change takes effect immediately, without a restart. Set it back to info when you have collected the information, because debug produces a large volume of log lines.

You can also set the startup log level with KEYCYTE_LOG_LEVEL. See Configuration Reference.

Resetting the Web TLS Certificate

If a certificate applied on Settings > Web TLS Certificate prevents browsers from connecting (for example, wrong host name together with HSTS, or a certificate that clients do not trust), you can deactivate it from the command line. The PAM server then falls back to the installation keystore or to a temporary self-signed certificate, and you can sign in again to apply a correct certificate.

To reset the Web TLS certificate:

  1. On the host, run the reset command in the PAM server container:

    sudo docker exec pam keycyte-pam cert reset

    The command deactivates the active certificate in the database and prints how many rows it changed.

  2. Restart the PAM server:

    sudo docker compose --env-file .env -f docker-compose.yml restart pam
  3. Open the Admin Panel, accept the browser warning if one appears, and apply a correct certificate on Settings > Web TLS Certificate.

The applied certificate stays in Upload History; it is only no longer active.

Common Issues

A container does not start

The installer prints the last log lines of every container that is not running. You can show them again with docker compose logs <service>. Typical causes for the PAM server:

Log message containsCause and solution
session secret validation failedSESSION_SECRET_KEY in .env is empty, shorter than 32 bytes, or the built-in value. Set a random value of at least 32 bytes and recreate the containers.
No AES key configuredNo encryption key is set. Check KEYSTORE_KEY_HEX in .env.
Invalid key_hex valueKEYSTORE_KEY_HEX is not a valid hexadecimal string.
Failed to run ent auto-migrationThe PAM server could not update the database schema. Check the database connection and the rights of the database user.

The installer reports missing images

The installer stops if an expected image is not loaded after extracting keycyte-pam.tar.gz. Check the loaded images with sudo docker images. The images must be tagged keycyte-pam:latest, keycyte-ssh-proxy:latest, keycyte-password-manager:latest, keycyte-radius-server:latest and guacamole/guacd:latest.

If the postgres container cannot start because the image cannot be pulled, the host has no access to Docker Hub. Load postgres:17 manually; see Preparing the Installation Package.

The master account was not created

If the installer printed a warning that the master account script was skipped, run the script manually. See If the Master Account Was Not Created.

The browser shows a certificate warning

The PAM server uses the installation keystore or a temporary self-signed certificate. Check the Source on Settings > Web TLS Certificate, and apply a certificate that is issued for the Keycyte PAM DNS name by a CA that user workstations trust.

LDAP sign-in fails with a certificate error

The LDAP server certificate is not trusted. Check that its CA is in ~/keycyte/cacerts.pem, or add the certificate from the LDAP configuration in the Admin Panel. After you change cacerts.pem on the host, restart the pam and password-manager services.

Native SSH or web terminal sessions fail

Check the Service AccessKeys card on Settings > Services. If the SSH proxy is shown as not configured, the SSH proxy access key is missing in the PAM server environment. Also check the ssh-proxy log for authentication errors toward the PAM server. See Service Access Keys.

Scheduled password rotation, reports or backups do not run

Scheduled jobs run only on the master node. Check the Master switch on Settings > Replication, or look for the line Running as MASTER node or Running as REPLICA node in the PAM server log after startup. See High Availability.

Users are signed out or sessions fail behind a load balancer

Check that all nodes use the same SESSION_SECRET_KEY and that the load balancer uses session affinity. See High Availability.

Certificate expiry e-mails are not received

Check the mail server settings with Email Test on Settings > Notification, and check that the MASTER administrators have e-mail addresses.

Search