Deployment guide

Ubuntu 24.04 ARM64

Overview

Ubuntu is a widely used Linux distribution produced by Canonical. Version 24.04 is a long-term support (LTS) release with standard security maintenance to 2029, so it gives you a stable, modern base with a current kernel, toolchain and package set.

This guide covers deploying and configuring Ubuntu 24.04 LTS on 64-bit Arm (AArch64/arm64) on Microsoft Azure, using SecureAnyCloud's preconfigured virtual machine image from the Azure Marketplace. This is the native Arm build. It runs on Azure's Arm virtual machine sizes (the Ampere Altra-based Dpsv6 and Dplsv6 families), where many workloads deliver the same performance at a lower cost than on x86.

What you get:

  • Ubuntu 24.04 LTS, native 64-bit Arm (arm64 / AArch64)
  • Every available security update applied at build time
  • unattended-upgrades armed, so the machine keeps applying security updates on its own
  • Azure Linux Agent (walinuxagent) and cloud-init for Azure integration
  • systemd-timesyncd for NTP time synchronization
  • AppArmor in enforcing mode
  • The standard Ubuntu archive (ports.ubuntu.com) enabled, so your update path is intact
  • Gen2 Hyper-V virtual machine support
  • 24/7 SecureAnyCloud support

Platform: Microsoft Azure (Gen2 Hyper-V, Arm64)

Default user: azureuser

Security posture

This image ships with no known credential. It has no default password and no baked-in SSH key.

  • The root account password is locked, so no one can log in as root with a password.
  • PasswordAuthentication is disabled in the SSH daemon, so every login is by key.
  • PermitRootLogin is set to prohibit-password, so root cannot be reached with a password even if one were set later.
  • The only key that works is the public key you supply when you create the virtual machine. Azure injects it into azureuser at first boot, so no two machines you launch ever share a secret.
  • The machine identity and the SSH host keys are regenerated uniquely on every instance, so no two machines share a host key either.
  • AppArmor is left enabled and enforcing, which is the Ubuntu default.

Prerequisites

Before you deploy this image, make sure you have:

  • An active Microsoft Azure subscription
  • Access to the Azure Portal or Azure CLI
  • An SSH key pair for Linux VM access
  • Familiarity with Azure VM management

Recommended VM size: Standard_D2ps_v6 (2 vCPU, 8 GB RAM) or larger.

This is an Arm64 image, so you must launch it on an Arm virtual machine size. Use the Dpsv6/Dplsv6 (Ampere Altra) families, or another p-suffixed Arm size. An x86 size such as Standard_B2s will not boot this image.

1

Deploy the Virtual Machine

Option A: Azure Portal

  • Go to the Azure Marketplace and search for "Ubuntu 24.04 LTS Arm64 SecureAnyCloud".
  • Select the image and click Create.
  • Configure the basics:
    • Subscription: Select your Azure subscription.
    • Resource Group: Create a new group or select an existing one.
    • Virtual Machine Name: Enter a name for your VM.
    • Region: Select your preferred Azure region.
    • Size: Select Standard_D2ps_v6 (recommended), which is an Arm64 size.
  • Under Administrator Account, select SSH public key and enter your key.
  • Under Inbound Port Rules, allow SSH (port 22).
  • Click Review + Create, and then click Create.

Option B: Azure CLI

az vm image terms accept --urn sac1647283583153:ubuntu-24-04-arm64:default:latest
az vm create \
  --resource-group myResourceGroup \
  --name my-ubuntu-arm64-vm \
  --image sac1647283583153:ubuntu-24-04-arm64:default:latest \
  --size Standard_D2ps_v6 \
  --admin-username azureuser \
  --generate-ssh-keys \
  --public-ip-sku Standard

The --size must be an Arm64 family (Standard_D2ps_v6 above). Azure rejects an x86 size for an Arm image at create time.

2

Connect via SSH

Run these commands on your own workstation, not on the VM. Find the public IP, and then connect:

az vm show --resource-group myResourceGroup --name my-ubuntu-arm64-vm --show-details --query publicIps -o tsv ssh azureuser@<vm-ip>

There is no password to enter. If SSH asks you for one, your client is not offering the key you supplied at create time.

3

Confirm the release and the architecture

Check that the machine runs the Ubuntu 24.04 LTS release you expect, and confirm that it runs on Arm:

grep -E '^(NAME|VERSION|ID|VERSION_ID|PRETTY_NAME)=' /etc/os-release uname -srm dpkg --print-architecture

Expected output:

NAME="Ubuntu" VERSION="24.04.4 LTS (Noble Numbat)" ID=ubuntu VERSION_ID="24.04" PRETTY_NAME="Ubuntu 24.04.4 LTS" Linux 6.17.0-1022-azure aarch64 arm64

The aarch64 output from uname and the arm64 output from dpkg both confirm that this is the native 64-bit Arm build, not an emulated or x86 image.

4

Check the patch level

The image is fully updated at build time. Confirm that no upgrades are pending and that the update path is intact:

apt-get -s -o APT::Get::Always-Include-Phased-Updates=true dist-upgrade | grep -c '^Inst ' | sed 's/^/pending upgrades: /' apt-mark showhold dpkg -l | awk '/linux-image-[0-9]/{print $2, $3}'

The expected output shows pending upgrades: 0, no held packages and the installed Arm kernel:

pending upgrades: 0 linux-image-6.17.0-1022-azure 6.17.0-1022.22

The Always-Include-Phased-Updates=true flag matters on Ubuntu. Without it, a plain check can silently hide phased security updates that are held back on this particular machine.

This image also arms unattended-upgrades, so security updates are downloaded and applied on a timer without any action from you. You can still run updates on your own schedule:

sudo apt-get update && sudo apt-get -y dist-upgrade

If the update installed a new kernel, reboot:

sudo systemctl reboot
5

Verify the security posture

Confirm that AppArmor is enforcing, root is locked and SSH accepts keys only:

sudo aa-status --enabled && echo "apparmor: enabled"
sudo passwd -S root
sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication|pubkeyauthentication) '

The expected output is:

apparmor: enabled root L 2026-08-07 0 99999 7 -1 permitrootlogin without-password pubkeyauthentication yes passwordauthentication no

without-password is how OpenSSH reports the prohibit-password setting. Both names mean the same thing: root may not authenticate with a password. The L from passwd -S means that the root account is locked.

6

Verify Azure integration and unattended updates

Confirm that the Azure Linux Agent, cloud-init and time synchronization are healthy, that unattended security updates are armed, and check your resources:

systemctl is-active walinuxagent 2>/dev/null || systemctl is-active waagent cloud-init --version
systemctl is-enabled apt-daily-upgrade.timer apt-config dump | grep -E 'APT::Periodic::(Update-Package-Lists|Unattended-Upgrade) '
systemctl is-active systemd-timesyncd df -h / free -h

The Azure Linux Agent lets Azure provision your SSH key, resize the OS disk, run extensions and report VM health, so it should always be active.

When apt-daily-upgrade.timer is enabled and the apt periodic config contains Unattended-Upgrade "1", the machine keeps applying security updates on its own after launch.

7

Networking and the firewall

The Azure Network Security Group (NSG) controls inbound and outbound traffic. It is the first place, and usually the only place, where you need to open a port. The image advertises a single inbound port, SSH on 22.

ufw (the Uncomplicated Firewall) is available on this image but left inactive by default. It does not filter traffic, so your NSG rules take effect exactly as written, with no second layer to keep in sync. Confirm what is listening before you open anything:

ss -tlnp

On a fresh machine the main listener is sshd on port 22. Only port 22 is advertised for inbound access, and the Azure NSG governs what is reachable from outside.

If your policy also requires a host firewall, enable the one that is already installed. Add the SSH rule first, before you enable ufw, so that you do not lock yourself out:

sudo ufw allow OpenSSH
sudo ufw allow 443/tcp
sudo ufw enable

Once ufw is running, you must open a port in both the Azure NSG and ufw before traffic reaches your service.

8

Install software

The Ubuntu archive carries the application packages. Search it, and then install what you need:

apt-cache search nginx 2>/dev/null | sed -n '1,5p'

Install a package and enable it in the usual way. For example, run sudo apt-get install -y nginx followed by sudo systemctl enable --now nginx.

Everything in the archive is built for Arm, so apt resolves arm64 packages automatically. You do not need to configure anything for the architecture.

To add another administrator, follow these steps:

  • Create the account with sudo adduser <name>.
  • Add it to the sudo group with sudo usermod -aG sudo <name>.
  • Copy your public key into /home/<name>/.ssh/authorized_keys with mode 600. Give the .ssh directory mode 700 and make that user its owner.

The image ships with no human accounts, so azureuser is the only login until you add one. To list the members of the sudo group, run:

getent group sudo

Common Use Cases

  • Cost-efficient Arm application and web hosting
  • Container platforms and cloud-native workloads on Arm
  • A modern long-term support base for your own stacks
  • Arm build and CI runners

Troubleshooting

Cannot connect via SSH

  • Verify that the VM is in the Running state in the Azure Portal.
  • Check that the Network Security Group allows port 22.
  • Make sure you use the correct username: azureuser.
  • Verify that your SSH key matches the one you supplied at create time. Password login is disabled by design, so a wrong key cannot fall back to a password prompt.

To see which key your client is offering, run ssh -v azureuser@<vm-ip> from your workstation and look for the Offering public key lines.

The VM will not create or will not boot

This is an Arm64 image. It runs only on Arm virtual machine sizes (the Dpsv6/Dplsv6 Ampere families and other p-suffixed sizes). If Azure rejects the size at create time, or the VM never becomes reachable, confirm that you selected an Arm size and not an x86 size such as Standard_B2s or Standard_D2s_v5.

Azure agent not running

sudo systemctl status walinuxagent

If the agent is not running, start it on the VM:

sudo systemctl enable --now walinuxagent

Package manager issues

Refresh the metadata cache first:

sudo apt-get update

If repositories are unreachable, check DNS resolution. getent is always present and resolves through the same system resolver:

getent hosts ports.ubuntu.com

The Arm archive is served from ports.ubuntu.com/ubuntu-ports. This is normal for Arm and is not a sign of a misconfigured mirror.

A service is blocked and the logs mention AppArmor

AppArmor is enforcing on this image. Rather than disabling it, look at what it denied. On a healthy machine there are no recent denials:

sudo dmesg | grep -i 'apparmor.*DENIED' | tail -n 5 || echo "no recent AppArmor denials"

Important Notes

Ubuntu is free and open-source software. No single license covers it. It is a distribution assembled from thousands of independently packaged components, each with its own terms, including the GPL, LGPL, MIT, BSD, Apache 2.0 and MPL. You can read each package's terms with dpkg -s <package> and under /usr/share/doc/<package>/copyright.

Running this image requires no subscription or license key. Ubuntu Pro is an optional Canonical subscription that this image neither includes nor requires.

Ubuntu 24.04 LTS receives standard security maintenance until 2029. For workloads that need to outlive that date, plan a move to a newer LTS image before then.

Ubuntu is a trademark of Canonical Ltd. This guide uses the name only to identify the distribution that the image contains. SecureAnyCloud is not affiliated with, endorsed by or sponsored by Canonical Ltd.

Support

For assistance with this image, contact SecureAnyCloud support:

  • Website: secureanycloud.com
  • Product catalog: secureanycloud.com/products
  • User guides: secureanycloud.com/guides
  • SLA: 24-hour response guaranteed

Deploy on Azure

Launch Ubuntu 24.04 LTS Arm64 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