Quickstart Guide
This guide walks you through enrolling a machine, generating a baseline runtime policy, connecting a GitHub repo for policy GitOps, and triggering a live attestation failure.
Prerequisites:
- A Linux machine with a TPM 2.0 (physical or vTPM)
- The Ratatouille CLI installed:
- Debian/Ubuntu:
curl -1sLf 'https://dl.cloudsmith.io/public/ratatouille/ratatouille/setup.deb.sh' | sudo bash && sudo apt install rat - RHEL/Fedora:
curl -1sLf 'https://dl.cloudsmith.io/public/ratatouille/ratatouille/setup.rpm.sh' | sudo bash && sudo dnf install rat - pip:
pip install ratatouille
- Debian/Ubuntu:
- A GitHub account and repo for your runtime policy
Step 1: Create a Policy Group
Section titled βStep 1: Create a Policy GroupβCreate a new Policy Group and enroll the current machine as the baseline in one step:
rat init [fleet-name] --bootstrapGive the group a name that identifies your fleet or environment. The --bootstrap flag tells
Ratatouille to treat the current machine as the baseline and automatically enroll it after
the group is created.
If you are operating from a separate operator machine and want to enroll a remote device
as the baseline instead, omit --bootstrap and run the generated enroll command on the
target device via SSH or Ansible:
rat enroll <token> --server https://demo.ratatouille.devStep 2: Enroll the Baseline Machine
Section titled βStep 2: Enroll the Baseline MachineβWhen rat init --bootstrap runs (or when you run rat enroll manually), the CLI:
- Validates the enrollment token against Ratatouille Core
- Installs the Keylime Rust agent
- Configures the agent with a unique UUID and server addresses
- Starts the agent, which performs the TPM 2.0 activate-credential ceremony with the Keylime registrar
- Captures the full IMA measurement log from the running machine
- POSTs the baseline to Ratatouille Core, which generates your runtime policy draft
Step 3: Connect Your GitHub Repo
Section titled βStep 3: Connect Your GitHub RepoβAfter enrollment, the CLI will prompt you to connect a GitHub repository to your Policy Group.
- Enter your repository URL when prompted
- Install the Ratatouille GitHub App on that repository
- Ratatouille will automatically link the repo to your group
Your repo should have this structure:
runtime/ runtime_policy.json β the policy file artifact.sigstore.json β Sigstore bundle (signature + certificate)Step 4: Sign and Push a Policy
Section titled βStep 4: Sign and Push a PolicyβThe CLI saves the generated policy draft to a file. Review it before signing β see the policy reference for details on what the fields control and how to tune the policy for your environment.
Sign the policy with rat sign:
rat sign runtime/runtime_policy.jsonThis opens a browser for Sigstore keyless signing and writes the bundle to
runtime/artifact.sigstore.json alongside the policy file.
Then commit and push:
git add runtime/git commit -m "policy: initial baseline"git pushWhen the push lands on main, Ratatouilleβs GitHub webhook:
- Verifies the HMAC-SHA256 webhook signature
- Fetches the policy and Sigstore bundle from the commit SHA via the GitHub API
- Verifies the Sigstore bundle against the Rekor transparency log
- Stores the verified policy in the database
- Fans out
keylime_tenant -c updateto all enrolled agents in the group
Step 5: Watch Live Attestation
Section titled βStep 5: Watch Live Attestationβrat statusThis should show ACTIVE for your fleet (currently just this machine).
Every ~10 seconds the agent constructs a fresh TPM quote signed by its Attestation Key (AK) and pushes it β along with the new IMA log entries since the last cycle β to the Keylime verifier. The agent never opens an inbound port; all attestation traffic is outbound from the agent. The verifier checks the quote signature, the PCR values, and every IMA log entry against your runtime policy, then stores the verdict.
What to do next
Section titled βWhat to do nextβDemonstrating an attestation failure (and recovering)
Section titled βDemonstrating an attestation failure (and recovering)βThe fastest way to see the full failure β detection β recovery loop. No compiler or extra tooling required.
Trigger:
cp /bin/ls /tmp/evil_ls && /tmp/evil_ls/tmp/evil_ls is at a path no exclude pattern matches. IMA measures the file via BPRM_CHECK on exec, extends PCR[10], and appends an entry to the runtime log.
Verify the entry landed in IMA:
sudo grep /tmp/evil_ls /sys/kernel/security/ima/ascii_runtime_measurements# 10 f0635a12... ima-sig sha256:cb30d69b24245bf2ecdc9e7f53bbad19159999970b6d82c0c00c7d32d9e37aa4 /tmp/evil_lsWithin ~10 seconds the agent pushes this entry to the verifier. The verifier checks /tmp/evil_ls against the policyβs digests map, finds it absent, and marks the agent FAILED. Esperanto-Coreβs ~30-second background poll picks it up:
ββ Fleet Status https://demo.ratatouille.dev
Agent Group Status Last seen βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β instance-20260405-221449 demo-fleet FAILED 2s agoRecover by signing the new binary into the policy (the legitimate-software-update path):
# Extract the file hash directly from the IMA logHASH=$(sudo awk -v p=/tmp/evil_ls '$5==p {sub(/^sha256:/,"",$4); print $4; exit}' \ /sys/kernel/security/ima/ascii_runtime_measurements)
# Add it to the digests map under the file's pathjq --arg h "$HASH" '.digests["/tmp/evil_ls"] = [$h]' \ runtime/runtime_policy.json > runtime/runtime_policy.json.new \&& mv runtime/runtime_policy.json.new runtime/runtime_policy.json
# Re-sign and pushrat sign runtime/runtime_policy.jsongit add runtime/ && git commit -m "policy: allow /tmp/evil_ls" && git pushThe GitHub webhook fires β Sigstore signature verified β keylime_tenant -c update pushes the new policy to the verifier β next attestation passes β status flips back to ACTIVE within ~30 seconds.
Enroll more devices
Section titled βEnroll more devicesβrat enroll <token>Generate cryptographic evidence
Section titled βGenerate cryptographic evidenceβrat evidence <hostname>Get a dedicated Ratatouille deployment
Section titled βGet a dedicated Ratatouille deploymentβrat upgradeNeed something more bespoke?
Section titled βNeed something more bespoke?βAir-gapped deployments, custom IMA policy generation, vTPM integration on platforms we havenβt documented yet, regulated-environment onboarding β reach out and weβll build it with you.