Rocky Linux 10.0
Overview
Rocky Linux is a community-driven enterprise Linux distribution built by the Rocky Enterprise Software Foundation to be binary compatible with Red Hat Enterprise Linux 10. Version 10.0 is the first point release in the RHEL 10 family.
This SecureAnyCloud image is frozen to Rocky Linux 10.0. Every package is pinned to the archived 10.0 vault snapshot, so the platform you certify against today is the exact platform you keep. It is built for reproducible and compliance environments that must not drift to a newer minor release.
What you get:
- Rocky Linux 10.0, binary compatible with RHEL 10 and pinned to the 10.0 vault snapshot
- Every package synced to the 10.0 vault, verified with a zero-pending check at build time
- Unattended updates armed against the frozen 10.0 vault, so the machine applies 10.0 errata without ever rolling forward to 10.2
- Azure Linux Agent (waagent) and cloud-init for Azure integration
- Chronyd for NTP time synchronization
- SELinux in enforcing mode, both at runtime and persisted for the next boot
- BaseOS, AppStream, CRB and Extras vault repositories enabled, with signature checking on
- Exactly one externally reachable port: SSH on 22 (the Cockpit web console ships disabled)
- Gen2 Hyper-V virtual machine support
- 24/7 SecureAnyCloud support
Platform: Microsoft Azure (Gen2 Hyper-V). Default user: azureuser.
Security posture
This image ships with no known credential. There is 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.
PasswordAuthenticationis disabled in the SSH daemon, so every login is by key.KbdInteractiveAuthenticationis also disabled, which closes the other password path.PermitRootLoginis set toprohibit-password, so root cannot be reached with a password even if one is set later.- The only key that works is the public key you supply when you create the virtual machine. Azure injects it into
azureuserat first boot, so no two machines you launch share a secret. - No SSH host keys are baked into the image. Each machine generates its own at first boot, so no two machines built from this image share a host identity.
/etc/machine-idships empty and is regenerated per machine.- SELinux is left in enforcing mode, the Rocky Linux default.
Prerequisites
Before you deploy, make sure you have:
- An active Microsoft Azure subscription
- Access to the Azure Portal or the Azure CLI
- An SSH key pair for Linux VM access
- Familiarity with Azure VM management
Recommended VM size: Standard_B2s (2 vCPU, 4 GB RAM) or larger.
Deploy the Virtual Machine
Option A: Azure Portal
- Open the Azure Marketplace and search for "Rocky Linux 10.0 SecureAnyCloud".
- Select the image and click Create.
- On the Basics tab, configure:
- Subscription: select your Azure subscription
- Resource Group: create a new one or select an existing one
- Virtual Machine Name: enter a name for your VM
- Region: select your preferred Azure region
- Size:
Standard_B2sis recommended
- Under Administrator Account, select SSH public key and enter your key.
- Under Inbound Port Rules, allow SSH (port 22).
- Click Review + Create, then Create.
Option B: Azure CLI
az vm image terms accept --urn sac1647283583153:rocky-10-0:default:latest
az vm create \
--resource-group myResourceGroup \
--name my-rocky-10-0-vm \
--image sac1647283583153:rocky-10-0:default:latest \
--size Standard_B2s \
--admin-username azureuser \
--generate-ssh-keys \
--public-ip-sku StandardConnect via SSH
Run these commands on your own workstation, not on the VM. Find the public IP, then connect:
az vm show --resource-group myResourceGroup --name my-rocky-10-0-vm --show-details --query publicIps -o tsv ssh azureuser@<vm-ip>There is no password to enter. If SSH asks for one, the key your client is offering is not the key you supplied at create time.
Confirm the release
Check that the machine runs the Rocky Linux 10.0 release you expect:
cat /etc/rocky-release grep -E '^(NAME|VERSION|ID|PLATFORM_ID)=' /etc/os-release uname -rmExpected output:
Rocky Linux release 10.0 (Red Quartz) NAME="Rocky Linux" VERSION="10.0 (Red Quartz)" ID="rocky" PLATFORM_ID="platform:el10" 6.12.0-55.41.1.el10_0.x86_64 x86_64The kernel version carries an el10_0 tag, which marks the machine as being on the 10.0 stream. Because this image is frozen to the 10.0 vault, the tag stays el10_0 for the life of the machine.
Check the patch level
The image is fully synced to the 10.0 vault at build time. dnf check-update returns exit code 100 when updates are pending against the enabled repositories, and 0 when none are. Because the machine is pinned to the frozen 10.0 vault, it reports 0:
sudo dnf check-update echo "check-update exit code: $?"Confirm that no reboot is outstanding. needs-restarting -r returns 0 when nothing requires a restart:
sudo dnf needs-restarting -r echo "needs-restarting exit code: $?"List the enabled repositories to confirm that the update path is the vault:
dnf repolist --enabledExpected output:
repo id repo name appstream-vault-10-0 Rocky Linux 10.0 - AppStream (vault, frozen) baseos-vault-10-0 Rocky Linux 10.0 - BaseOS (vault, frozen) crb-vault-10-0 Rocky Linux 10.0 - CRB (vault, frozen) extras-vault-10-0 Rocky Linux 10.0 - extras (vault, frozen)Package signatures are verified on every install. No repository on this image sets gpgcheck=0, and the vault packages are signed with the same Rocky Linux 10 GPG key.
This image is frozen to the 10.0 vault
Freezing is the defining property of this image and the reason to choose it over the rolling Rocky Linux 10 image. Every repository points at the archived 10.0 vault at dl.rockylinux.org/vault/rocky/10.0/, and the rolling mirrorlist and metalink resolvers are disabled. Nothing can pull the machine forward to 10.2.
Verify the vault configuration:
grep -h baseurl /etc/yum.repos.d/rocky-vault-10.0.repo | head -2
grep -rlE '^[[:space:]]*(mirrorlist|metalink)=' /etc/yum.repos.d/ 2>/dev/null || echo "no rolling resolver present"Expected output:
baseurl=https://dl.rockylinux.org/vault/rocky/10.0/BaseOS/$basearch/os/ baseurl=https://dl.rockylinux.org/vault/rocky/10.0/AppStream/$basearch/os/ no rolling resolver presentUnattended updates are armed, but against the frozen vault. dnf-automatic applies any errata published within the 10.0 stream and never rolls the machine to a newer minor release:
systemctl is-enabled dnf-automatic.timer grep -E '^(upgrade_type|download_updates|apply_updates)' /etc/dnf/automatic.confExpected output:
enabled upgrade_type = default download_updates = yes apply_updates = yesIf you would rather track whichever Rocky Linux 10 release is current, this frozen image is not the right choice. Use the SecureAnyCloud Rocky Linux 10 image, which follows the rolling stream. Alternatively, convert this machine to the rolling channel yourself by restoring the stock repositories:
echo "to move to the rolling 10 stream: sudo rm /etc/yum.repos.d/rocky-vault-10.0.repo && sudo dnf config-manager --set-enabled baseos appstream extras && sudo dnf distro-sync -y"That reverses the pin and lets the machine move to the current 10 series minor release. Leaving the vault in place keeps the machine reproducible.
Verify the security posture
Confirm that SELinux is enforcing, root is locked and SSH accepts keys only:
getenforce grep -E '^[[:space:]]*SELINUX=' /etc/selinux/config
sudo passwd -S root
sudo sshd -T | grep -E '^(permitrootlogin|passwordauthentication|pubkeyauthentication|kbdinteractiveauthentication)'Expected output:
Enforcing SELINUX=enforcing root L 2009-12-22 -1 -1 -1 -1 permitrootlogin without-password pubkeyauthentication yes passwordauthentication no kbdinteractiveauthentication nowithout-password is how OpenSSH reports the prohibit-password setting. Both names mean the same thing: root may not authenticate with a password. When passwd -S root reports L, the root password is locked.
The commands check both the runtime mode and the persisted /etc/selinux/config value, because a runtime setting that is not persisted would silently revert on your next reboot.
Verify Azure integration
Confirm that the Azure Linux Agent, cloud-init and time synchronization are healthy, and check your resources:
systemctl is-active waagent
systemctl is-enabled waagent cloud-init --version
systemctl is-active chronyd df -h / free -hwaagent lets Azure provision your SSH key, resize the OS disk, run extensions and report VM health, so it should always be active and enabled.
Note that free -h reports 0B of swap. This is deliberate. Azure manages swap on the ephemeral resource disk through waagent rather than on the OS disk, and a swap file baked into a Marketplace image fails certification. If your workload needs swap, configure it through waagent.
Networking and open ports
The Azure Network Security Group (NSG) controls inbound and outbound traffic. It is the first place to open a port, and usually the only one.
This image is a minimal build, so firewalld is not installed. This is deliberate. With no host firewall in the way, 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 -tlnuOn a fresh machine, SSH on port 22 is the only externally bound listener. Chrony appears on 127.0.0.1:323, which is loopback only and not reachable from the network.
The Cockpit web console is disabled on this image. The stock Rocky 10 cloud base ships cockpit.socket enabled, which socket-activates a web management console on port 9090 on every interface. An operating system base should expose exactly one service. This image therefore disables the socket and keeps the port closed. The Cockpit packages stay installed, so you can turn the console on with one command:
echo "cockpit.socket: $(systemctl is-enabled cockpit.socket 2>/dev/null || echo disabled)"
echo "to enable the Cockpit web console on 9090: sudo systemctl enable --now cockpit.socket"rpcbind is disabled on this image. The stock Rocky cloud image enables it because nfs-utils depends on it, which leaves TCP and UDP port 111 open on every interface. NFSv4, the default in Rocky Linux 10, does not use rpcbind at all. This image therefore disables rpcbind and closes the port, while nfs-utils stays installed and fully working for NFSv4 mounts:
echo "rpcbind.socket: $(systemctl is-enabled rpcbind.socket 2>/dev/null || echo disabled)" rpm -q nfs-utilsIf you need NFSv3, which requires the portmapper, turn rpcbind back on with one command:
echo "to re-enable NFSv3 support: sudo systemctl enable --now rpcbind.socket"Both services are disabled rather than masked, so these commands work without further steps.
If your policy also requires a host firewall, install and enable it yourself:
sudo dnf install -y firewalld
sudo systemctl enable --now firewalld
sudo firewall-cmd --permanent --add-port=443/tcp sudo firewall-cmd --reloadOnce firewalld is running, a port must be open in both the Azure NSG and firewalld before traffic can reach your service.
Install software
AppStream carries the application packages, served from the 10.0 vault. Search it, then install what you need:
dnf search nginxInstall a package and enable it in the usual way, for example sudo dnf install -y nginx followed by sudo systemctl enable --now nginx. Everything you install comes from the frozen 10.0 vault, so a package you add today resolves to the same version on a machine you build from this image next year.
To add another administrator, create the account with sudo adduser <name> and add it to the wheel group with sudo usermod -aG wheel <name>. Then copy your public key into /home/<name>/.ssh/authorized_keys. Set that file to mode 600 and the .ssh directory to mode 700, both owned by the new user.
The image ships with no human accounts, so azureuser is the only login until you add one. Confirm the administrator group members:
getent group wheelCommon Use Cases
- Reproducible and compliance builds pinned to a fixed minor release
- Certifying software against an exact 10.0 platform
- A stable base for long-lived workloads that must not drift to a newer minor release
- Recreating a historical environment for audit or forensic work
Troubleshooting
Cannot connect via SSH
- Verify that the VM is in the Running state in the Azure Portal.
- Check that port 22 is allowed in the Network Security Group.
- Make sure you are using 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.
Azure agent not running
Check the agent status:
systemctl is-active waagentIf the agent is not running, start it on the VM:
sudo systemctl enable --now waagentPackage manager issues
Refresh the metadata cache first:
sudo dnf clean all
sudo dnf makecacheIf repositories are unreachable, check DNS resolution. This image is minimal, so nslookup and dig are not installed. getent is always present and resolves through the same system resolver:
getent hosts dl.rockylinux.orgInstall bind-utils if you want dig and nslookup.
A service is blocked and the logs mention SELinux
SELinux is enforcing on this image. Rather than disabling it, look at what was denied. On a healthy machine there are no recent denials, so the command reports none:
sudo ausearch -m AVC -ts recent 2>/dev/null || echo "no recent AVC denials"If a denial is genuine, set the correct file context with semanage fcontext and restorecon, or enable the relevant boolean with setsebool -P. Both are preferable to turning SELinux off.
Checking for failed services
A healthy machine reports running with nothing failed:
systemctl is-system-running
systemctl list-units --state=failed --no-legendImportant Notes
Rocky Linux is free and open source software, covered by a collection of licenses rather than a single one. This image carries 476 installed packages that declare 141 distinct license strings. The most common are LGPL-2.1-or-later, GPL-2.0-or-later, MIT, GPL-3.0-or-later, GPL-2.0-only, BSD-3-Clause and LGPL-3.0-or-later. You can read each package's own terms on the machine:
rpm -qa --qf '%{LICENSE}\n' | sort | uniq -c | sort -rn | awk 'NR<=8'No subscription, license key or support contract is required for any of it.
Rocky Linux 10 follows the Red Hat Enterprise Linux 10 lifecycle. This image is frozen to the 10.0 point release through the archived vault, which suits a reproducible or compliance environment.
If you would rather track whichever 10 series release is current, use the SecureAnyCloud Rocky Linux 10 image instead, or convert this machine to the rolling channel with the command shown in Step 5.
Support
For help 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 Rocky Linux 10.0 on Azure with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com