Docs menu ▾
Quickstart: put a server on the dashboard
By the end of this page, a test VM will be enforcing and reporting to https://genossec.com/dashboard/, and you'll have watched it block a write.
Time: about an hour, most of it building the enforcer the first time.
What you need
- A dashboard login. Your email has to be on the allowlist; see Operating the fleet server.
- Shell access to the fleet server to mint an enrollment token.
- A disposable Ubuntu 24.04 VM with BPF LSM enabled. The enforcer is a prototype, so don't use a machine you care about.
- A test server for the baseline upload, until the scanner supports HTTPS (see
Known gaps). Any machine the VM can reach can run
python3 genos_scanner_enforcer/installer/dev_server.py.
The steps at a glance
| Step | Where | What |
|---|---|---|
| 1 | Fleet server | Mint a one-time enrollment token |
| 2 | VM | Build and install the enforcer |
| 3 | VM | Give the host its key and point it at genossec.com |
| 4 | VM | Scan the host; the daemon starts and enrolls |
| 5 | Dashboard | See the node, then watch it block a write |
1. Mint an enrollment token
On the fleet server:
cd ~/genos/genos-server/fleet
FLEET_CONFIG=/etc/genos-fleet/config.toml .venv/bin/flask --app "fleetmon:create_app()" create-token --label test-vm-01
It prints a token like genos_enr_… once. The token works once and expires after 24 hours.
2. Build and install the enforcer on the VM
Follow Build and Install in the enforcer README. In short:
cat /sys/kernel/security/lsm # must include "bpf"; the README shows how to enable it
cd genos_scanner_enforcer/enforcer
cargo xtask build
sudo cargo run -p xtask -- install
This installs genos-daemon but doesn't start it yet.
3. Give the host its identity
The daemon needs a private key and a config file that tells it where to report. On the VM:
sudo install -d -m 700 /etc/genos
sudo sh -c 'head -c 32 /dev/urandom > /etc/genos/agent.ed25519'
sudo chmod 600 /etc/genos/agent.ed25519
Then create /etc/genos/agent.toml (mode 0600):
server_url = "https://genossec.com"
server_spki_pin_sha256 = "<pin: see below>"
enrollment_token = "<the token from step 1>"
Get the pin, which is genossec.com's public key fingerprint, from any machine:
echo | openssl s_client -connect genossec.com:443 -servername genossec.com 2>/dev/null \
| openssl x509 -pubkey -noout | openssl pkey -pubin -outform der \
| openssl dgst -sha256 -binary | base64
Every field is explained in Node setup.
4. Scan the host and start enforcing
Run the scanner in demo mode. It records the baseline, then starts the daemon:
sudo GENOS_SERVER=<test-server>:3000 GENOS_DEMO_ENFORCER=1 bash genos_scanner_enforcer/dist/scanner.sh
The scan prints its progress. When it finishes, the daemon starts, enrolls with genossec.com and sends its first heartbeat.
sudo journalctl -u genos-daemon -n 20 --no-pager
# look for: "reporter initialized" and "enforcing; draining decisions"
5. Check the dashboard
Open https://genossec.com/dashboard/. Within 30 seconds:
- The VM appears in the sidebar and the Nodes table with a green Reporting label.
- Enforcement shows Enforcing, and the node page lists 3 LSM hooks.
Now prove it blocks. On the VM:
echo 'attacker ALL=(ALL) NOPASSWD:ALL' | sudo tee /etc/sudoers.d/zz-test
# tee: /etc/sudoers.d/zz-test: Operation not permitted
On the dashboard, open the node's Decision log. A red DENY for create appears, and the
Denied · 24h count goes up.
Finally, stop the daemon (sudo systemctl stop genos-daemon). Within about 90 seconds (three
missed heartbeats) the node turns red and shows up under Alerts → Silent right now. That's
Genos treating a stopped enforcer as an incident.
Known gaps
| Gap | Effect | Until it's fixed |
|---|---|---|
| The scanner speaks plain HTTP only | It can't upload baselines to genossec.com | Baselines go to a test server; the dashboard shows the node's baseline as No baseline |
The scanner downloads itself from GENOS_SERVER |
genossec.com doesn't host the scanner yet | Run the test server, or use dist/scanner.sh from a repo clone as above |
| The daemon doesn't retry failed sends | Decisions made while the network is down are lost | Heartbeat gaps still show the outage |
The enrollment token stays in agent.toml |
Tidiness only: the server refuses reuse | Delete the line after the first start |