Tamper resistance
How shellz keeps recording when someone with access to a server tries to stop it, and how it reports attempts.
Anyone with root access can interfere with any software on their own machine, shellz included. What shellz guarantees is that interference is undone where possible, and always reported: shellz can't be disabled quietly.
On a server
The recorder service
The shellz-recorder systemd unit is set up so that:
systemctl stop shellz-recorderis refused (RefuseManualStop=yes);- if the process is killed or crashes, systemd restarts it after one second, with no limit on restarts, and shellz raises a
tamperalert on the next start; - the kernel's out-of-memory killer avoids it, and it doesn't produce core dumps;
- the process can't be inspected with
ptraceby unprivileged users.
Continuous repair
Every 15 seconds, and immediately when /etc/passwd changes, the agent checks and repairs:
- the shellz binary and session shell;
- the recorder unit file, and whether it's enabled and running;
- the login shells of recorded accounts;
- the SSH drop-in that turns off
~/.ssh/rc; - the SELinux policy module and file labels, where SELinux is enabled;
- on Docker hosts, the Docker socket and drop-ins (checked every second).
Each repair raises a tamper-repaired alert describing what was changed. shellz files are also marked immutable (chattr +i), so changing them first requires removing the flag.
Sessions that avoid the recorder
A session auditor looks for login sessions on the server that didn't go through the session shell, for example a login using a service account with a shell set by hand. Unless the recording policy is fail-open, it ends them and raises unrecorded-session-terminated. Under fail-open it raises unrecorded-session and lets them continue.
Removal
shellz uninstall only works after an owner or admin has approved removal of that server in the dashboard, which sends the server a signed policy that allows it. Without that, the command is refused and an uninstall-refused alert names the account that tried. See Updates and removal.
Going silent
A server that stops sending heartbeats, for example because it was shut down, cut off from the network, or shellz was forcibly removed, is marked offline after 90 seconds and raises a heartbeat-missing alert. When it comes back, heartbeat-recovered is raised.
Inside containers
In containers, shellz runs as PID 1:
kill -9 1from inside the container has no effect, because the kernel doesn't deliver unhandled signals to PID 1 from inside its own namespace.- The exec watcher finds sessions that bypass the shell shim within 500 ms. Under fail-closed, unrecorded sessions with a terminal are killed and raise
unrecorded-container-exec. - Stopping the container stops the workload too, and is reported as stopped with its reason and exit code. A container that disappears without a clean stop is shown as lost after 3 minutes.
Recordings
Once uploaded, recordings are protected by signatures, the hash chain and write-once storage with a 365-day retention lock. See Encryption.
A server also can't rewrite its own history: shellz refuses a segment that conflicts with one it already stored, and marks the session as tampered.
Policies and keys
Servers only apply policies and org keys signed by your org, with a revision higher than the current one. Attempts to replay an older policy or substitute a key are refused and raise policy-rejected or org-key-rejected. With Perfect Secrecy, only your team's browsers can sign them.
Limits
- Root can still interfere, for example by editing memory, loading a kernel module, or cutting the network. shellz is designed so that these leave a trace: a gap in a recording, a tamper alert, or a silent server.
- In an unprivileged LXC container,
chattr +iisn't available. shellz still repairs changes every 15 seconds and raises a singleimmutable-unsupportedwarning. - In containers, someone with access to the node can enter a container's namespaces without going through
kubectl execordocker exec. Record node logins with a host install where you manage the nodes.
See Alerts for every alert and its severity.