Deployment guide

Teleport

Overview

Teleport is an open-source secure-access and infrastructure-identity platform, also called an "access plane". It provides identity-based access to servers over SSH, plus Kubernetes clusters, databases and web apps, using short-lived certificates. It adds role-based access control (RBAC), single sign-on (SSO), multi-factor authentication (MFA) and full session recording and audit.

This SecureAnyCloud image installs Teleport 18.10.0 Community Edition from the official Teleport apt repository. It runs as a single all-in-one node (auth, proxy and SSH) with its own web UI served over TLS on port 443.

Teleport is itself the security perimeter, so this image ships no cluster identity of any kind. On first boot, each VM generates a fresh, unique cluster identity (its own certificate authorities), a per-VM self-signed TLS certificate and a one-time admin sign-up link. There is no baked-in cluster CA, no static join token and no shipped admin password.

What you get:

  • Teleport 18.10.0 Community Edition (OSS) from the official apt.releases.teleport.dev repository (channel stable/v18), security-patched through unattended-upgrades
  • An all-in-one teleport.service (auth, proxy and SSH), with config at /etc/teleport.yaml (version v3)
  • Single-port TLS routing on 443, multiplexing the web UI, tsh and node join, for a minimal NSG surface
  • Cluster state (CAs, cluster config, audit log, session recordings) on a dedicated 20 GiB data disk at /var/lib/teleport
  • A per-VM self-signed TLS certificate (SAN: VM public IP and hostname), generated on first boot
  • A per-VM local admin (teleport-admin) created through a one-time sign-up URL, where you set your own password and TOTP
  • A small nginx on port 80 serving an unauthenticated /healthz probe and a 301 redirect to HTTPS
  • 24/7 SecureAnyCloud support

Prerequisites

You need an active Azure subscription, an SSH key, and a VNet with a subnet. You also need a Network Security Group (NSG) that allows these inbound ports:

  • 22 for SSH
  • 443 for the Teleport web UI and tsh (TLS routing)
  • 80 for the health probe and HTTPS redirect

Standard_B2s (4 GB RAM) suits evaluation and small clusters. For production, use D2s or D4s, and add more resources as you enroll nodes.

1

Connect over SSH

ssh azureuser@<vm-ip>
2

Check service status and version

Confirm that Teleport (OSS Community) and nginx are running. Note the single-port TLS-routing listeners.

teleport version | head -1 sudo systemctl is-active teleport.service nginx.service
sudo ss -tlnp | grep -E ':443 |:80 '
3

Verify the per-VM cluster identity and TLS certificate

On first boot, Teleport generates its own certificate authorities onto the dedicated data disk. These checks show three things:

  • tctl status shows the cluster's per-VM CAs.
  • The SAN of the self-signed TLS certificate is unique to this VM.
  • The shipped config contains no static join token.
sudo tctl status
sudo findmnt /var/lib/teleport
sudo openssl x509 -in /var/lib/teleport/certs/teleport.crt -noout -subject -ext subjectAltName echo "static join tokens in teleport.yaml: $(sudo grep -cE 'static_tokens|auth_token:' /etc/teleport.yaml || true)"
4

Check the web UI over TLS

The Teleport proxy serves its web UI over TLS on port 443. The small nginx on port 80 answers an unauthenticated health probe and redirects everything else to HTTPS.

curl -sk -o /dev/null -w 'web/login HTTP %{http_code}\n' https://127.0.0.1/web/login
curl -s -o /dev/null -w 'healthz HTTP %{http_code}\n' http://127.0.0.1/healthz

Set the proxy's public address

First boot writes the address that Azure reports into the proxy's public_addr, the TLS certificate and the one-time sign-up link. With a Standard SKU public IP (the Azure default), the current image records the VM's private address (10.0.0.x).

As a result, the sign-up link and every address that Teleport hands to browsers and tsh point at a private address you cannot reach. The certificate also does not name the public IP. Check the recorded address:

sudo grep 'public_addr' /etc/teleport.yaml

If it shows a 10. address and you have not used the sign-up link yet, set the public IP on the VM and issue a fresh link. Azure's instance metadata service reports the public IP to the VM itself, and nothing leaves the VM:

PUBLIC_IP=$(curl -s -H Metadata:true 'http://169.254.169.254/metadata/loadbalancer?api-version=2020-10-01' | grep -o '"frontendIpAddress":"[^"]*"' | head -1 | cut -d'"' -f4)
PRIV=$(hostname -I | awk '{print $1}'); echo "public $PUBLIC_IP, private $PRIV"
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
  -keyout /var/lib/teleport/certs/teleport.key -out /var/lib/teleport/certs/teleport.crt \
  -subj "/CN=$PUBLIC_IP" \
  -addext "subjectAltName=IP:$PUBLIC_IP,IP:$PRIV,DNS:$(hostname -s),DNS:localhost,IP:127.0.0.1" sudo chmod 0600 /var/lib/teleport/certs/teleport.key
sudo sed -i "s/public_addr: \"$PRIV:443\"/public_addr: \"$PUBLIC_IP:443\"/" /etc/teleport.yaml
sudo systemctl restart teleport sleep 15
sudo tctl users rm teleport-admin >/dev/null 2>&1
INVITE=$(sudo tctl users add teleport-admin --roles=editor,access | grep -oE 'https://[^ ]*/web/invite/[a-f0-9]+')
sudo sed -i -e "s#https://[^ ]*/web/invite/[a-f0-9]*#$INVITE#" -e "/cluster_name/!s/\b$PRIV\b/$PUBLIC_IP/g" /root/teleport-credentials.txt
sudo sed -i "/Cluster:/!s/\b$PRIV\b/$PUBLIC_IP/g" /etc/update-motd.d/90-teleport

The cluster name stays the private address. Teleport fixes the name when it creates the cluster, and it is only a label. Use the new link in Step 5.

For a DNS name, set PUBLIC_IP to the name and write DNS:$PUBLIC_IP in place of IP:$PUBLIC_IP. Alternatively, follow Step 12 for a trusted certificate.

5

Get your one-time admin sign-up link

The image ships no admin password. On first boot, each VM creates a teleport-admin user with a single-use sign-up URL. Read the URL, then open it in your browser. Set your own password and enroll an authenticator (TOTP).

sudo grep 'web/invite' /root/teleport-credentials.txt

The sign-up link is single-use and expires. If it lapses, generate a new one on the VM with sudo tctl users add teleport-admin --roles=editor,access.

6

Sign in to the Teleport web UI

Browse to https://<vm-ip>/web/login. The VM uses a per-VM self-signed certificate, so your browser shows a certificate warning the first time. Accept it. For production, replace the certificate as described in Step 12. The Teleport Community sign-in form then opens.

7

Explore the Resources dashboard

After you sign in, you land on the unified Resources dashboard. It lists the servers, Kubernetes clusters, databases and apps you can reach through the access plane. The VM itself appears as an SSH resource.

8

Review the audit log

Teleport records every action, including certificate issuance, MFA enrollment, user creation and session start and stop. The Audit Log view and Session Recordings give you a full, tamper-evident record of access.

9

Manage users & roles

Manage local users and their roles under Zero Trust Access > Users. The per-VM teleport-admin has the built-in access and editor roles.

10

Add servers and resources

Enroll additional nodes, databases, Kubernetes clusters and apps so you can access them through Teleport with short-lived certificates and full session recording.

sudo tctl tokens add --type=node sudo tctl nodes ls

Run the printed teleport start ... command on the target server to join it to the cluster. The server then appears in the Resources dashboard.

11

Reference the components

Component and path:

Teleport binary: /usr/local/bin/teleport (tctl and tsh alongside)

systemd unit: teleport.service (plus teleport-firstboot.service)

Config: /etc/teleport.yaml (version v3, all-in-one auth, proxy and SSH)

Cluster state: /var/lib/teleport/ (dedicated data disk holding CAs, audit log and recordings)

Per-VM TLS cert: /var/lib/teleport/certs/teleport.{crt,key}

First-boot script: /usr/local/sbin/teleport-firstboot.sh

Credentials: /root/teleport-credentials.txt (mode 0600 root:root)

Health probe: nginx on :80 serves /healthz and sends a 301 redirect to HTTPS

12

Harden for production

  • Replace the self-signed certificate. Place your own domain certificate in /var/lib/teleport/certs/ and update key_file/cert_file in /etc/teleport.yaml. Alternatively, enable Teleport ACME with a real DNS name. Then run sudo systemctl restart teleport.
  • Set a real public_addr. Point proxy_service.public_addr in /etc/teleport.yaml at your DNS name, so that tsh and the web UI use it.
  • Add an SSO connector. Configure GitHub, SAML or OIDC as your identity source for production sign-in.
  • Enable WebAuthn MFA. With a real domain, switch authentication.second_factor to webauthn for phishing-resistant MFA. TOTP is the appliance default.
  • Restrict the NSG. Keep 443 open to your users and 80 open for the health probe and redirect. Limit 22 to your management CIDR.
  • Patch regularly. The official Teleport apt repository keeps teleport current within the stable/v18 channel through unattended-upgrades. Subscribe to https://goteleport.com/download/ for release news.

Licensing

This image ships the Teleport Community Edition (open source). Teleport's source is licensed AGPL-3.0. The prebuilt Community Edition binaries installed here (from apt.releases.teleport.dev) are distributed under a modified Apache 2.0 license. Both are freely redistributable. This is not Teleport Enterprise, Team or Cloud.

SecureAnyCloud is not affiliated with, endorsed by, or sponsored by Gravitational, Inc. or the Teleport project. "Teleport" is a trademark of its respective owner. This image simply packages the unmodified open-source Community Edition. SecureAnyCloud provides commercial support separately: sales@secureanycloud.com.

Deploy on Azure

Launch Teleport Community 18 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

Deploy on Azure