WebSSH 1.6.3
Overview
This guide covers the deployment, secure configuration and day-to-day use of WebSSH 1.6.3 on Ubuntu 24.04 on Azure, using SecureAnyCloud Azure Marketplace images. WebSSH is an open-source, web-based SSH client. It serves a browser terminal, built on Tornado and xterm.js. You enter a target host, port, username and a password or private key, and WebSSH opens a real SSH session to that host and streams it back to the page. You can reach a shell from any modern browser with no local SSH client installed.
WebSSH is an SSH relay, and this image is built to ship it safely. By default, the upstream wssh server binds 0.0.0.0:8888 with no authentication. Anyone who reaches the page can attempt an SSH connection to any host and port they type. That is an open pivot, SSRF and brute-force-relay surface. The SecureAnyCloud image closes it by design.
The Security section below is the most important part of this guide. WebSSH can connect outward to anything you type, so you are responsible for restricting who can reach the front door and where it may connect. Read it before you expose the instance.
What you get:
- WebSSH bound to loopback only (
127.0.0.1:8888). It is never a public listener. - nginx as the only public listener (TCP 80, and optionally 443). It gates the entire UI and the terminal WebSocket behind per-VM HTTP Basic Auth.
- A password generated uniquely on first boot and written to
/root/webssh-credentials.txt(mode0600, root only). No shared or default password is baked into the image. The shipped image carries only a fail-closed entry that denies everyone until first boot generates the real password. - WebSSH 1.6.3 (official
huashengdun/webssh, MIT licence) in a dedicated Python virtual environment at/opt/webssh/venv. - The
webssh.servicesystemd unit, which runswsshbound to127.0.0.1:8888(loopback only) as a dedicatedwebsshsystem user. - An nginx reverse proxy on TCP 80 that fronts the UI and the terminal WebSocket behind per-VM HTTP Basic Auth. It also serves an unauthenticated static
/healthzfor load-balancer probes. - The
webssh-firstboot.servicesystemd oneshot, which generates a per-VM Basic Auth password (bcrypt.htpasswd) and proves the front-door gate on first boot. - A fail-closed credential entry in the shipped image, so no known password is ever present.
- Tornado CSRF protection retained,
--fbidhttp=falsefor the behind-nginx topology, and--origin=samecross-origin protection. - An Ubuntu 24.04 LTS base with the latest security patches applied at build time, and
unattended-upgradesarmed. - The Azure Linux Agent for seamless cloud integration and SSH key injection.
- 24/7 SecureAnyCloud support with a guaranteed 24 hour response SLA.
Prerequisites
Before you deploy this image, make sure you have:
- An active Azure subscription, an SSH public key, and a VNet and subnet in your target region.
- A subscription to the WebSSH listing on Azure Marketplace.
- A clear view of which hosts you intend to administer through WebSSH and which client networks should be allowed to reach it. You lock the instance down to those below.
- Recommended virtual machine size:
Standard_B2s(2 vCPU, 4 GB RAM) is comfortable, because WebSSH is a light, stateless gateway. For many concurrent terminals, useStandard_B2msorStandard_D2s_v5.
Deploy from the Azure Portal
Search for WebSSH in the Marketplace, select the SecureAnyCloud publisher, and choose Create. Configure the network security group as tightly as you can:
- TCP 22 (SSH) for administration, from your management network only.
- TCP 80 (WebSSH UI, behind Basic Auth) from your trusted client networks only. Never open it to
0.0.0.0/0on a public instance. - TCP 443 is optional. Open it if you put your own TLS certificate in front of nginx, which is recommended for production (see Security).
Deploy from the Azure CLI
az group create --name webssh-rg --location eastus
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:webssh-ubuntu-24-04:default:latest
az vm create \
--resource-group webssh-rg \
--name webssh-vm \
--image sac1647283583153:webssh-ubuntu-24-04:default:latest \
--size Standard_B2s \
--admin-username azureuser \
--generate-ssh-keys \
--public-ip-sku StandardThen restrict inbound access to your own management CIDR instead of the whole internet:
az network nsg rule create \
--resource-group webssh-rg --nsg-name webssh-vmNSG \
--name allow-webssh-ui --priority 1010 \
--destination-port-ranges 80 --access Allow --protocol Tcp \
--source-address-prefixes <your-mgmt-cidr>First boot and retrieving your per-VM password
On first boot, webssh-firstboot.service generates a unique password for the admin front-door account, writes it to /root/webssh-credentials.txt, starts nginx and proves the gate. SSH in as azureuser and read it:
sudo cat /root/webssh-credentials.txtYou will see the WEBSSH_URL, the admin username and the per-VM WEBSSH_PASSWORD, along with security notes. Confirm that the services are healthy and that WebSSH is bound to loopback only, with nginx as the only public listener:
systemctl is-active webssh.service nginx.service
sudo ss -tlnp | grep -E ':8888|:80 ' curl -s -o /dev/null -w 'unauthenticated /healthz -> HTTP %{http_code}\n' http://127.0.0.1/healthzThe credentials file is mode 0600. The image ships only a fail-closed bcrypt entry in /etc/nginx/.webssh.htpasswd, and no plaintext password is ever stored in the image.
Sign in and open an SSH session
Open WEBSSH_URL (http://<your-vm-public-ip>/) in a browser. Your browser prompts for the front-door credentials. Sign in as admin with the per-VM password from Step 3. The WebSSH connect form then appears.
Enter the target host you want to reach: its hostname or IP, the SSH port (22 by default), the username, and either a password or an uploaded private key. You can also add an optional passphrase and a TOTP code for servers that use 2FA.
Choose Connect. WebSSH opens a real SSH session to that host and drops you into a live xterm.js terminal in the browser. The terminal is a full interactive shell, so you can run commands exactly as you would in any SSH client.
Security: you are running an SSH relay
WebSSH attempts to connect to any host and port that a signed-in user types. Treat the instance as what it is, an SSH relay, and control both ends.
The front door only opens with the per-VM password
The whole UI and the terminal WebSocket sit behind per-VM HTTP Basic Auth. Without the password, the front door is closed to everyone. A wrong password is rejected, and only the per-VM password reaches the terminal. You can prove this from the VM:
PW=$(sudo grep '^WEBSSH_PASSWORD=' /root/webssh-credentials.txt | cut -d= -f2-)
curl -s -o /dev/null -w 'no password -> HTTP %{http_code}\n' http://127.0.0.1/
curl -s -o /dev/null -w 'wrong password -> HTTP %{http_code}\n' -u admin:wrong-pw http://127.0.0.1/
curl -s -o /dev/null -w 'per-VM pw -> HTTP %{http_code}\n' -u "admin:$PW" http://127.0.0.1/Restrict who can reach it (inbound)
- Keep the per-VM password secret, and rotate it if it is ever shared (see below).
- Lock inbound TCP 80/443 to trusted source IPs in the Azure NSG, or keep the instance on a private network reachable only over a VPN or Bastion. Do not expose it wide open to
0.0.0.0/0.
Restrict where it can connect (outbound and egress)
By design, WebSSH lets the browser choose the destination, so an unrestricted instance can reach anything routable from the VM. Constrain egress to only the hosts you administer. An Azure NSG outbound rule is the cleanest control. On the VM itself, you can also use UFW, for example to allow SSH only to a specific management subnet:
sudo ufw default deny outgoing
sudo ufw allow out to <your-mgmt-cidr> port 22 proto tcp
sudo ufw allow out 53
sudo ufw enableEncrypt the front door for production
The image serves the UI over plain HTTP on port 80 by default. For any production or internet-facing use, put your own TLS certificate in front of nginx (port 443). This encrypts the Basic Auth password and the terminal traffic in transit.
SecureAnyCloud ships nginx-ssl-certbot-ubuntu-24-04 as a one-step option. Alternatively, add a listen 443 ssl server block with your certificate to /etc/nginx/sites-available/sac-webssh.
Managing the service
Check the service status and read recent logs:
systemctl status webssh.service --no-pager sudo journalctl -u webssh.service --no-pager -n 20To restart the stack after a configuration change, run sudo systemctl restart webssh.service nginx.service. To follow the logs live, use sudo journalctl -u webssh.service -f.
Rotate the front-door password by writing a fresh bcrypt entry. nginx reads the file on every request, so no restart is needed:
NEWPW=$(openssl rand -base64 18)
sudo htpasswd -bB /etc/nginx/.webssh.htpasswd admin "$NEWPW" echo "New WebSSH admin password: $NEWPW"Store the new password somewhere safe. It replaces the one in /root/webssh-credentials.txt.
Verifying the install
Confirm the pinned versions and that both services are active:
/opt/webssh/venv/bin/wssh --version nginx -v systemctl is-active webssh.service nginx.serviceTroubleshooting
The browser never prompts for a password, or the page is open. Check that you are reaching the instance through nginx on port 80, not WebSSH's loopback :8888 directly. WebSSH must never be published on a public interface. Confirm that ss -tlnp | grep 8888 shows 127.0.0.1:8888 only.
"Connection refused" or a red status when you choose Connect. WebSSH could not reach the target host and port, or your egress rules block it. Confirm the target is reachable from the VM (ssh <user>@<host>), and review your NSG and UFW outbound rules.
HTTP 401 with the right password. The password in /root/webssh-credentials.txt is current only if you have not rotated it. If you rotated it, use the new value.
Host key warning on connect. WebSSH uses the upstream default warning host-key policy (trust-on-first-use). It accepts unknown target host keys with a logged warning, which you can review in journalctl -u webssh.service.
Support
Every SecureAnyCloud image includes 24/7 support with a guaranteed 24 hour response SLA. Contact support through the Azure Marketplace listing or at secureanycloud.com.
Deploy on Azure
Launch WebSSH 1.6.3 on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com
Overview
This guide covers launching and using WebSSH 1.6.3 on Ubuntu 24.04 from SecureAnyCloud on Amazon EC2. It is one version of the SecureAnyCloud Hardened WireGuard VPN & VPN, Proxy and Remote Access AMIs listing on AWS Marketplace. You pick it as the software version when you launch.
WebSSH is a small web application that opens SSH sessions from your browser. You enter a server's address, port, user name and password or private key, and WebSSH connects from the instance and gives you a full terminal (xterm.js) in the page. It is handy as a browser-only jump point into a private network, or for reaching servers from a machine where you cannot install an SSH client.
What you get:
- A password in front of WebSSH, generated on your instance. Upstream WebSSH has no login of its own. On this image, nginx asks for a user name and password before it shows any page, script or terminal connection. The password is generated on your instance's first boot and stored only as a bcrypt hash. The image itself contains no password and no user at all.
- HTTPS on port 443, from the first boot. nginx serves WebSSH on port 443 with a certificate generated on your instance. Port 80 only redirects to HTTPS and never asks for, or accepts, the password. A request for a host name that the instance does not serve is dropped.
- WebSSH on localhost only. WebSSH listens on
127.0.0.1:8888, accepts requests only from nginx on the same machine, and is not reachable from the network. Port 8888 is not in the listing's security group. - Cross-site requests refused. Opening an SSH session takes a form post and a WebSocket. nginx refuses both when they come from another web site. WebSSH itself refuses a foreign origin and a post without its anti-forgery token. Every page carries a strict Content-Security-Policy and may not be framed by another site.
- Host keys checked. WebSSH remembers each server's SSH host key the first time you connect, and refuses the connection if that key later changes. Upstream's default only logs a warning.
- Instance metadata blocked. WebSSH connects out to whatever host and port you type. Neither WebSSH nor nginx can reach the EC2 instance metadata service (169.254.169.254 and fd00:ec2::254), so a session aimed at it cannot read this instance's role credentials.
- Current, audited dependencies. WebSSH 1.6.3 is installed unmodified, with every file checked against the upstream release. It runs with Tornado 6.6 and paramiko 5.1.0, versions outside every published advisory at the time of the build. All of them are installed from hash-pinned packages.
- Fully patched Ubuntu 24.04 LTS at build time, with unattended security upgrades switched on.
What is on the image: WebSSH 1.6.3 in a Python virtual environment on Ubuntu's Python 3.12, nginx 1.24 (from Ubuntu 24.04), cloud-init and the AWS Systems Manager agent.
Default user: ubuntu. Architecture: x86_64. Root volume: 8 GiB gp3.
Read this first: WebSSH is an SSH relay
Anyone who signs in to WebSSH can open a TCP connection from this instance to any host and port the instance can reach. That includes every server in its VPC and peered networks, and the internet if the subnet routes there. WebSSH then speaks SSH to it with the credentials that person types. Treat the WebSSH password like a bastion host's key:
- Restrict port 443 in the security group to the addresses you work from. Do not open it to
0.0.0.0/0. - Limit where the instance can connect with security group outbound rules or network ACLs. Optionally, also use the egress allow list in Step 7.
- Connections to this instance's own SSH server (
127.0.0.1:22) need a key, because password logins are disabled on the image.
Security posture
- Per-instance secrets only. The WebSSH password and the TLS key are generated on your instance's first boot. Two instances launched from the same AMI share neither.
- Fails closed. WebSSH and nginx start only after first boot has written this instance's password, certificate and a ready marker. The password file in the image holds no user, so even a forced start would refuse everyone.
- End-entity certificate. The self-signed certificate can vouch only for this instance's own names, because it is not a certificate authority. Compare its fingerprint with the one in the credentials file, or replace it with a CA-issued certificate (Step 8).
- Sandboxed service. WebSSH runs as its own
websshaccount with no capabilities, a read-only view of the system, write access to/var/lib/websshonly, and core dumps disabled. A start-up check refuses to start it if its program files become writable or its host-key file is replaced by a link. - Real client addresses. nginx passes WebSSH the address of the machine that connected, never a value a client sends. It does not pass your password on to WebSSH.
- Per-instance identity. SSH host keys and the machine ID are generated fresh on every instance.
Prerequisites
Before you launch this image, make sure you have:
- An AWS account and permission to launch EC2 instances.
- An EC2 key pair in the Region you launch in.
- A security group that allows TCP 22 (SSH) from your admin network and TCP 443 (the WebSSH page) from the networks you browse from. Add TCP 80 if you want plain-HTTP visitors redirected. Never open 8888, because WebSSH listens on localhost only.
- A subnet with a route to the servers you want to reach.
Recommended instance type: m5.large. WebSSH itself is light, because each open terminal is one SSH connection. Size up only for many concurrent sessions.
Connecting to your instance
- Version: WebSSH 1.6.3 on Ubuntu 24.04
- Operating system: Ubuntu 24.04 LTS
- SSH user: ubuntu
Launch the instance
Option A: AWS Marketplace console
- Open the SecureAnyCloud Hardened WireGuard VPN & VPN, Proxy and Remote Access AMIs listing on AWS Marketplace. Choose View purchase options, then Subscribe. One subscription covers every version in the listing.
- When the subscription is active, choose Launch your software.
- Choose One-click launch from AWS Marketplace, or Launch from EC2 Console for the full launch wizard. In Version, choose WebSSH 1.6.3 on Ubuntu 24.04, then choose your Region.
- Pick an instance type (
m5.largeis recommended) and your key pair. - For the security group, note that the listing's default group allows SSH (22), HTTP (80) and HTTPS (443) from anywhere. Restrict SSH and 443 to your own addresses before you launch.
- Choose your VPC and a subnet with a route to the servers you will reach. Add a public IP if you browse to WebSSH over the internet. Leave the metadata defaults, because the image already requires IMDSv2. Then choose Launch.
Option B: AWS CLI
Run this on your own workstation. It creates a security group that allows SSH and HTTPS from your management address, then launches the instance. Replace the AMI ID with the one shown for your Region on the Marketplace launch page. Replace the VPC, subnet, key pair and CIDR range with your own.
SG=$(aws ec2 create-security-group --group-name webssh \
--description "WebSSH" --vpc-id vpc-0123456789abcdef0 \
--query GroupId --output text)
aws ec2 authorize-security-group-ingress --group-id "$SG" --protocol tcp --port 22 --cidr <your-mgmt-cidr>
aws ec2 authorize-security-group-ingress --group-id "$SG" --protocol tcp --port 443 --cidr <your-mgmt-cidr>
aws ec2 run-instances \
--image-id ami-0123456789abcdef0 \
--instance-type m5.large \
--key-name my-key-pair \
--security-group-ids "$SG" \
--subnet-id subnet-0123456789abcdef0 \
--associate-public-ip-address \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=webssh}]'You do not need --metadata-options, because the AMI already makes IMDSv2 required. First boot takes a few seconds after the instance is running.
Connect and check the services
Connect as ubuntu with the key pair you chose:
ssh -i ~/.ssh/my-key-pair.pem ubuntu@<public-ip>systemctl is-active webssh nginx
sudo test -f /var/lib/sac/data/webssh-firstboot.done && echo FIRSTBOOT_DONEactive active FIRSTBOOT_DONEwebssh-firstboot ran once on the first boot. webssh is WebSSH, and nginx serves it. Only SSH and nginx listen on network ports. WebSSH listens on the loopback address:
sudo ss -lntp | awk 'NR>1 {print $4}' | grep -v '127.0.0.5' | sort -u0.0.0.0:22 0.0.0.0:443 0.0.0.0:80 127.0.0.1:8888 [::]:22 [::]:443 [::]:80Get your URL and password
The URL and the password are in a file only root can read:
sudo cat /root/webssh-credentials.txt# WebSSH 1.6.3 - generated on first boot by webssh-firstboot.service.
# Every value below is unique to this instance; nothing was baked into the image. Keep this file private.
# Web terminal (HTTPS, self-signed certificate unique to this instance): sign in as admin with the password below,
# then enter the SSH host, port, user and password or private key of the server you want to reach. WEBSSH_URL=https://203.0.113.10/ WEBSSH_USERNAME=admin WEBSSH_PASSWORD=<your-password> WEBSSH_HOST=203.0.113.10
# The certificate served on 443 (/etc/nginx/sac/tls/webssh.crt), to compare with your browser's warning: TLS_CERT_SHA256=3A:1F:...:9C # Anyone with this password can open SSH connections FROM this instance to any host it can reach: restrict port 443 # in the security group to your own addresses. New password:
sudo webssh-new-password
# Self-test:
sudo webssh-selftest Serve WebSSH under your own DNS name:
sudo webssh-set-host <dns-name>
# Guide: https://secureanycloud.com/stacks/webssh-1-6-3/The URL uses the instance's public IPv4 address (its private address when it has no public one). WebSSH also answers on the instance's public DNS name.
Sign in
Open WEBSSH_URL in your browser. The certificate is self-signed, so the browser warns once. Compare the fingerprint it shows with TLS_CERT_SHA256 from the credentials file, then continue.
The browser then asks for a user name and password. Enter admin and WEBSSH_PASSWORD. The browser remembers them until you close it. WebSSH then shows its connection form.
Open an SSH session
- Hostname and Port: the server you want to reach, as this instance sees it. A private IP inside your VPC works. The port defaults to 22.
- Username: the account on that server.
- Password, or Private Key. For a key, choose the key file and add its Passphrase if it has one. RSA, ECDSA and Ed25519 keys work, and DSA keys are not supported. Totp is for servers that ask for a one-time code.
- Choose Connect. The terminal opens in the page. Closing the tab ends the session.
To try it on the instance itself, connect to Hostname 127.0.0.1, Port 22, Username ubuntu and choose your EC2 key pair's private key file (.pem). The key travels to the instance over HTTPS and is used for that one connection. WebSSH does not store it.
Host keys. The first time you connect to a server, WebSSH records its host key in /var/lib/webssh/known_hosts. If the key later changes, because the server was rebuilt or something is intercepting the connection, WebSSH refuses with Bad host key. After you have confirmed that the change is genuine, remove the old entry and restart WebSSH. Open sessions are closed:
sudo -u webssh ssh-keygen -R '[10.0.1.25]:22' -f /var/lib/webssh/known_hosts
sudo systemctl restart websshFor port 22, the entry is just the host (10.0.1.25). For other ports, it is [host]:port.
Instance metadata. A session aimed at the metadata service fails before any data is exchanged.
Change the password
sudo webssh-new-passwordThis generates a new random password, writes it to WEBSSH_PASSWORD in /root/webssh-credentials.txt and stores its bcrypt hash for nginx. The old password stops working at once, and your browser asks for the new one on the next page load.
To pick your own password instead, write a bcrypt entry for admin to /etc/nginx/sac/webssh.htpasswd (mode 0640, owner root, group www-data).
Limit where WebSSH can connect
Security group outbound rules are the simplest control. To restrict WebSSH itself to a list of networks, add a systemd drop-in. This example allows this instance's own SSH server and one VPC range:
sudo tee /etc/systemd/system/webssh.service.d/60-egress-allowlist.conf >/dev/null <<'EOF' [Service] IPAddressAllow=localhost 10.0.0.0/16 IPAddressDeny=any EOF
sudo systemctl daemon-reload && sudo systemctl restart websshNever put 169.254.0.0/16, 0.0.0.0/0 or ::/0 in IPAddressAllow, because an allow entry overrides the metadata block. For a strict list of servers instead of networks, run WebSSH with --policy=reject. It then connects only to servers whose host keys you have added to /var/lib/webssh/known_hosts (or /etc/ssh/ssh_known_hosts) and refuses every other target before opening a connection:
ssh-keyscan -p 22 10.0.1.25 | sudo -u webssh tee -a /var/lib/webssh/known_hosts
sudo sed -i 's/--policy=autoadd/--policy=reject/' /etc/systemd/system/webssh.service
sudo systemctl daemon-reload && sudo systemctl restart websshCheck each host key you add, for example against ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub on that server.
Your own DNS name and certificate
Point a DNS A record at the instance, then run:
sudo webssh-set-host webssh.example.comThis issues a new self-signed certificate for that name, updates nginx and the credentials file, and prints the new fingerprint. Running sudo webssh-set-host with no name returns to the instance's own address.
To use a CA-issued certificate instead, put the certificate chain and key in /etc/nginx/sac/tls/webssh.crt and /etc/nginx/sac/tls/webssh.key (key mode 0600, owned by root), then run sudo nginx -t && sudo systemctl reload nginx. Do not add the self-signed certificate to your computer's trust store. Compare its fingerprint, or replace it.
Security checks
Run the built-in self-test. It opens a real SSH session through the HTTPS front door to a temporary SSH server on 127.0.0.1:2222 and checks that WebSSH cannot reach the metadata service:
sudo webssh-selftestWebSSH 203.0.113.10: webssh + nginx up, WebSSH 127.0.0.1:8888 only, HTTPS OK, anonymous requests refused, SSH session through the web front door OK, metadata service unreachable SELFTEST_OKWithout the password, every request is refused, the page may not be framed, and port 8888 is not reachable from the network:
H=$(sudo sed -n 's/^WEBSSH_HOST=//p' /root/webssh-credentials.txt)
sudo curl -s -o /dev/null -D - --cacert /etc/nginx/sac/tls/webssh.crt --resolve "$H:443:127.0.0.1" "https://$H/" | tr -d '\r' | grep -iE '^(HTTP|WWW-Authenticate|X-Frame-Options)'
P=$(hostname -I | awk '{print $1}') timeout 5 bash -c "exec 3<>/dev/tcp/$P/8888" 2>/dev/null && echo "8888 OPEN" || echo "8888 refused"HTTP/1.1 401 Unauthorized WWW-Authenticate: Basic realm="WebSSH (sac)" X-Frame-Options: DENY 8888 refusedWebSSH and nginx are denied the instance metadata service:
systemctl show -p IPAddressDeny webssh nginxIPAddressDeny=169.254.169.254/32 168.63.129.16/32 fd00:ec2::254/128 IPAddressDeny=169.254.169.254/32 168.63.129.16/32 fd00:ec2::254/128The password file holds one bcrypt entry and is readable by root and nginx only:
sudo stat -c '%a %U:%G' /etc/nginx/sac/webssh.htpasswd
sudo grep -cE '^admin:\$2b\$12\$' /etc/nginx/sac/webssh.htpasswd640 root:www-data 1Versions, provenance and file locations
head -3 /usr/share/doc/webssh/BUILD-INFO.txt /opt/webssh/venv/bin/wssh --versionThe command above prints the build information and the installed WebSSH version. These are the main file locations on the image:
- /opt/webssh/venv: WebSSH 1.6.3 and its Python packages, read-only to the service (no pip in it).
- /var/lib/webssh/known_hosts: the host keys WebSSH has accepted.
- /etc/nginx/conf.d/sac-webssh.conf and /etc/nginx/sac/: the nginx server blocks, the password file and this instance's certificate.
- /etc/systemd/system/webssh.service: the service and WebSSH's options (--policy, --maxconn and others).
- /usr/share/doc/webssh/: the MIT licence, build information and the hashed package lock.
- /root/webssh-credentials.txt: the first-boot URL, password and certificate fingerprint.
Maintenance
WebSSH keeps no data besides known_hosts. Back that file up if you rely on the recorded host keys.
Ubuntu security updates install automatically. To update WebSSH and its Python packages, move to a newer SecureAnyCloud version of this listing. The virtual environment deliberately has no pip.
Security recommendations
- Restrict ports 22 and 443 in the security group to your own networks, and limit outbound traffic to the servers you need.
- Rotate the password with
sudo webssh-new-passwordwhen someone no longer needs access. Do not share it more widely than you would an SSH key. - Prefer private keys to passwords for the servers you reach, and check a host key before the first connection.
- Replace the self-signed certificate with a CA-issued one for wider use.
Support and licensing
WebSSH is open-source software under the MIT licence (/usr/share/doc/webssh/LICENSE). Its Python dependencies keep their own licences, recorded in /usr/share/doc/webssh/BUILD-INFO.txt: Tornado (Apache-2.0), cryptography (Apache-2.0 or BSD-3-Clause), bcrypt and PyNaCl (Apache-2.0), and paramiko (LGPL-2.1, shipped unmodified from PyPI, with source at github.com/paramiko/paramiko).
The browser terminal uses xterm.js, jQuery and Bootstrap (MIT).
SecureAnyCloud provides the hardened image and support for its configuration at sales@secureanycloud.com. WebSSH is a project of its own author, and SecureAnyCloud is not affiliated with or endorsed by them.
Deploy on AWS
Launch WebSSH 1.6.3 on Ubuntu 24.04 on AWS with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com