Security
Security model
An agent that can install updates and restart services has real power over your hosts. This page explains, without cryptographic detail, how that power is limited, and what you can check yourself. No system is perfectly secure; the design aims to make every misuse require several independent failures, and to make it visible.
Outbound only, no open port
The agent opens no listening port on your host. It connects out to SEK Systems over HTTPS (port 443). Nobody can connect to the agent from the network, so there is no agent service for an attacker to attack.
The exception is a host you deliberately make a relay (sec-agent role allow relay); a relay listens on an
internal address only, unless you explicitly allow more.
Check it yourself: ss -tlnp | grep sec (Linux) or Get-NetTCPConnection -State Listen (Windows) shows no
listening socket of the agent.
Two layers of encryption
- TLS. The connection uses HTTPS / secure WebSocket. The agent checks the server certificate against the public web roots that are built into the agent, not against the certificate store of the host. A certificate that a middlebox or a tampered host store injects is not accepted.
- A second, independent layer. Inside TLS, the agent and SEK Systems set up their own encrypted and authenticated channel, with keys that were exchanged at enrollment. Even someone who could read or break the TLS layer (for example a TLS-inspecting proxy, or a reverse proxy in the path) sees only encrypted messages, and cannot change or inject them.
On top of that, the messages that matter are signed: jobs by SEK Systems, results and reports by the agent.
Per-agent identity
- Every agent gets its own identity at enrollment: its own key pair, created on the host. The private key never leaves the host.
- Where possible, that key is sealed to the machine (TPM, or Windows DPAPI), so a copy of the files does not work on another computer.
- The identity is valid for 30 days and is renewed automatically with new keys halfway through. A stolen key therefore stops working on its own.
- Enrollment uses a one-time token with a short validity (the installation line: one host, one hour). A used or expired token is worthless.
- An agent can be revoked in the console at any moment; SEK Systems refuses its connection from then on.
Only signed, typed jobs
- The agent only executes jobs signed with the key of your environment. A job is signed for one host, has a validity window and a sequence number, and cannot be replayed or redirected to another host.
- Each job is one typed action with checked parameters: upgrade this package, restart this service, set this firewall rule. The agent itself implements each action with the system's own tools.
- There is no shell. No action runs an arbitrary command or script, and the local policy refuses
allow_script = true. Not even SEK Systems can send a command line to your host.
The host has the last word
Every job is checked against the local policy on the host, at the moment it runs. The policy is a file that only root or an Administrator can change, and SEK Systems cannot widen it. It sets which actions are allowed, which packages and services are off-limits, when changes may happen, and how many per hour.
Check it yourself: sudo sec-agent policy.
Four eyes and security keys
- A change needs the approval of a second person: the requester can never approve their own plan. This is checked by the console, the server and the signing service.
- By default an approval needs a security key or passkey (FIDO2/WebAuthn): phishing-resistant, and bound to the real SEK Systems address. Owners can relax this; the approval policy and each plan show what applies.
- Owners and admins must use a security key at every sign-in by default.
- An approval is bound to a fingerprint of the exact plan. Changing the plan afterwards voids it.
- A pace limit caps how many hosts can receive a change per hour and per day, so a mistake or a hijacked account cannot hit everything at once.
A tamper-evident audit log
Every action is recorded in the audit log: who, what, when, on which host, with which result. Each record carries the hash of the previous one, so removing or changing a record breaks the chain. The database refuses updates and deletions of audit records. Actions of SEK Systems support in your environment appear there too, as "SEK Systems support".
Tenant isolation
Your environment's data is separated from other environments in the database itself: every query runs with the identity of one environment, and the database only returns rows of that environment (row-level security). The signing keys are per environment, so a job for one environment can never be valid in another. A member sees only the environments they belong to; the console never shows that other environments exist.
Kill switch
One owner or admin can stop all changes at once with the kill switch. The agents receive a signed message, check it themselves and refuse new jobs until release. Reporting continues.
Signed updates
The agent only installs updates whose release metadata is signed and whose program matches the published checksum, and it never downgrades. A new version runs as a trial and is rolled back automatically if it does not come up healthy. See Agent updates. On Windows, the installer also checks the Authenticode signer.
If SEK Systems itself were compromised
We design for this case too. Suppose an attacker gained control over parts of SEK Systems:
- The console and server cannot sign jobs. Signing is done by a separate signing service that holds the keys. It refuses jobs beyond the pace limit and the agent-count limit, so even a misused server cannot change all hosts at once, and it does not sign while the kill switch is on.
- Every job is still bound by the local policy of each host. An attacker can do no more than your policy allows:
nothing on
observehosts, only dry runs ondry_run_onlyhosts, never a package indeny_packages, never outsidelocal_windows. - There is no command execution to abuse: only typed actions.
- Agent updates must match signed release metadata.
- Your audit log shows every job that was signed and executed.
What this means in practice: for hosts where even a misused update is unacceptable, use profile = "observe" or
dry_run_only = true, or narrow allowed_actions, deny_packages and local_windows. The local policy is the one
control that is fully in your hands.
What you can check yourself
| What | How |
|---|---|
| What the agent sends | sudo sec-agent collect --json |
| What the agent may do | sudo sec-agent policy |
| That the agent does not listen | ss -tlnp / Get-NetTCPConnection -State Listen |
| Which version runs, and the update state | sec-agent --version, sudo sec-supervisor status --dir /opt/sec-agent |
| That updates verify | sudo sec-agent update-check --update-repo https://console.sek.systems/repo/tuf/ |
| How the agent's key is stored | sudo sec-agent keys status |
| Who did what | the audit log, with its hash chain |
| That a report is genuine | Reports → Is this report genuine?, or the .sig file |
| Tampering on a host | tamper flags on the host's Summary tab, and notifications |
Found a security problem? Contact SEK Systems through the contact details in your agreement.