Skip to main content

Security overview

The product runs as root on your server and holds the Docker socket, which is equivalent to root on the host. Everything below follows from that: whoever controls the console, the management API, the agent or a shell on the host controls every instance on it.

What the server stores, and where​

WhatWhereHow it is protected
Users, instances, jobs, schedules, the audit trail, the license register and the policy half of the configurationThe master database: PostgreSQL in the ohm-postgres container, on the loopback only, or your own SQL ServerConsole passwords are stored as hashes. Every stored credential - the console accounts' authenticator secrets, the SMTP password, backup storage keys, git tokens, the outbound proxy's password, the GeoIP account - is encrypted under the API's key ring
The API's key ring, and the console'sThe Docker volumes ohm-api-keys and ohm-web-keysRoot only. Without ohm-api-keys the stored credentials cannot be opened, so back it up with the database
The agent's two credentials, the registry credential and the rest of the host's half of the configuration/etc/antelao/agent.envMode 0600, root only
The console key and the GeoIP, Fail2Ban and CrowdSec service keys/var/lib/ohm-agent/host-state.jsonMode 0600, root only
The DNS provider token for the console's Let's Encrypt certificate, when it uses DNS-01/var/lib/ohm-agent/certificate-dns01.credentialMode 0600, root only
The application root: the database connection, container data, generated secrets, certificates, GeoIP databases, logs, license files/root/.local/share/ohm/Root only
Instance trees: Odoo configuration, filestores, addons/var/lib/odoo/instancesRoot, and the instance's own container
Backups and the archive/var/lib/odoo/backup, /var/lib/odoo/archive, and any off-site target you addBackup encryption locks an archive with a key of yours

Every file is listed on Configuration and state. Shell access to the host reaches all of it, which is why the host's own SSH has to be protected at least as carefully as the console.

What leaves the server​

WhatWhere toWhen
The license check-in, or the daily report of a server with no licenselicense.antelao.io, license.antelao.appDaily by default. What it carries is listed in What the check-in reports and in Article 4.2 of the license agreement
Update checks and image pullsghcr.io, Docker Hub, nightly.odoo.com, GitHub, packages.antelao.ioDaily, and when you update
GeoLite2 downloads, with your MaxMind accountdownload.maxmind.comEvery 24 hours, by the GeoIP service
Certificate requests and renewalsLet's Encrypt, and your DNS provider's API for DNS-01When a certificate is requested or nears expiry
MailThe SMTP host in your mail profile, over TLSWhen the server sends one of its messages
AlertsThe channels you set up: e-mail, Slack, Discord, webhooksWhen a rule matches
BackupsThe off-site targets you addOn schedule or by hand
CrowdSec's collections and community blocklisthub-cdn.crowdsec.net, api.crowdsec.netWhile CrowdSec is switched on
The payment providers' address listsStripe, Paddle, MollieHourly, for the Payments firewall rules

The check-in and the daily report carry no database, filestore, log or credential. The full list of addresses, for a proxy's allow-list, is What the server reaches; a network that lets nothing out directly can send all of it through an outbound proxy.

A support bundle leaves the server only when you download it and send it yourself.

How updates arrive​

The server checks for newer images, ohm releases and host packages every day, and the console's Updates page and ohm server update say what is newer. An update is applied when an administrator applies it, from the Updates page or with ohm server upgrade; the agent then carries the upgrade through by itself, its own restart included. Every one of the product's own images is checked against its signature before it runs, and one that does not verify is refused. The antelao-ohm package, Docker and the host's operating system are yours to update with apt. See Updating Antelao.

Under the license agreement, Article 11, security patches and fixes are supplied only to the extent your edition or a separate support agreement says, and an update can change features and defaults: read the release notes before you apply one.

Who gets in​

Each layer works on its own, and each one is on this manual's page for it:

LayerProtectsPage
The host firewallWhich ports answer the network at allThe firewall and exposure, the port table
The server's firewall rulesWho may reach the console and the management APIThe firewall and exposure
Password, authenticator app and passkeys, account lockoutEach console accountMulti-factor authentication and passkeys
Cloudflare TurnstileThe console's sign-in, against scripted guessingCloudflare Turnstile
Roles and instance scopingWhat a signed-in person may see and doUsers and roles
API keysEvery program that calls the management APIAPI keys
The agent's key and its allow-listThe agent, the way back in when the console is downWho may reach the agent
An instance's firewall rulesWho may reach which paths of an instanceThe firewall and exposure
Pre-authenticationAn instance nobody should reach without a password you handed outPre-authentication
Rate limitsGuessing and floods, on the API and on every instanceRate limits
Fail2Ban and CrowdSecBanning addresses that behave like attackersIntrusion prevention

Several of these are licensed features. What happens to each when a license stops carrying it is on When the license changes.

Reporting a vulnerability​

Report a suspected vulnerability in the product privately to Antelao at support@antelao.io, with the release (ohm --version) and the steps that show it. Do not post it on the community forum or in a public issue.