Open-source project
veops/oneterm avatar
veops/oneterm

OneTerm Bastion Host Review: Access Control, Audit, and Deployment

Provide secure access and control over all infrastructure

1,998 stars211 forksGoAGPL-3.0

At a glance

What is it?
OneTerm is a Go and Vue bastion host for organizations that need controlled access to internal servers. It offers authentication, authorization, session recording, and audit functions, but the README gives few operational details and warns that the main branch can be unstable.
Who is it for?
OneTerm is suitable for administrators who need a centralized gateway with access control and session auditing. It is not a good match for teams that require documented production configuration, protocol-specific instructions, or a stable default branch.
Can I use it commercially?
Yes, with strict conditions. AGPL-3.0 is a network copyleft licence: if people use a modified version over a network, for example as a hosted service, you must offer them its source code under the same licence.
Is it still maintained?
Yes. The repository last received commits 5 days ago.
What is it written in?
Mainly Go, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 21, 2026, and from our analysis. They are not legal advice.

Editorial analysis

OneTerm's 4A access-control boundary

OneTerm addresses the access problem created when engineers need direct SSH, RDP, VNC, or terminal access to infrastructure that cannot be exposed publicly. Instead of allowing every internal system to accept connections directly, organizations can place OneTerm between users and those systems. Users authenticate to OneTerm, pass its authorization checks, and then reach approved internal resources through the gateway.

The project organizes these controls around the 4A model: Authentication, Authorization, Account, and Audit. Authentication establishes who the user is, authorization determines which resources that user may reach, and account management centralizes credentials used to connect to downstream systems. The README also identifies multi-factor authentication and fine-grained user permission management as supported capabilities. Those claims make OneTerm relevant to administrators who need more than a basic SSH proxy.

The intended users are organizations managing privileged access across several internal systems. This includes infrastructure teams, system administrators, and security personnel responsible for tracing user activity. OneTerm is less obviously appropriate for an individual developer with one private server, because the value comes from consolidating controls, permissions, credentials, and evidence across an estate rather than merely forwarding one connection.

The architectural boundary matters. The README says only OneTerm needs to be externally accessible, while critical systems remain behind it. That can reduce direct exposure, but it also concentrates availability and security responsibility in OneTerm. A gateway outage or configuration mistake can affect access to every managed resource. The README describes this benefit clearly, but it does not publish a high-availability topology or recovery procedure.

Go backend, Vue interface, and proxied sessions

OneTerm is implemented with a Go backend and a Vue.js frontend using the Ant Design Vue component library. The repository is divided into `backend/`, `oneterm-ui/`, and `deploy/`, which separates the server-side application, browser interface, and deployment assets. That layout is consistent with a web application that receives access requests, applies policy, establishes downstream sessions, and presents management screens in a browser.

The repository topics include SSH, RDP, VNC, and terminal access, and the README screenshots identify dashboard, terminal, workstation, access authorization, system settings, and access-time views. The README does not provide a protocol-by-protocol architecture, database schema, or API sequence. It would therefore be unsafe to claim how a session is encoded, which proxy component handles each protocol, or whether RDP and VNC use the same pipeline.

The intended data flow can still be established. A user starts at the OneTerm entry point rather than contacting an internal machine directly. OneTerm authenticates and authorizes the user, then permits a jump-server session to an approved server. During that interaction, the project can record the session, while separate logging functions retain login and activity information. Replaying a recorded session is identified as an investigation aid for understanding privileged operations after an incident.

This design places OneTerm in a sensitive credential and traffic path. The README states that it supports encrypted communication, password policies, session isolation, and centralized password management. It does not document supported cipher suites, certificate handling, secret encryption, clipboard controls, file-transfer restrictions, or whether downstream credentials remain visible to administrators. Those details need direct verification before the gateway is placed in front of production systems.

Audit recording and control claims to verify

Auditability is OneTerm's strongest documented use case. The README says it records user logins and activities, generates audit logs, and can replay server sessions. These functions are intended to make privileged behavior traceable after an incident. They also create storage, privacy, and retention requirements because recordings may contain commands, addresses, file names, terminal output, and other sensitive operational data.

The README does not state the log fields, recording format, retention period, search filters, export format, deletion process, or failure behavior when storage is unavailable. It also does not explain whether an administrator can disable recording for selected sessions. Those are adoption questions rather than minor configuration details. A system described as auditable is not enough if an organization cannot determine what is captured or retrieve the relevant recording during an investigation.

The README also claims centralized password management and enhanced password policies. That can simplify access for users who otherwise maintain multiple credentials, but the text does not identify supported credential stores, secret rotation procedures, or whether passwords can be retrieved. The product overview does support one-click asset import from the open source Veops CMDB integration, which may reduce duplicate asset entry, although the exact import mapping is not documented in the README.

Session isolation is another stated control. It is intended to prevent users from seeing or interfering with one another's access. The README does not define isolation boundaries for terminal multiplexing, recordings, clipboard data, concurrent sessions, administrative impersonation, or shared accounts. Engineering evaluation should therefore focus on the actual session and credential workflow rather than accepting the feature labels as sufficient evidence.

Docker Compose setup and first deployment

The README provides two Docker Compose paths. The default method clones the repository, enters `deploy`, and starts the service definitions. Because the project warns that `main` can be unstable during development, cloning `main` should not be treated as the documented way to select a stable production release. The README instead directs users to the releases page for the latest stable version.

The quick deployment uses the checked-in default password configuration:

bash
git clone https://github.com/veops/oneterm.git
cd oneterm/deploy
docker compose up -d

The README identifies this as the default-password method. It does not expose the service URL in the displayed quick-start section, so no browser address can be given without guessing. Readers should confirm the generated Compose status and consult the full quick-start instructions for the access URL.

For production-oriented deployment, the documented secure method runs the setup script before Compose:

bash
git clone https://github.com/veops/oneterm.git
cd oneterm/deploy
./setup.sh
docker compose up -d

According to the README, `setup.sh` can generate random passwords or accept custom ones, writes those passwords into the configuration files, and creates backup files. This is the first real use worth validating: run the setup, inspect the files it changes, confirm that Docker Compose starts successfully, and then verify the documented access instructions. The project-specific files to check are the deployment configuration under `deploy/`, especially any values changed by `setup.sh`.

A first session through an SSH, RDP, VNC, or terminal asset cannot be reproduced from the displayed README section because it provides no asset-creation steps, credential format, port mapping, or browser workflow. That limitation matters. Installation coverage is concrete, but first-login and first-host connection instructions are not.

Maintenance signals, releases, and license mismatch

The repository is not archived, and the last push was on 2026-10-11. The recent release history includes `v26.10.2` on 2026-10-11, `v26.10.1` on 2026-10-08, and `v25.9.1` on 2025-09-16. These facts indicate recent release activity, but they do not establish upgrade compatibility, migration support, or production stability.

The repository is primarily written in Go, while the frontend uses Vue.js. Upgrading an operator may involve application releases, database changes, frontend assets, deployment configuration, generated credentials, and stored session or audit data. The README provides no upgrade command, compatibility matrix, rollback process, backup schedule for persistent data, or release-note detail beyond the version labels. Those omissions make the upgrade cost impossible to quantify from the published quick-start documentation.

The repository is licensed under AGPL-3.0. However, the README badge has an `Apache License 2.0` alt label and points to the repository `LICENSE` file. This is a documentation inconsistency that should be resolved from the authoritative `LICENSE` file before redistribution or network deployment. This review does not offer legal advice; it identifies the point where license review is required.

The `main` branch warning also changes the operational choice. Development-branch deployment may expose incomplete behavior even when a recent release exists. For an access gateway, release discipline matters because authentication, session recording, and downstream credential handling are sensitive paths.

OneTerm versus a direct protocol gateway

The closest documented alternative is a direct protocol gateway or purpose-built proxy that forwards a single protocol without OneTerm's broader 4A workflow. Such an approach can have a smaller administrative surface when the requirement is only controlled network reachability. It may also make protocol behavior easier to inspect because there is less application logic between the user and the target server.

OneTerm differs by combining access control, centralized account credentials, audit logs, session recording, fine-grained permissions, multi-factor authentication, and CMDB asset import in one product. A direct SSH gateway, for example, might solve network mediation but would not by itself provide the same documented workflow for recording terminal sessions, managing downstream passwords, importing assets from Veops CMDB, and applying the stated 4A model. Conversely, OneTerm introduces more policy state, persistent audit data, session handling, and a critical gateway dependency.

OneTerm is therefore the wrong tool when the requirement is a minimal, stateless proxy with no session history or central credential management. It may fit organizations that already recognize a need for privileged-access governance and have staff to configure assets, permissions, recording retention, and gateway availability. The actual fit depends on protocol coverage, storage planning, identity integration, and administrative controls that the README does not fully specify.

Editorial conclusion

OneTerm is suitable for administrators who need a centralized gateway with access control and session auditing. It is not a good match for teams that require documented production configuration, protocol-specific instructions, or a stable default branch. Verify the selected release, deployment credentials, target protocol support, audit retention behavior, and AGPL-3.0 obligations before adoption.

Frequently asked questions

How do I install OneTerm with Docker Compose?

Clone the repository, enter `oneterm/deploy`, and run `docker compose up -d`. This is the README's quick deployment method, which uses default passwords; production-oriented setup runs `./setup.sh` first.

Does OneTerm support SSH, RDP, VNC, and terminal access?

Those protocols appear in the repository topics, and the README describes jump-server access plus terminal workstations. The README does not provide a protocol support matrix or explain the implementation for each protocol.

Is OneTerm actively maintained, and what license does it use?

The repository is not archived, its last push was on 2026-10-11, and releases `v26.10.2` and `v26.10.1` appeared that month. The repository license is AGPL-3.0, although a README badge contains a conflicting Apache License 2.0 label.

Official sources

  1. Issues
  2. License: AGPL-3.0
  3. README
  4. Releases
  5. veops/oneterm on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/veops-oneterm.svg)](https://hysenlabs.com/projects/veops-oneterm)

Was this useful?