BeyondTrust Privileged Remote Access
What is it?
BeyondTrust Privileged Remote Access (PRA/SRA) brokers access to everything the dashboard builds. The dashboard creates and tears down Shell Jump, Web Jump, Remote RDP and Protocol Tunnel jump items, plus PRA Vault accounts, so operators reach VMs, container UIs, databases and Kubernetes API servers through PRA rather than direct network exposure.
Driven by the sra Terraform provider (ARM64-native, no binary dependency) plus a small
REST client for the few calls the provider can't make. It also runs the Gateway hosts
those jumps are brokered through — one auto-managed per cloud, plus any you deploy to
carry session load. See Gateway hosts.
Gated by pra_enabled. This is one of three independently-gated BeyondTrust products; see
BeyondTrust Integrations for the map, and
Password Safe for the credential-vaulting half of the story.
Prerequisites
| Requirement | Notes |
|---|---|
| BeyondTrust PRA | Appliance or cloud tenant. Required for jump items, protocol tunnels and PRA Vault accounts |
Terraform + the sra provider |
How PRA jump items are created and destroyed; fetched by the dashboard's Terraform flow. No CLI to install |
| A Jump Group and a Gateway | Both must already exist in PRA — the dashboard looks them up by name and does not create them |
Setup
Step 1 — PRA Config API credentials
The sra Terraform provider and the REST client both authenticate to the BeyondTrust
PRA Configuration API with an OAuth 2.0 client-credentials pair.
- In BeyondTrust PRA → Configuration → API Configuration → Add API Account. Copy the Client ID and Client Secret.
- The API host is the hostname of your PRA appliance, e.g.
https://pra.company.com.
Grant the account permission to manage Jump Items and Jump Groups, and — if you use the cloud-database or Kubernetes tunnels — read access to Vault Accounts (the dashboard enumerates account groups to populate the provision form).
If your PRA appliance and Password Safe are the same host, these credentials may be identical to the Password Safe API Registration pair — see Password Safe → Step 1.
Optional second credential. Onboarding a database's PRA Vault account into Password
Safe creates a functional account whose username/password is a PRA Config API client
pair. Set pra_config_api_client_id / pra_config_api_client_secret to use a separate,
narrower client for that; left blank, the dashboard falls back to the main
bt_client_id / bt_client_secret.
Step 2 — Enable and configure in the dashboard
Option A — Setup wizard (first run)
The wizard's Feature Flags step lists the optional integrations. Toggle Privileged Remote Access on there — that step carries toggles only, so fill in the fields from Settings → Integrations once you have logged in.
Option B — Settings → Integrations (after first run)
- Open Settings → Integrations → Privileged Remote Access → toggle on
(
pra_enabled). - Fill in the API connection section:
| Field | Example |
|---|---|
| PRA API Host | https://pra.company.com |
| OAuth Client ID | (from API Account) |
| OAuth Client Secret | (from API Account) |
- Fill in Shell Jump provisioning — the Jump Group and Gateway to use, with optional per-cloud overrides for Azure and GCP. The pickers enumerate both from the PRA Config API, so a value that isn't listed does not exist.
- Click Save. No container restart is required.
These are Settings keys, not environment variables. The dashboard's config store reads from the database only; exporting an equivalently-named env var has no effect.
What it enables in the dashboard
| Feature | Description |
|---|---|
| PRA jump items | Shell Jump (VMs), Web Jump (Portainer / Rancher UIs), Remote RDP (virtual desktops) and Protocol Tunnel (databases, Kubernetes API) — created and torn down with the resource |
| Gateway hosts | The hosts those jumps broker through. One per cloud is auto-ensured and reference-counted; Containers → Gateways inventories them and deploys more to carry session load. See Gateway hosts |
| PRA Vault accounts | Tunnel credentials are minted as PRA Vault accounts, which can themselves be onboarded into Password Safe for rotation |
Kubernetes tunnel identity
A cluster's PRA k8s tunnel injects a ServiceAccount bearer token at session launch
(Kubernetes → Access & identity). PRA mints that
ServiceAccount in-cluster; pra_k8s_namespace / pra_k8s_sa_name name it, and
bt_vault_account_group_id is the vault account group injected Kubernetes, database and
Web Jump credentials land in.
Password Safe can take that token over and rotate it on the tenant's schedule — the
managed account name is <namespace>/<serviceaccount>, built from the two keys above. See
Password Safe → Kubernetes ServiceAccount token rotation.
That path needs both products enabled; PRA alone injects a token that never rotates.
Preparing images for PRA
Shell Jump connectivity is baked at image-build time — sshd hardening, passwordless sudo, and optional SSH certificate-authority trust so accounts accept certificates PRA issues instead of needing a static key. Because those scripts also prepare Password Safe and EPM-L in the same pass, they are documented once on the hub: BeyondTrust Integrations → Preparing images for BT management.
Advanced configuration
| Key | Notes |
|---|---|
bt_api_host |
PRA appliance hostname, e.g. tenant.beyondtrustcloud.com |
bt_client_id / bt_client_secret |
PRA Config API OAuth client-credentials pair |
pra_config_api_client_id / pra_config_api_client_secret |
Optional narrower client used only for the PRA Vault functional account; falls back to bt_client_id / bt_client_secret |
bt_jump_group_name |
Jump group new jump items land in |
bt_jumpoint_name |
The Gateway to route through, by name — the pickers in Settings enumerate both from the PRA Config API |
azure_bt_jump_group_name / azure_jumpoint_name |
Azure-specific overrides; blank falls back to the values above |
gcp_bt_jump_group_name / gcp_jumpoint_name |
GCP-specific overrides; blank falls back to the values above |
azure_vm_jumpoint_mode |
shared (default) or aci — whether a single Azure VM deploy borrows the ref-counted Gateway VM or starts its own ACI container group |
gcp_vm_jumpoint_mode |
shared (default) or paired — whether a single GCP VM deploy borrows the ref-counted Gateway host or starts its own |
pra_k8s_namespace / pra_k8s_sa_name |
pra-access — the ServiceAccount PRA injects for Kubernetes tunnels |
bt_vault_account_group_id |
Vault account group new tunnel credentials are created in |
bt_ps_deploy_key_title |
Title of the Password Safe secret holding the Docker deploy key — the dashboard looks secrets up by title. Needs Password Safe too |
bt_shell_jump_id |
Recorded per-VM so the jump item can be torn down with the VM; not operator-set |
Self-hosted Gateway (AWS). A separate bt_ecs_* block provisions a Gateway host
as an ECS task or EC2 instance (bt_ecs_launch_type, bt_ecs_cluster,
bt_ecs_jumpoint_subnet_id, bt_ecs_image, and the CPU/memory/role keys). Configure it
in the same Settings panel; it exists so a cloud VPC can have a Gateway with
line-of-sight to private instances without one being run by hand.
Those keys describe the auto-managed AWS host — the one the dashboard ensures on
demand and reclaims when idle. It is not the only one you can have: Containers →
Gateways lists every gateway host in every cloud and deploys additional ones, which
join the same PRA Gateway as extra cluster nodes (so bt_jumpoint_name never changes).
Full detail — the managed-vs-requested lifecycle, placement, naming, and the node-firewall
consequences — is in Gateway hosts.
Troubleshooting
PRA jump item wasn't created — the jump item is created by Terraform with the sra
provider as part of the resource's own job, so the failure is in that job's log, not a
separate one. Check that bt_api_host is reachable from the container
(docker compose exec app curl -Is "https://<bt_api_host>"), that the PRA Config API
account may manage Jump Items, and that bt_jump_group_name / bt_jumpoint_name match
entries that exist in PRA — they are matched by name, so a rename in PRA breaks
them silently. A self-signed appliance certificate may need adding to the container's
CA store.
Shell Jump connects but authentication fails — the target account has to exist on the
VM with the right key. Images built with the bt-ready provisioner create adminuser and
harden sshd; see
Preparing images.
A session times out reaching a private resource — the Gateway host needs network line-of-sight to the target, and its node firewall has to allow the source. Both are covered in Gateway hosts.