Operations

Security and hardening

What the panel enforces on every site, the optional controls you switch on, and the responsibilities that remain with the server operator.

Verified against auraPanel 1.21.3· Last updated 17 September 2026

What the panel enforces

  • One Linux user per site. Files, the PHP-FPM pool and any runtime process belong to that user. Operations on site content drop privileges to it; the daemon never runs a shell, only direct commands.
  • One root process. aurapaneld is the only component running as root, listening on 8443 behind nginx.
  • TLS everywhere. TLS 1.2 minimum, HSTS for a year, a placeholder certificate from the first second and Let's Encrypt as soon as DNS allows. HTTPS certificates.
  • Headers on every site: Strict-Transport-Security, X-Content-Type-Options: nosniff, Referrer-Policy, X-Frame-Options (per site: default, same-origin, deny, or left to the application), and the nginx version hidden.
  • Log files are never served. Every server block denies *.log and rotated archives under the document root.
  • Secrets at rest are encrypted with a master key at /etc/aurapanel/secret.key (root-only): database passwords, Cloudflare tokens, snapshot credentials. They are never echoed back by the API once saved.
  • Panel sessions use random 256-bit tokens in HttpOnly, Secure, SameSite cookies with CSRF double-submit; the interface runs under a Content Security Policy allowing scripts only from itself and forbidding framing; there is no CORS.
  • Every change is audited. Audit log.

Accounts

Passkeys as a primary credential, TOTP two-factor authentication, idle session timeout, per-IP sign-in rate limiting, and roles that limit each user to the sites they are granted: Users, roles and access. Register a passkey or enable TOTP on the administrator account during first-run setup; the wizard offers it as its last step.

Cloudflare edge shield

For a site proxied through Cloudflare, Edge Shield in the site's Security tab locks the origin so that only Cloudflare's published IP ranges can reach it; anyone connecting to the server's address directly gets a 403. The visitor's real IP is restored from Cloudflare's headers, the ACME challenge path stays reachable, the server's own addresses are allowed so scheduled tasks and health checks keep working, and the range list refreshes every 12 hours over a built-in baseline so it can never become empty.

Optionally add Authenticated Origin Pulls (mutual TLS): the panel enforces it only after confirming the zone has it enabled, so the toggle cannot take the site down.

Only enable Edge Shield for a domain that is proxied through Cloudflare (orange cloud). On a domain served directly it locks out all traffic. Use Verify lock after enabling: it reports locked, self-blocked, unprotected or disabled.

Basic authentication

A username and password in front of an entire site, for staging or private tools: site → Security → Basic authentication. Credentials are stored bcrypt-hashed under /etc/aurapanel/htpasswd/.

Signed updates

Releases are signed with an Ed25519 key. The updater downloads the package, SHA256SUMS and its signature, verifies the signature with the key installed at /opt/aurapanel/share/release-ed25519.pub, then the checksum, and refuses to install if a release is unsigned, the signature fails or the checksum differs. After installing, it checks the panel's health for 30 seconds and rolls back to the cached previous package if the new version does not come up.

Updates are checked every 12 hours. Settings → auraPanel Updates installs one on request or, with Automatic updates on, applies each new release when it is found. A watchdog timer restarts the daemon if its health endpoint fails three times in a row, so an upgrade that stops the service cleanly cannot leave it down.

Firewall and fail2ban

The installer, unless told otherwise, enables UFW allowing only 22, 80, 443 and the panel port, and installs fail2ban. After that, the panel does not manage firewall rules; it shows fail2ban as a managed service you can start, stop and restart, and nothing more. Rules for other ports, and fail2ban jails, are yours to set on the host.

sudo ufw status
sudo ufw allow from 203.0.113.0/24 to any port 8443 proto tcp   # example: restrict the panel

What remains yours

  • Provider firewall or security groups in front of the server.
  • SSH hardening: keys, disabling password login, fail2ban jails.
  • Operating system updates. The panel updates itself and the packages it installed from the vendor repositories it added; apt upgrades for the rest are yours.
  • Application security: the code you deploy, its updates and its own accounts.
  • Off-site copies of backups and provider snapshots.
  • Anything you run with root on the host outside the panel.

The security overview summarises the same model for evaluation.

Try the live demo

A real auraPanel on a real server, shared with everyone. Sign in with the demo account and click around.

Email
demo@goaura.one
Password
demo1234
Open the demo panel ↗

Shared public demo, so please don’t put anything personal in it. More about the demo →

Talk to us

Tell us what you need and how to reach you. A person reads this, not a queue.

We use these details only to reply to you. Privacy

Recent updates

What shipped in the last releases. With automatic updates on, each lands on your server the moment it is published.

  1. v1.21.3
    Framework sites were undetectable, and a restore could silently point the copy at the original's live database.

    DetectApp looked for each application's signature relative to the docroot — but every PHP framework in the registry serves from a subdirectory (DocrootSub: public, webroot, web, pub, docroot) and keeps the file that identifies it one level *above* that. So the Laravel signature searched <project>/public/artisan,…

  2. v1.21.2
    Restarting nginx now blocks the panel and reconnects, instead of showing a notice.

    v1.21.1 stopped the false "HTTP 520" but only put up a toast — and a toast is the wrong affordance when the panel itself is about to go away: the page sat there looking broken while every request failed underneath it.

  3. v1.21.1
    Restarting nginx from Services no longer reports a false failure.

    It showed "Restart failed — HTTP 520". The panel is reverse-proxied *by* nginx, so the request deadlocked against itself: the handler blocked waiting for the restart to finish, while nginx's graceful stop waited for that very request to drain. Neither could proceed until nginx's stop-retry timeout force-killed it,…

  4. v1.21.0
    Per-site X-Frame-Options, fixing page builders that couldn't load their preview.

    Elementor's editor failed with *"Multiple 'X-Frame-Options' headers with conflicting values ('DENY, SAMEORIGIN')"*. The cause is that nginx's add_header appends rather than replaces: when the application also sets the header — a WordPress security plugin, or a CDN transform — the browser received two values,…

  5. v1.20.6
    The multi-database restore refusal now says what is in the backup and what still works.

    It read only "Restoring a multi-database site isn't supported yet", which is a dead end: it named neither the databases involved, nor why one of them is the limit, nor any route forward.

  6. v1.20.5
    Services: cards in a row now match heights.

    Like the settings grid before it, the Services grid pinned each card to its own content height, so a row often showed one card noticeably shorter than the card beside it. Each row now takes the taller card's height and both fill it, and it re-balances as content changes — a runtime installed, a longer service list.

  7. v1.20.4
    Settings: paired cards now match heights.

    Organisation / Panel Domain and auraPanel Updates / Session timeout each sat at their own content height, so a row showed one card visibly shorter than its neighbour. Each row now takes the taller card's height and both fill it — driven by content, not a fixed value, so it still adapts as a card grows (a validation…

  8. v1.20.3
    Settings: Organisation and Panel Domain now share a row too.

    They were full-width blocks stacked above the rest of the page; they now sit side by side in the same two-column grid as the Updates / Session timeout pair, so the top of Settings reads as two tidy rows instead of four stacked bands. Both cards shrink cleanly — the logo drop zone is a fixed 44×44 and the name field…

All releases on GitHub ↗