1. Overview and concepts
This guide describes Lawliet 1.5.13.s (the current release). Screens, commands and procedures may change in later versions; the usage guide is updated with each release. Check the version your server runs under Settings > Platform or with ./lawliet version, and see the Releases page for what changed.
What Lawliet is made of, in operator terms, and the four ideas that every later chapter relies on: roles, four-eyes approval, the licence, and the air-gapped operating model.
Read this chapter once before you install. It has no procedures that change anything.
1.1 What runs where#
Lawliet has two parts:
- The server. One Linux host that runs the platform in Docker containers. Operators use it through a web console in the browser. You install and look after it with one command,
./lawliet, in the directory where you unpacked the bundle. - The agents. A small program on each monitored host (Linux, Windows, macOS). It collects what the platform needs and carries out the actions operators request.
The containers on the server#
| Container | What it does | Holds data? |
|---|---|---|
postgres | The main database: users, agents, findings, compliance history, evidence, audit trail | Yes, volume postgres_data |
clickhouse | Collected log events (the Logs search) | Yes, volume clickhouse_data |
redis | Short-lived state: rate limits, two-factor attempt counters, caches | Yes, volume redis_data (can be lost safely) |
backend | The API and every background job (scans, schedules, retention, agent commands) | Volume lawliet_agent_artifacts (hosted agent releases), volume lawliet_config (the installation fingerprint) |
frontend | The web console pages | No |
nginx | HTTPS in front of the console and API (HTTPS mode only) | No (reads the certificate from infra/docker/ssl/) |
db-backup | Takes a daily database dump into ./backups (HTTPS mode only) | Writes to ./backups |
The real container names start with the Compose project name, which is lawliet unless you chose another one at install time (see Installation): lawliet-postgres, lawliet-backend, and so on.
The two serving modes#
| Mode | Chosen at install as | Operators open | Agents connect to |
|---|---|---|---|
HTTPS (tls) | Option 1 (recommended) | https://<address> (port 443) | https://<address> (port 443) |
Plain HTTP (direct) | Option 2 (lab only) | http://<address>:3000, and the browser also calls port 8000 | http://<address>:8000 |
A plain-HTTP install can be moved to HTTPS later with sudo ./lawliet tls on, and an HTTPS install can be switched to plain HTTP with sudo ./lawliet tls off. Agents keep working in both directions. See TLS and certificates.
How agents talk to the server#
Agents are pull-only. Nothing ever connects to an agent.
- Each agent opens an outbound connection to the server every 15 seconds (its heartbeat). It sends what it collected and receives the commands waiting for it.
- A command an operator queues is therefore delivered at the agent's next heartbeat, not instantly.
- No listening port is opened on a monitored host, and no inbound firewall rule is needed on any endpoint.
- An agent that has not sent a heartbeat for 5 minutes is shown as offline.
Every command the server sends is signed. The agent refuses a command that is more than 10 minutes old or more than 60 seconds in the future. This is why clocks matter: a host whose clock has drifted refuses every command while still looking online. Run NTP on the server and on every agent host.
What the server reaches out to#
Nothing, unless you configure it. The shipped server makes no outbound connection at all: no licence check-in, no update check, no telemetry. Optional features that do reach out are listed in Security hardening of the server, and each is off until an operator configures it.
1.2 Roles and permissions#
Every console user has exactly one role. A role is a named set of permissions. You can add grants (extra permissions) and denials (removed permissions) for one user; a denial always wins.
Roles are managed under Settings > Access control, users under Settings > Users. The full procedures are in Users, roles and approvals.
The built-in roles#
| Role | Holds | Typical use |
|---|---|---|
| Super administrator | Every permission. Cannot be edited or deleted | The break-glass account created by ./lawliet install. Keep it sealed for recovery |
| Left security officer (LSO) | Every permission | Full administrator whose critical actions are approved by the RSO |
| Right security officer (RSO) | Every permission | Full administrator whose critical actions are approved by the LSO |
| Administrator | Every permission | Full administration on a site that does not use four-eyes pairs |
| Analyst | Every view permission except the audit trail and the user list, plus: run compliance scans, triage findings, run forensics, work the review queue, manage evidence, manage honeypots | Day-to-day investigation |
| Auditor | Every view permission, including the audit trail and the user list | Reads everything, changes nothing |
| Viewer | Every view permission except the audit trail and the user list | Read-only operational screens |
The permissions#
Permissions are grouped as the role editor shows them.
| Group | Permissions |
|---|---|
| Overview | View the overview |
| Fleet | View agents, Manage agents, Delete agents, Publish agent releases, Manage deployment credentials, Deploy agents remotely |
| Compliance | View compliance, Run scans, Manage compliance, View hardening, Run hardening, View evidence, Manage evidence, Delete evidence, Manage reports |
| Investigation | View findings, Triage findings, View forensics, Run forensics, View active defence, Execute containment, View honeypots, Manage honeypots, View the review queue, Work the review queue, Manage playbooks |
| Logs | Search logs, Manage log sources, Manage detection rules, Manage SIEM forwarding |
| Network | View network, Manage network, View firewall, Manage firewall, Push firewall policy, View DLP, Manage DLP, View FIM, Manage FIM, View assets, Manage assets, Write to Active Directory |
| Administration | View users, Manage users, Manage roles, Approve critical actions, Configure dual control, View the audit trail, Manage API keys, Manage the licence, Manage platform updates, Manage settings, Manage demo data |
Rules that always apply:
- Nobody can change their own role or permissions.
- The last active Super administrator cannot be demoted, disabled or deleted.
- An API key is governed only by the scope chosen for the key, never by a role.
1.3 Four-eyes approval (dual control)#
Some actions are critical. While dual control is on, a request to perform a critical action does not run at once. It is held until a second person with the right to approve it signs it off. Then the person who asked runs it.
The critical actions#
| Critical action | Needs approval by default |
|---|---|
| Change users | Yes |
| Change roles | Yes |
| Change the dual-control policy | Always (cannot be turned off while dual control is on) |
| Run a containment action | Yes |
| Execute remediation | Yes |
| Push a firewall policy | Yes |
| Delete an agent | Yes |
| Change the licence | Yes |
| Stage a platform update | Yes |
| Change API keys | Yes |
| Publish an agent release | Yes |
| Deploy agents remotely (also a connection test, weakening how a WinRM credential checks the host, and making an offline agent package) | Yes |
| Write to Active Directory | Yes |
| Change SIEM forwarding | No |
| Clear or seed demo data | No |
The defaults of a fresh install: dual control is on, Super administrators act alone is off, a reason is required, a pending request expires after 60 minutes without a decision, and an approved request must be executed within 15 minutes.
The flow, in short#
- The requester makes the change in the console as usual and, when asked, types a reason.
- The console says the request was sent for approval. Nothing has changed yet.
- An approver opens Approvals > Waiting for me, reads the request and presses Approve or Reject (a rejection needs a comment).
- The requester opens Approvals > My requests and presses Execute now within the execution window. The action runs once.
What makes it a control:
- Nobody approves their own request, whatever roles they hold.
- The approval covers exactly the request that was reviewed. A changed request is refused.
- An approval is used once.
- Changing users, roles or the policy is itself critical, so one officer cannot promote themselves or switch the control off first.
The first day: one approver#
A fresh install has one account. Nobody can approve their own request, so until a second approver exists every critical action of an approver runs on that one signature. Each such action is written to the audit trail as dual_control_bypassed with reason no_second_approver, and every console page shows the banner Four-eyes is inactive until a second approver exists.
The banner disappears as soon as a pair of approvers exists who can approve each other's user and policy changes: a second Super administrator, or an LSO and an RSO. Creating that pair is the last step of Installation.
What four-eyes does not cover#
./lawliet on the server runs as root (or as a member of the docker group, which is equivalent). It can read the database and .env, so console approvals do not apply to it: installing a licence with ./lawliet licence, building an offline agent package with ./lawliet agent-package, or resetting the administrator password with ./lawliet passwd needs no second signature. Shell access to the server is therefore the most privileged access there is. Limit it to the people who would hold the Super administrator account. See Security hardening of the server.
1.4 The licence#
- A licence key is a single line that starts with
LAWLIET-. It is checked on the server against the vendor's signature. Licensing never needs network access. - A licence is normally issued for one installation. Each installation has an installation fingerprint (32 hexadecimal characters). You send the fingerprint to your vendor and receive a key that works on that installation only.
- The fingerprint is kept in the
lawliet_configDocker volume. It survives restarts, updates, rollbacks and database restores. It changes on a new server, or after./lawliet uninstall(which deletes the volumes). Either is a new installation that needs a new licence. - The licence decides which modules open and how many agents may enrol. When all agent seats are in use, the next enrolment is refused.
- Without a valid licence you can sign in and finish the first-login steps (password, two-factor), and the console shows the activation screen. Nothing else opens.
- When a licence expires, the platform pauses until a renewed licence is installed. Your data is untouched.
- The newest-issued valid licence always wins. An older key cannot replace a newer one.
Where you see it:
| Where | What it shows |
|---|---|
./lawliet licence | Type, organisation, expiry and days left, issue date, whether it is bound to this installation, where it was loaded from, the installation fingerprint |
| Settings > Platform, panel License | Status, agent seats in use, expiry, the modules in this build, the installation fingerprint and the request text for your vendor |
| The activation screen | Shown after sign-in while no valid licence is active |
How to install a licence: Installation, step 2.10.
1.5 The air-gapped operating model#
Lawliet is built to run on a network with no route to the internet.
| Task | How it reaches the server |
|---|---|
| Install | The bundle (.tar.gz) carries every container image. Nothing is downloaded or built |
| Licence | You read the fingerprint on the server, send it out by whatever channel you use, and bring the key back as a small text file |
| Updates | A new bundle, or a smaller delta, carried in on media and applied with ./lawliet update. The console can also take the file by upload (Settings > Platform > Install from a file) |
| Agent installation | Agents download their installer from your server, or come on media as an offline package |
| Agent upgrades | Agent releases are hosted on your server; agents fetch them over their normal connection |
| Support | ./lawliet diag writes one redacted archive you can carry out and send to the vendor |
| Time | Use an internal NTP source. Without one, set clocks by hand and check them regularly |
What crosses the boundary, and in which direction:
| Out of your site | Into your site |
|---|---|
| The installation fingerprint (identifies the installation, nothing else) | The bundle and its .sha256 file |
Optionally, a diagnostics archive from ./lawliet diag (redacted, checked for secrets before it is written) | The licence key file |
| Updates and deltas |
1.6 Words used in this guide#
| Word | Meaning |
|---|---|
| Bundle | The release archive, lawliet-docker-<version>-<customer>.tar.gz. Unpacked, it is the installation directory |
| Installation directory | The directory you run ./lawliet from, for example /opt/lawliet-1.5.13.s. An update creates a new one beside it |
.env | The configuration file in the installation directory: secrets, addresses, settings. Mode 600 |
.lawliet.conf | The deployment choices ./lawliet records (mode, address, TLS state, rollback record). No secrets |
| Enrolment secret | The token agents use once, to register. Each agent then has its own token |
| Build id | A 16-character id that names exactly one build. Quote it to support. ./lawliet status shows it |
| Four-eyes, dual control | The same thing: a second person signs a critical action before it runs |
| Delta | A smaller update that carries only what changed since the build you have installed |

