Running the house behind the door.

Security keeps the door shut. System Setup is everything after it: who has an account and what is wrong with it, which groups actually mean root, the certificates, whether the box really stays patched, who did what, what systemd runs, how close the disks are, what the box's names resolve to, what it runs on its own and whether its clock is right. Ten screens on one frame — a band that says the state, tabs, findings worst first, and a row that opens into the thing's own page.

Adding a user on a server in LockFlare Vigia: identity, the login, the key, and the sudo rule, as one card
Onboarding as one card — and the line to hand over when it is done.
/ TEN SCREENS, ONE FRAME

Ten screens, one frame

Users, Groups, Certificates, Auto-updates, Audit, Services, Storage, Network, Scheduled, Time. Most read the box twice — the plain table, and the deep reading that judges it — so what you get is not a listing but a verdict with the fix on the row.

Beside it, the Users screen on one box: the two readings, the findings worst first, and one row opened into the account's own page.

UsersEvery account read as root: who can get in and how, who becomes root and by which rule, whose password runs out, who has not been seen in months.
GroupsNot who is in what, but what each group means: docker is root by another name, adm reads every log, shadow reads the hashes.
CertificatesWhat the box actually serves, whether renewal will really fire, and a vault on your computer so a wiped box is a put back.
Auto-updatesNot "is it on" but "does it stay patched": which repositories it may take from, what is held back, what is owed.
AuditWho became root and what they ran; which files were touched, by whom; and Vigia's own signed ledger.
ServicesFailed first, then running, then enabled-but-stopped. A unit's file, drop-in, hardening and exposure — and a new unit written with the preview as the point.
StorageHow close each disk is, what is taking the room, and what can be given back without losing anything.
NetworkWhat the box is called, what it answers on, and what its names actually resolve to — and whether each one points here.
ScheduledEverything the box runs on its own — cron, timers, at jobs — with who runs it, and the shapes persistence takes called out.
TimeWhether the clock is right and who keeps it so, and whether the box has a real source of randomness.

Users: every account, read as root

Two readings feed this screen — the table of names, uids, shells and keys, and the deep one: lifetime dates, the exact rule that grants root, the state of every home, who is stale — and the findings are judged from both. A second uid 0. An empty password. A locked account whose keys still work. A sudoers file visudo refuses. A home that belongs to somebody else. Nothing wrong is also a finding, and the screen says so plainly.

Overview, People, System accounts, Root, Changes, Backups. A row opens into the account's own page: its lifetime, how it gets in, how far its root reaches, its groups, what it is running right now, its cron, its activity over a window. Adding somebody is one card — identity, the login, a key of theirs or one made here, the sudo rule — ending with the line you hand over. Off-boarding is a flow in order, with what the account owns counted before anything is deleted. Two things are off limits here and refused again in Go: yourself, and root.

Groups: what a group actually means

getent group already says who is in what. The question nobody answers is whether they should be: docker is root by another name, adm reads every log, shadow reads the hashes, and a %group line in sudoers turns a group nobody looks at into root. A member locked a year ago is still in wheel. A name in a members list belongs to nobody at all.

Overview, Groups, Power — the ones that grant something real — Shared folders, Changes. A row opens the group's own page. Several members added at once; a folder shared to a group with the setgid walk done on ask; root scoped to a group by a Vigia-owned rule; delete with what the group owns counted first. The one line you cannot cross, here and in Go: your own root.

Certificates: the parts that go wrong quietly

Anyone can read an expiry date. This screen reads the things that actually break a site at 3 am: whether the box serves what is on disk, whether anything reloads the web server after a renewal, whether the name still points here, whether the key matches the certificate, whether the chain verifies.

Obtain a real one from Let's Encrypt over HTTP, or over DNS through a provider plugin or a guided TXT record with Vigia's own hook — both good for wildcards and for boxes closed on 80. Request one from a CA with the key and CSR made on the box, and install the answer beside the key later. Import a PEM or a PFX. Self-sign for a box nobody outside reaches. Renewal runs as a job you watch, and a finished obtain or renew copies into the vault at once, so the vault is never older than the box.

The vault keeps every certificate and key on your computer, sealed under your key and carried by the encrypted backup. A wiped box, or a lineage deleted by accident, is a put back — not a new request to Let's Encrypt against a rate limit.

Auto-updates: not "is it on", but "does it stay patched"

The switch is the easy part. This screen answers the rest: which repositories the automatic run may take from — a third-party repo, Docker or a database, is left out by default and ages for years without anyone noticing — what is held back and why, what is pending right now with its source, when the timer really fires, whether a reboot or a service restart is owed since the last upgrade, whether the package lists even refresh, whether dpkg is stuck half-configured, and what the last runs actually did.

Settings, Pending, Repositories, History, Log; a one-shot reboot, an undo, the changelog, snaps and leftovers. Vigia owns its own files in apt.conf.d and a timer drop-in; the package's own files are never edited.

/ AUDIT

Audit: who did what, on three records

Who logged in lives on the SSH screen. This tool starts after the door. Became root is every command run through sudo, read from the journal, because the question after "who logged in" is "and then what did they run" — each with a verdict: a root shell, a sensitive file, a download piped to a shell, a permissions change, an account change, or routine. The short list on top is the point.

What was touched is auditd, the kernel's own recorder, watching the files that matter — passwd, shadow, sudoers, sshd's config, the firewall, nginx, the certificates — and naming who changed them even when it was not Vigia, plus every program run inside a root shell, and auditd's own health with the verbs that fix it. Vigia's ledger is every signed change Vigia itself made on this box, one file a day. And any log on the server can be opened and followed live, by service or by file.

Beside it, an afternoon on one box as Became root reads it: the short list on top, the routine folded under it.

# srv-01 · Audit · Became root · every sudo command, read from the journal the short list 14:02 deploy sudo -i a root shell 14:05 deploy sudo less /etc/shadow a sensitive file 14:09 ci sudo sh -c "curl -s https://get.example.com | sh" a download piped to a shell 14:11 deploy sudo chmod -R 777 /var/www a permissions change 14:12 ana sudo usermod -aG docker ci an account change routine 41 more — systemctl restart nginx, apt upgrade, … routine # then What was touched, from auditd, and Vigia's ledger: # every signed change Vigia made on this box, one file a day

Services: failed first, and the three verbs

What systemd runs on this box, in the order you care about: failed first — that is what you came to see — then running, then enabled-but-stopped, then everything else folded away. A row opens to the unit's status and the last lines of its journal, which is where "why" lives. Start, Stop and Restart go through the same root path everything else does. Exposure, Timers and Boot are their own tabs.

A unit's page shows the file, its drop-in, its capabilities, its hardening and what it exposes — and Run as a service writes a new unit with the preview as the point: nobody should sign a unit file they have not read. One service is protected from every verb on this screen, under any of its names: sshd. This window exists because of it.

Storage: a full disk is how most servers die

Nothing crashes; everything just stops. So this screen says how close each disk is, what is taking the room, and what can be given back without losing anything — each reclaim action saying afterwards what the disk looks like now.

Then the work reading a disk was only half of: an attached volume that needs to become a folder, a volume grown at the provider that the filesystem has not noticed, an LVM volume with room beside it, a box with no swap. LVM earns its extra layer for one reason — a filesystem stops being tied to a disk, so when room runs out you add a disk to the group and grow the volume live, with nothing copied and nothing unmounted. Filesystems, Disks, Health (SMART), Space, fstab. Preparing a disk is the one destructive thing here, and it says so twice.

/ NETWORK

Network: the third reason a site will not load

A site that will not load is nearly always the service, the firewall, or the name. Vigia can already see the first two — this screen is the third: what the box is called, what addresses it answers on, its routes, its ports, its traffic, the kernel's guards, /etc/hosts, and what its names actually resolve to, asked from the box, each one marked by whether it points here. A connection test, run from the box when you ask, tries the gateway, a name, a ping and HTTPS in one go.

Changing an address is the one change that can take away the means of undoing it, so the server arms a revert before anything is touched: if Vigia can still reach the box afterwards it disarms it, and if it cannot, the box puts the old settings back by itself. Nobody drives to a data centre.

Beside it, one box's names asked from the box itself, the connection test, and an address changed with the revert armed first.

# srv-01 · Network · what its names resolve to, asked from the box srv-01.example.com 10.0.0.12 points here example.com 10.0.0.12 points here www.example.com 203.0.113.40 does not point here # the connection test, run from the box when you ask gateway 10.0.0.1 ✓ a name example.com ✓ ping example.com ✓ https https://example.com ✓ # changing an address armed a revert: the box puts the old settings back itself applied 10.0.0.12 → 10.0.0.20 reached Vigia reaches the box at 10.0.0.20 disarmed

Scheduled tasks and the clock

Scheduled. Everything the box runs on its own: cron in all of its places, systemd timers, at jobs, with who runs each one and from where. Persistence is where an intruder lives after the first day, so the shapes it takes are called out by name; this is the list a responder asks for first. Your own entries go in /etc/cron.d/lens. An entry in /etc/crontab or cron.d is switched off by commenting it with Vigia's mark, a copy of the file kept beside it the first time, and switched back on the same way; a timer is disabled, an at job removed.

Time. Is the clock right and who keeps it so — chrony, systemd-timesyncd or ntpd, whichever the box runs — because an hour of drift breaks certificates, one-time codes and every log correlation you will ever do. And whether the box has a real source of randomness, with rng-tools where it does not. Both are read by the Security Overview too, and a finding there lands on these tabs.

The door itself is next to this

What the internet reaches, who gets in, the firewall, Fail2Ban, SSH hardening, the WAF, integrity and the kernel — the security half of the same rail.

Security setup