
SSH client presents a certificate
SSH gateway server validates and maps the user
principal or key_id) and maps it to a known Hoop user via the configured user attribute (user_id, subject, or email). The connection is rejected if no matching user is found or if the certificate is expired or unsigned.Internal gRPC connection is opened
Policies are enforced and the protocol is forwarded
custom resource roles this is a PTY or stdin stream; for postgres and mysql it is a raw TCP port-forward. From this point, the session is indistinguishable from a native Hoop session.How It Works
The Hoop gateway exposes an SSH server that validates incoming connections via SSH certificate extensions. Access is granted or denied based on the following extensions present in the certificate:Certificate Attributes
The certificate is validated against Hoop user attributes to identify the connecting user. Configure which certificate field maps to which Hoop user attribute: Certificate attribute (source):Configuration
Use thehoop admin sshserver apply command to configure the SSH server on your gateway. At minimum you need to provide the trusted CA public key, a listen address, and the attribute mapping between the certificate and a Hoop user.
apply to pick up the new configuration. Existing connections will be dropped briefly during the restart.--trusted-ca once per CA to trust certificates from more than one authority:
key_id from the certificate and match it against the user’s subject:
Generating Certificates
ssh-keygen to operate a self-managed CA — suitable for testing and small deployments. For production environments, use a dedicated PKI solution such as HashiCorp Vault SSH Secrets Engine, Smallstep, or AWS Private CA to handle certificate issuance, renewal, and revocation at scale.ca) must be kept secret; the public key (ca.pub) is registered with the Hoop gateway via --trusted-ca.
alice-cert.pub alongside the existing alice and alice.pub files. The SSH client automatically uses the certificate when alice is passed as the identity file.
-n principals list must contain the value the Hoop gateway will look up. For example, if the gateway is configured with --cert-attr principal and --user-attr user_id, one of the principals must be the user’s Hoop user_id.Supported Resource Role Types
Clients connect to Hoop resources by specifying a Resource Role name as the SSH command argument. Each resource role type maps to a different access pattern:custom
bash, python) and cannot escape the command defined in the resource role.Postgres
psql CLI as if the database were running locally.MySQL
mysql CLI as if the database were running locally.Client Usage
Terminal Access
When the resource role is configured with a shell or REPL entrypoint, the SSH client opens an interactive terminal session. Use the-t flag to request a pseudo-TTY allocation:

Live demonstration of an interactive terminal session connected to a real server via Hoop.
Ad-Hoc Command Execution
Over the same resource role you can run one-off commands without opening an interactive session. The command is passed as an argument after the resource role name:
Live demonstration of ad-hoc command execution against a real server via Hoop.
Piping Standard Input
For tools that consume complex or multi-line input, pipe stdin directly into the SSH command:
Live demonstration of stdin piping against a real server via Hoop.
Database Port Forwarding
Port-forward a database resource role to your local machine and connect with any IDE or CLI tool:
Live demonstration of port-forwarding to a real PostgreSQL server via Hoop. Sensitive column values are automatically redacted by Hoop's Data Masking feature.
Running as a Jump Host
You can configure a standardsshd server to forward specific users through Hoop, extending your existing bastion with Hoop’s capabilities rather than replacing it.
sshd Configuration
Add the following directives to yoursshd_config on the bastion server:
TrustedUserCAKeys) and host key (HostKey) so that clients do not encounter host verification errors when jumping between them.