Security and data¶
What the image does, what it deliberately does not do, and how each claim is checked.
The image checks several of these claims itself while it is being built, and the build stops, so no image is created if any of them fails. Every image we build is then launched on two fresh instances and checked again. Both lists are at the end of this page.
The short version¶
Hermes and n8n run on your instance and talk to each other only inside it. You open n8n in your browser over HTTPS, and nobody reaches it without your instance's ID at first and your n8n account after that. The Hermes API and Hermes's own connections to n8n are never exposed to the internet, and every key the two use with each other is generated on your instance's first boot, unique to it.
Your data¶
- Workflows, credentials, n8n accounts and history are stored on the
instance's disk, in
/home/ubuntu/.n8n. n8n encrypts saved credentials with a key unique to your instance. - Hermes's settings, memory and sessions are stored in
/home/ubuntu/.hermes. - Your conversations with Hermes go to the model provider you chose, under that provider's terms, and to any messaging app you connected.
- Workflows reach whatever services you build them to reach.
- Nothing is sent to Software Sushi. The image has no accounts, no licence check and no tracking of its own, and n8n's usage statistics are turned off.
What is reachable¶
| Service | Listens on | Reachable from |
|---|---|---|
| The n8n dashboard (Caddy) | ports 443 and 80 | Everyone, over HTTPS; port 80 only sends visitors on to HTTPS. See the dashboard |
| n8n itself | 127.0.0.1:5678 |
The instance only. The dashboard passes requests on to it |
| The setup gate | 127.0.0.1:5690 |
The instance only. The dashboard asks it about each request |
| Hermes API (used by n8n) | 127.0.0.1:8642 |
The instance only. Never served by the dashboard |
| SSH | port 22 | The addresses you allow in the security group |
n8n runs in a container on the instance's own network and listens only on
127.0.0.1, so no security-group or Docker rule can expose it directly. The only
way in from outside is the dashboard, and sudo hermes-n8n web off closes it.
The n8n dashboard¶
- HTTPS, with a trusted certificate. Let's Encrypt issues it for your instance's own IP address at boot, and it renews itself every six days. Ports 80 and 443 stay open to every address so Let's Encrypt can check the instance. No certificate, private key or Let's Encrypt account ships in the image: each instance gets its own.
- The instance ID guards first-time setup. n8n gives its owner account to whoever sets it up first. Until that account exists, every request needs your instance's ID first. Wrong IDs are refused after a short pause and logged, and ten from one address lock it out for 15 minutes. The ID is checked against the instance's own metadata, and a correct one sets a browser cookie that is sent over HTTPS only.
- n8n's own sign-in after that. Once the owner account exists, the instance-ID page steps aside, and n8n's accounts protect the editor, with n8n's secure cookies. Turning on two-factor authentication in n8n is recommended.
- Never served: Hermes's connections to n8n (its tools and the workflow builder) answer only inside the instance, and the Hermes API is not on the dashboard at all.
- Blocked by default: n8n's public REST API (
/api/v1). Open it withsudo hermes-n8n public-api onif you need it. - Public by design: webhooks and forms of workflows you publish, once the
owner account exists, and n8n's
/healthzhealth check, which reports only whether n8n is running. - No remote control of the web server. Caddy's admin API is switched off,
so nothing on the instance, including Hermes's own terminal tool, can change
what the dashboard serves. Changes go through
hermes-n8nas root.
Host protections¶
The image keeps a host firewall, as defence in depth behind your security group:
- UFW denies all inbound traffic except SSH and the dashboard's ports 80 and 443, and allows outbound traffic.
- fail2ban blocks addresses that repeatedly fail to sign in over SSH.
- SSH accepts keys only:
PasswordAuthentication no,PermitRootLogin prohibit-password,MaxAuthTries 3, no X11 forwarding. - IMDSv2 is required for the instance metadata service.
- Network settings turn off ICMP redirects and IP forwarding.
Two places to open a port
Because of UFW, opening a port in the security group is not enough on its
own. Nothing in this guide needs another inbound port. hermes-n8n web off
closes 80 and 443 in UFW; remove them from the security group yourself.
Keys and secrets¶
Each instance generates its own keys on first boot, from OpenSSL's cryptographic random generator:
| Key | Used for | Stored |
|---|---|---|
| n8n encryption key | Encrypting your saved n8n credentials | /etc/hermes-n8n/secrets and /etc/n8n/n8n.env, root only. n8n also keeps a copy in /home/ubuntu/.n8n |
| Hermes API key | n8n calling Hermes | /etc/hermes-n8n, and in Hermes's .env |
| Hermes tools token | Hermes calling the Hermes tools workflow | /etc/hermes-n8n, and in Hermes's config.yaml |
| Workflow builder token | Hermes building workflows | Issued by n8n to you. Saved in /etc/hermes-n8n and Hermes's config.yaml by connect-builder |
The full secrets file in /etc/hermes-n8n is readable by root only. The keys
Hermes needs to repair its own connections are also in a copy that ubuntu,
the account Hermes runs as, can read. Hermes's .env and config.yaml are
readable only by ubuntu. Replace the generated keys at any time with
sudo hermes-n8n rotate-secrets.
What Hermes is allowed to do in n8n¶
- Run the tools you attach to the Hermes tools workflow, without changing them.
- Once you connect the workflow builder: create workflows, edit the ones it created, test, publish and archive them.
- Edit a workflow you made yourself only after you switch on Available in MCP for it.
- Never permanently delete a workflow, an n8n Agent or a data table column. Those tools are hidden from Hermes.
Patching¶
- Every build runs a full
apt-get dist-upgradebefore installing anything, so the image ships with the security updates available on its build date. unattended-upgradesstays on, so a running instance keeps receiving security updates. Automatic reboots stay off.telnetclients are removed.- n8n moves to newer tested versions with
sudo hermes-n8n upgrade.
What ships in the image¶
- Ubuntu 24.04 LTS, fully updated at build time
- Hermes Agent, installed from a pinned upstream release and checked against its exact source commit, with the Telegram, Discord, Slack and Anthropic extras
- Docker Engine and n8n, pinned to an exact image digest that is checked when the image is built and never downloaded again at run time
- The
hermes-n8ncommand and the two starter workflows, Ask Hermes and Hermes tools - The dashboard's HTTPS layer (Caddy, and the tool that gets and renews its certificate), installed from a pinned release checked against its SHA-256 checksum
/etc/hermes-agent-release,/etc/hermes-agent-commit,/etc/n8n-releaseand/etc/n8n-digest, recording exactly what was installed
What does not ship in the image¶
- No keys or secrets of any kind: they are generated on your instance's first boot
- No TLS certificate, private key or Let's Encrypt account: each instance gets its own when it starts
- No n8n data, accounts or settings, and no saved random-number state, so no two instances share a secret
- No SSH keys:
authorized_keysfiles are removed before the image is captured - No model provider keys or messaging tokens: you add your own
- No telemetry of ours
Checked on every build¶
Unless all of these checks pass, no image is created, and the build terminates:
- Hermes is the requested release, at its exact upstream commit
- The n8n image matches its pinned digest, reports the expected version, and runs as the expected user
- Docker's signing key matches its published fingerprint
- The dashboard's HTTPS release matches its pinned checksum, and Caddy accepts the dashboard's routes, with the public API both blocked and open
- n8n's settings file, its data folder and the first-boot secrets are absent from the image
- The release markers in the image match the requested versions
Checked on a real first boot¶
Every image we build is launched on two fresh instances and checked before it can be released:
- First boot finishes, and the recorded versions match the image
- Every secret and settings file has the expected owner and permissions
- Every key is 64 hexadecimal characters, the keys differ from each other, and the second instance's keys differ from the first's
- n8n, the setup gate and the Hermes API listen on
127.0.0.1only, and UFW denies inbound traffic except SSH, 80 and 443 - From outside, each instance serves HTTPS with a publicly trusted Let's
Encrypt certificate for its own IP, and
http://sends you on tohttps:// - Through the dashboard, Hermes's connections and n8n's public API answer not found, n8n's owner setup is refused without the instance ID, a wrong ID is refused and logged, and the right one opens setup with a HTTPS-only cookie
- Caddy's admin API is off, and Caddy runs as its own user
hermes-n8n web offcloses the dashboard and its ports while Hermes keeps working, andweb onbrings it back- The Hermes API refuses requests without its key and accepts the instance's key, and Hermes connects to its n8n tools
- Removed connection settings come back on the next restart, while a connection switched off stays off
hermes-n8n doctorrepairs a broken connection- The workflow builder reports not connected until you connect it, and refuses an invalid token
- No key appears in any log on the instance
- The instance requires IMDSv2
Reporting a vulnerability¶
Email info@softwaresushi.com with the AMI ID, the region, and what you found. Please do not open a public issue. Reports reach the same inbox as everything else, and we reply within two business days.
Last updated October 27, 2026 · Suggest an improvement