Deployment guide

GlobaLeaks

Overview

GlobaLeaks is a free and open source whistleblowing platform that news organisations, NGOs, corporates and public bodies use to receive confidential reports. Reporters submit through a web form without an account and receive a 16-digit access code. They use that code to return to their case, read replies and add more information.

The SecureAnyCloud image serves GlobaLeaks 5.0.98 on a hardened Ubuntu 24.04 LTS base, patched at build time. It is installed from the official upstream package repository, so you keep receiving GlobaLeaks security updates. No administrator account ships in the image: you choose your own administrator username and password in the setup wizard the first time you open the platform.

Reports are encrypted and delivered to named recipients, so only the people you designate can read them. Role separation between administrator, recipient, custodian and analyst, configurable questionnaires and reporting channels, file attachments, per-report retention and a full audit log make the platform a common choice for EU Whistleblowing Directive compliance programmes.

What you get:

  • GlobaLeaks 5.0.98, a single Python service managed by systemd
  • HTTPS on port 443 and HTTP on port 80, served directly by the platform
  • No default administrator: you create yours in the first-run setup wizard
  • An embedded database, so there is no separate database server to run
  • A platform database, receipt salt, node identity and TLS certificate generated for each instance on first boot
  • A self-signed TLS certificate per instance, replaceable with your own
  • Automatic certificate issuance and renewal through ACME when you add a domain
  • Encrypted report delivery to named recipients, with per-report access codes
  • Configurable questionnaires, reporting channels and retention policies
  • The Tor onion service feature installed but switched off, so the image is HTTPS only
  • globaleaks.service as an enabled systemd unit
  • 24/7 SecureAnyCloud support

Prerequisites

You need an active Azure subscription, an SSH key pair, and a VNet with a subnet in the target region.

Standard_B2s (2 vCPU / 4 GiB RAM) is a sensible starting size. Choose a larger size if you expect large attachments or many concurrent reporters.

Configure the network security group (NSG) to allow inbound 22/tcp from your management network, and 443/tcp and 80/tcp for reporters and recipients. Port 80 is needed only for the HTTP entry point and for ACME certificate issuance. You can close it once you run on your own certificate.

Step 1 - Deploy from the Azure Marketplace

Sign in to the Azure Portal, choose Create a resource, search the Marketplace for GlobaLeaks by SecureAnyCloud, and select Create.

On the Basics tab, pick your subscription, resource group, region and size. Under Administrator account, choose SSH public key and paste your key. Under Inbound port rules, allow SSH (22), HTTP (80) and HTTPS (443).

Select Review + create, then Create.

Step 2 - Deploy from the Azure CLI

# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:globaleaks-ubuntu-24-04:default:latest
az vm create \
  --resource-group <your-rg> \
  --name globaleaks \
  --image sac1647283583153:globaleaks-ubuntu-24-04:default:latest \
  --size Standard_B2s \
  --admin-username azureuser \
  --generate-ssh-keys \
  --public-ip-sku Standard

Open the reporting ports:

az vm open-port --resource-group <your-rg> --name globaleaks --port 443 --priority 900
az vm open-port --resource-group <your-rg> --name globaleaks --port 80 --priority 910

Step 3 - Confirm the service is running

SSH in as azureuser and confirm that GlobaLeaks is active. The platform runs as an unprivileged service user and binds the high ports 8080 and 8443. The kernel redirects the standard ports 80 and 443 onto them, so reporters simply visit https://<your-vm-ip>/.

systemctl is-active globaleaks.service globaleaks-firstboot.service ss -tln | grep -E ':8080 |:8443 |:8083 ' iptables -t nat -S PREROUTING | grep REDIRECT

The output shows both units active, listeners on 8443 and 8080, and the two REDIRECT rules that publish them on 443 and 80.

Step 4 - Read the first-boot info note

On first boot the image runs globaleaks-firstboot.service. It prepares this instance's own platform database, resolves the address reporters will use, and writes a short info note. The note contains no password, because the image ships without any account.

Read the note and the first-boot log:

grep -v '^#' /root/globaleaks-credentials.txt | grep -v '^$' journalctl -u globaleaks-firstboot.service --no-pager | sed -n 's/.*globaleaks-firstboot: //p' | tail -6

The first-boot log also records that the Tor onion service, which upstream generates when it creates a database, was suppressed. This image publishes nothing to the Tor network.

Step 5 - Run the appliance self check

Run the self check that ships with the image. One command confirms the security posture: the platform answers over HTTPS, the setup wizard is still pending, the database holds zero accounts, no onion service is configured, and the standalone system Tor daemon is masked.

/usr/local/sbin/globaleaks-selfcheck.sh

Step 6 - Complete the first-run setup wizard

Browse to https://<your-vm-ip>/. The platform opens its setup wizard. The image ships with a self-signed certificate, so your browser warns you on this first visit. That is expected, and Step 11 shows how to install a trusted certificate.

The wizard asks for your project name, then for the administrator account. This is where the administrator is created: you choose the username and the password. No default credential exists in the image, so nothing is inherited from the build.

The wizard then creates your first recipient, the person who reads incoming reports, and asks you to accept the GlobaLeaks licence.

When the wizard finishes, open Preferences and save your Account Recovery Key. Report content is encrypted to your account, so this key is what lets you regain access if you forget your password.

Step 7 - Open your public reporting homepage

When the wizard is done, https://<your-vm-ip>/ becomes the page your reporters see. It offers a single Submit a report action. It also has a box where someone who has already reported can enter their access code to return to their case.

Step 8 - Submit a test report

Choose Submit a report to open the questionnaire. The default questionnaire asks the reporter to summarise and describe the facts, where and when they happened, how the reporter is involved, whether they hold evidence, whether they have reported elsewhere, and what outcome they want. You can change every one of these questions later under Questionnaires.

On submission, the reporter receives a 16-digit access code. This is the only way back into the report, and the platform deliberately cannot recover it, so the reporter must save it.

With that code, the reporter can read replies from your team and add further information. This is what makes two-way anonymous follow-up possible.

Step 9 - Receive reports as a recipient

Sign in at https://<your-vm-ip>/#/login with the recipient account created in the wizard. Under Reports, you see everything sent to your channels: report number, status, submission date, last update and the expiry date set by your retention policy. The list shows metadata only. Report bodies are encrypted and are decrypted only when a recipient opens them.

Open a report to decrypt it. You see the full questionnaire answers and the assigned recipients. You also get controls to reply to the reporter, attach files, apply labels, change the status and export the case.

Step 10 - Verify the stack

dpkg-query -W -f='globaleaks ${Version}\n' globaleaks systemctl is-enabled globaleaks.service globaleaks-firstboot.service curl -ks -o /dev/null -w 'https://127.0.0.1:8443/api/health HTTP %{http_code}\n' https://127.0.0.1:8443/api/health swapon --show | wc -l

The output shows version 5.0.98, both units enabled at boot, the health endpoint returning 200, and zero swap devices, which is what Azure image certification requires.

Step 11 - Install a trusted TLS certificate

The image serves HTTPS immediately, using a self-signed certificate generated on your VM at first boot. Reporters get transport encryption from the first visit but see a browser warning. Give the VM a DNS name and install a trusted certificate before you publish the address to reporters.

Point your domain at the VM's public IP. Sign in as the administrator and open Administration, then Network, then HTTPS. Enter the hostname and let GlobaLeaks request a certificate automatically through Let's Encrypt, which also renews it for you. Port 80 must be reachable for this to work.

If your organisation issues its own certificates, use the same page to upload the private key, certificate and chain instead.

Step 12 - Find where your data lives

Everything that belongs to the platform lives under /var/globaleaks. The directory is owned by the unprivileged globaleaks service user with 0700 permissions. It holds the embedded database, the receipt salt, the node identity, the TLS material and every uploaded attachment.

ls -ld /var/globaleaks du -sh /var/globaleaks

All state sits under one directory, so you can back up the platform by snapshotting the OS disk, or by stopping the service and archiving that path. GlobaLeaks also ships gl-admin backup and gl-admin restore for a consistent application-level backup.

Tor onion service

GlobaLeaks can publish a Tor onion service so reporters can reach the platform without revealing their network location. This image deliberately ships with that feature switched off. No onion service is created, no onion key is stored, and the standalone system Tor daemon is masked, so the appliance is HTTPS only out of the box.

The capability is still installed. If your threat model calls for it, an administrator can generate an onion address from Administration, then Network, then Tor, and unmask the system Tor daemon. Treat this as a deliberate change of posture rather than a default, and review your own legal and operational position before you enable it.

Security notes

The image ships with no administrator, no recipient and no report data. The platform database, receipt salt, node identity and TLS key pair are generated on your VM at first boot, so no two instances share cryptographic material and nothing from the build is inherited.

GlobaLeaks runs as an unprivileged service user under a hardened systemd unit. The unit has a restricted system call filter, an empty capability bounding set, a read-only system tree and an AppArmor profile. GlobaLeaks never runs as root and never binds a privileged port directly.

Restrict 22/tcp to your management network. Report content is encrypted to recipient accounts, so make sure every administrator and recipient stores their Account Recovery Key somewhere safe. Without it, a forgotten password means unrecoverable reports.

Review the retention period under Case management so reports expire on a schedule that matches your policy. Publish the platform on its own DNS name with a trusted certificate before you share it with reporters.

Support

SecureAnyCloud provides 24/7 support for this image. For questions about the image or your deployment, contact SecureAnyCloud support. For GlobaLeaks itself, see the upstream documentation at docs.globaleaks.org.

Deploy on Azure

Launch GlobaLeaks 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