Catalog / Networking & remote access

Apache Guacamole

Clientless remote desktop gateway for RDP, VNC and SSH in the browser

CIS Level 1 hardened Ubuntu 24.04 LTS image by Lynxroute · unique credentials at first boot · CVE-scanned · SBOM and CIS report inside

Availability and pricing
CloudVersionSoftware priceLast build
Azure Marketplace
VM image · plan payg-gen2 · Gen2
1.6.0$0.028/vCPU/hr
Recommended VM: Standard_D2s_v3
2026-07-31Listing ↗

Software price only; cloud infrastructure is billed separately by the provider. Prices in USD.

Image facts
Base OSUbuntu 24.04 LTS
HardeningCIS Level 1, Ubuntu 24.04 LTS (tailored)
LicenseApache-2.0
UpstreamApache Software Foundation
Machine-readableproduct.json · catalog.json
What is Apache Guacamole

Apache Guacamole is a clientless remote desktop gateway from the Apache Software Foundation. It brokers RDP, VNC, SSH, telnet and Kubernetes-exec sessions and renders them in a plain browser over HTTPS, so there is nothing to install on the user's machine and no agent on the target host. The web application is a Java servlet running on Apache Tomcat 9; the protocol work is done by guacd, a native daemon that translates each remote protocol into Guacamole's own display protocol. Connections are defined once by an administrator and shared with the users and groups who need them, so credentials for target hosts never have to be handed out; every session and its history is recorded in a bundled PostgreSQL 16 database. Supports file transfer, clipboard, audio and session recording. Apache-2.0 license, no vendor lock-in.

What the Lynxroute image adds

Security hardening:

  • A unique admin password is generated per instance at first launch and written to /root/guacamole-credentials.txt (mode 600) - the image ships no shared or preset credential
  • guacd bound to 127.0.0.1:4822 only - the protocol daemon is never reachable from the network
  • PostgreSQL bound to 127.0.0.1:5432 only - the connection and session-history database is never exposed
  • Tomcat bound to 127.0.0.1:8080 only; nginx terminates TLS on port 443 and proxies the WebSocket display tunnel to it
  • guacd handles input from remote servers, so it runs as an unprivileged system user in a locked-down systemd sandbox (read-only filesystem, private /tmp and /dev, no new privileges, restricted address families)
  • Only the PostgreSQL authentication extension is installed - no optional extension is enabled that you did not ask for
  • Session and connection history recorded in the bundled PostgreSQL database, visible under Settings - a per-session audit trail that stays on the gateway
  • UFW firewall pre-configured - only ports 22 and 443 accepted; 4822, 5432 and 8080 unreachable externally
  • fail2ban and AppArmor pre-configured
  • CVE scan - every image is scanned for vulnerabilities before release

OS hardening (CIS Level 1):

  • CIS Ubuntu 24.04 LTS Level 1 benchmark applied via ansible-lockdown
  • auditd, SSH hardening (key-only, no root login), Kernel hardening, IMDSv2 enforced

Compliance artifacts:

  • SBOM - CycloneDX 1.6 at /etc/lynxroute/sbom.json
  • CIS Conformance Report at /etc/lynxroute/cis-report.html
  • CIS Tailored Profile at /usr/share/doc/lynxroute/CIS_TAILORED_PROFILE.md
Deploy

Launch in one command

Credentials are generated at first boot and written to /root/guacamole-credentials.txt.

# accept the plan terms once, then:
az vm image terms accept --publisher lynxroute --offer guacamole --plan payg-gen2
az vm create -g my-rg -n guacamole --size Standard_D2s_v3 \
  --image lynxroute:guacamole:payg-gen2:latest --admin-username azureuser --generate-ssh-keys
Release notes

Latest release

The most recent release with notes; the full release history is in product.json.

Apache Guacamole 1.6.0 - Initial release (July 2026)

Azure · 2026-07-31
  • Apache Guacamole 1.6.0 on Ubuntu 24.04 LTS (Apache Tomcat 9, OpenJDK 17, PostgreSQL 16)
  • CIS Level 1 hardening applied (ansible-lockdown/UBUNTU24-CIS)
  • CVE-scanned before every release
  • Clientless RDP, VNC, SSH, telnet and Kubernetes-exec access from a browser over TLS
  • A unique admin password generated per instance at first launch; no shared or preset credential in the image
  • guacd bound to 127.0.0.1:4822 and PostgreSQL to 127.0.0.1:5432; Tomcat on 127.0.0.1:8080 behind an nginx TLS perimeter on 443
  • WebSocket display tunnel proxied through the TLS perimeter
  • guacd runs as an unprivileged user in a systemd sandbox (read-only filesystem, private /tmp and /dev, restricted address families)
  • Connections, users and session history persisted in the bundled PostgreSQL database
  • certbot pre-installed for CA-signed TLS certificates
  • UFW firewall pre-configured (ports 22, 443 only)
  • fail2ban, auditd, AppArmor pre-configured
  • SBOM (CycloneDX 1.6) at /etc/lynxroute/sbom.json
  • CIS Conformance Report (OpenSCAP) at /etc/lynxroute/cis-report.html
  • IMDSv2 enforced