Deployment guide

Pure-FTPd

Overview

Pure-FTPd is a small, fast, security-focused open source FTP daemon. This SecureAnyCloud image runs it as an FTPS-only file transfer server, already configured and hardened, so you can start moving files securely within minutes of launch.

Explicit FTP over TLS is required for both authentication and data transfer, so credentials and file contents never travel in the clear. Anonymous access is disabled. The image ships with no shared credentials: on first boot, every VM generates its own TLS certificate and its own FTP user and password.

What you get:

  • Pure-FTPd from Ubuntu 24.04 (noble main), FTPS only with explicit TLS required
  • Virtual users held in a PureDB database rather than real Linux login accounts, each locked into its own home directory under /srv/ftp with a chroot jail
  • A dedicated, independently resizable 50 GiB Azure data disk at /srv/ftp (ext4), separate from the OS disk and provisioned with every VM
  • A self-signed TLS certificate and an FTP user named SecureAnyCloud with a strong random password, both unique to each VM and created by a one-shot service at first boot
  • Per-VM credentials recorded in the root-only file /root/pure-ftpd-credentials.txt
  • Anonymous FTP disabled, and a fixed passive port range (30000-30009) for firewall-friendly transfers
  • Management tools in /usr/local/sbin: pureftpd-adduser and pureftpd-listusers, which wrap the underlying pure-pw utility for day-to-day administration
  • 24/7 SecureAnyCloud support

Prerequisites

Before you deploy, make sure you have:

  • An active Microsoft Azure subscription where you can create virtual machines
  • An SSH key pair for administrator access to the VM
  • A virtual network and subnet in the target region, with a network security group (NSG) that allows inbound port 22 (SSH) from your admin network, plus inbound port 21 (FTP control) and the passive data port range 30000-30009 from the networks your FTP users connect from
  • The Azure CLI installed locally if you plan to deploy from the command line
  • An FTPS-capable client to connect as a user: the lftp command-line tool, FileZilla, WinSCP or Cyberduck

Standard_B2s (2 vCPU / 4 GiB RAM) is a balanced default. Size the VM to the number of users and the transfer volume you expect.

1

Deploy from the Azure Marketplace

Sign in to the Azure Portal, choose Create a resource, and search the Marketplace for Pure-FTPd by SecureAnyCloud. Select the listing, then choose Create.

On the Basics tab, pick your subscription, resource group, region and a VM size (Standard_B2s or larger). Under Administrator account, select SSH public key, set the username and paste your public key. Under Inbound port rules, allow SSH (22).

Review the dedicated data disk on the Disks tab. It is included in the image and holds your FTP users' home directories. Select Review + create, then Create. First-boot initialization (the TLS certificate and the per-VM FTP user) completes within a few seconds of the VM reaching the Running state.

When the VM is running, add inbound NSG rules for FTP control (21) and the passive range (30000-30009) from the networks your FTP users connect from (see Step 8).

2

Deploy from the Azure CLI

Run the following commands to create a VM from the SecureAnyCloud Pure-FTPd image in an existing VNet and subnet. Replace the angle-bracket values with your own. The dedicated /srv/ftp data disk is part of the image and is attached automatically.

# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:pure-ftpd-ubuntu-24-04:default:latest
az vm create \
  --resource-group <your-rg> \
  --name pure-ftpd \
  --image sac1647283583153:pure-ftpd-ubuntu-24-04:default:latest \
  --size Standard_B2s \
  --admin-username azureuser \
  --ssh-key-values ~/.ssh/id_ed25519.pub \
  --vnet-name <your-vnet> --subnet <your-subnet> \
  --public-ip-sku Standard
# Open the FTP control port and the passive data range
az vm open-port --resource-group <your-rg> --name pure-ftpd --port 21 --priority 1001
az vm open-port --resource-group <your-rg> --name pure-ftpd --port 30000-30009 --priority 1002
3

Connect as the Administrator over SSH

Connect to the VM over SSH as the administrator user you set at deploy time (azureuser by default on Ubuntu). The administrator account accepts SSH keys only.

ssh azureuser@<vm-public-ip>
4

Read the Per-VM FTP Credentials

On first boot, the server creates an FTP user named SecureAnyCloud with a password unique to your VM. It writes the details to a root-only file. Read that file with sudo:

sudo cat /root/pure-ftpd-credentials.txt

The file lists the per-VM user, password and connection details. The password shown here is an example, and yours will differ:

ftp.user=sac ftp.password=p27vGj3Cm1vGusRyXxbn ftp.host=10.0.0.21 ftp.tls=explicit-required ftp.passive_ports=30000-30009
5

Confirm the Service and the Data Disk

Check that Pure-FTPd is active and that the dedicated data disk is mounted at /srv/ftp.

systemctl is-active pure-ftpd findmnt -no SOURCE,TARGET,FSTYPE,SIZE /srv/ftp

List the FTP users held in the PureDB database.

sudo pureftpd-listusers

The first-boot user appears with its chroot home directory:

sac /srv/ftp/sac/./
6

Verify FTPS Works Locally

Test an encrypted round trip directly on the VM with the bundled lftp client. The commands read the per-VM password from the credentials file, connect over explicit FTPS, upload a file and download it again.

The local test uses active mode (passive-mode false), so it works over the loopback address regardless of the ForcePassiveIP setting that external clients use.

FTP_USER=$(sudo awk -F= '/^ftp.user=/{print $2; exit}' /root/pure-ftpd-credentials.txt)
FTP_PW=$(sudo awk -F= '/^ftp.password=/{print $2; exit}' /root/pure-ftpd-credentials.txt)
echo "hello from sac" > /tmp/hello.txt lftp -u "$FTP_USER","$FTP_PW" \
  -e "set ssl:verify-certificate no; set ftp:ssl-force true; set ftp:ssl-protect-data true; set ftp:passive-mode false; put /tmp/hello.txt -o hello.txt; ls; get hello.txt -o /tmp/hello.dl; bye" \
  127.0.0.1 cat /tmp/hello.dl

The listing shows the uploaded file, and the downloaded copy is byte-identical:

-rw-r--r-- 1 999 ftpvirtual 20 Jul 19 05:23 hello.txt hello from sac
7

Add Your Own FTP Users

Create additional FTP users with pureftpd-adduser. Each user is jailed in a chroot to its own home directory under /srv/ftp. Omit the password and the tool generates a strong one for you.

sudo pureftpd-adduser project-uploads
sudo pureftpd-listusers

The tool prints the generated password and confirms the chroot home.

FTPS virtual user "project-uploads" ready. chroot home : /srv/ftp/project-uploads TLS : required (explicit FTPS) GENERATED PASSWORD for project-uploads: cECwfzp4AqhgFVClA5Ut

To set a specific password instead, run sudo pureftpd-adduser project-uploads --password 'YourStrongPassword'. For advanced operations such as changing a password, quotas or bandwidth limits, use the underlying pure-pw tool, for example sudo pure-pw passwd project-uploads -m.

8

Connect from Your Workstation

Connect from any FTPS-capable client. The server requires explicit FTP over TLS and rejects plain FTP.

With the lftp command-line client, replace the host with your VM's public IP:

lftp -u sac,'<your-password>' \
  -e "set ftp:ssl-force true; set ftp:ssl-protect-data true; set ssl:verify-certificate no; ls; bye" \
  <vm-public-ip>

In FileZilla, set Protocol to FTP - File Transfer Protocol, Encryption to Require explicit FTP over TLS, Host to your VM's public IP and Port to 21. Enter the user and password, and accept the self-signed certificate on first connect.

Passive mode and the NSG. FTP uses a second connection for data transfer. The image uses a fixed passive port range (30000-30009) and sets ForcePassiveIP to your VM's public IP on first boot, so passive-mode clients work through NAT. Open TCP 21 and TCP 30000-30009 in your Azure NSG for the networks your users connect from.

9

Where Things Live

  • FTP user home directories (chroot roots): /srv/ftp/<user> on the dedicated data disk
  • Virtual user database: /etc/pure-ftpd/pureftpd.pdb, managed with pure-pw and pureftpd-adduser
  • Configuration, one file per directive: /etc/pure-ftpd/conf/
  • Per-VM self-signed TLS certificate: /etc/ssl/private/pure-ftpd.pem
  • Per-VM credentials: /root/pure-ftpd-credentials.txt
  • Transfer and connection log: sudo journalctl -u pure-ftpd

Support

SecureAnyCloud maintains this image with security patching and 24/7 support. For help, contact sales@secureanycloud.com. For the underlying software, see the Pure-FTPd documentation.

Deploy on Azure

Launch Pure-FTPd 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