Tetragon
Overview
Tetragon is Cilium's eBPF-based runtime security observability and enforcement engine. It observes what actually happens on a host directly from the Linux kernel, using eBPF. It sees process execution, file access, network activity and privileged system calls, with rich process context and negligible overhead.
Tetragon is most often deployed on Kubernetes. It also runs standalone on a single host as a systemd service that watches that host's own kernel, and that is how this SecureAnyCloud image runs it. You get kernel-level runtime security on one Linux machine, with no cluster required.
The image is a ready-to-run host-runtime security appliance, not just the binary. It ships hardened defaults, a TracingPolicy set that emits meaningful events out of the box, structured JSON export for your SIEM or log shipper, and a self-test that proves a monitored action produces an event.
What you get:
- Tetragon 1.7.0 (
/usr/local/bin/tetragonand thetetraCLI), installed from the official release tarball and verified against the upstream SHA256 checksum - The daemon running as
tetragon.service, exporting structured JSON events to/var/log/tetragon/tetragon.log - A default TracingPolicy set in
/etc/tetragon/tetragon.tp.d/that monitors sensitive-file access and privileged syscalls (setuid), on top of Tetragon's always-on process execution and exit events tetragon-selftest, a bounded self-test that triggers a monitored action and confirms the matching event is produced- A loopback-only control surface: a gRPC unix socket, and a health port pinned to loopback and guarded by nftables
- 24/7 SecureAnyCloud support
This is a headless product with no web UI, no admin account and no password. SSH on port 22 is the only open port, and the SSH key you choose at launch is the only way in.
Prerequisites
You need an active Azure subscription, an SSH key pair, and a VNet with a subnet in the target region.
Standard_B2s (2 vCPU / 4 GiB RAM) is a good starting point.
Configure the NSG to allow 22/tcp inbound from your management network only. No inbound application ports are needed.
Tetragon requires a modern kernel that exposes BTF (/sys/kernel/btf/vmlinux). The Ubuntu 24.04 base image provides this out of the box.
Step 1 - Deploy from the Azure Marketplace
Sign in to the Azure Portal, choose Create a resource, search the Marketplace for Tetragon by SecureAnyCloud, and select Create.
On the Basics tab, pick your subscription, resource group, region and size. Under Administrator account, choose SSH public key and paste your key. Under Inbound port rules, allow SSH (22).
Then select Review + create and Create.
Step 2 - Deploy from the Azure CLI
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:tetragon-ubuntu-24-04:default:latest
az vm create \
--resource-group <your-rg> \
--name tetragon \
--image sac1647283583153:tetragon-ubuntu-24-04:default:latest \
--size Standard_B2s \
--admin-username azureuser \
--ssh-key-values ~/.ssh/id_ed25519.pub \
--vnet-name <your-vnet> --subnet <your-subnet> \
--public-ip-sku StandardStep 3 - Connect to your VM
ssh azureuser@<vm-public-ip>There is no password and no console to log in to, because this product has no credentials. /etc/tetragon/credentials on the VM is an informational note that says exactly that and points to the paths below.
Step 4 - Confirm Tetragon is running
tetragon versionlevel=info msg="Starting tetragon" version=v1.7.0Check the service and the tetra CLI:
systemctl is-active tetragonactiveStep 5 - Prove it works end to end
tetragon-selftest triggers a monitored action on the host, a read of the watched sensitive file /etc/shadow. It then confirms that Tetragon produced the corresponding event. This proves that the engine is loaded and observing, not just running:
sudo tetragon-selftestTetragon self-test: proving a monitored action produces an event... default TracingPolicy 'file-monitoring' is loaded PASS: Tetragon observed the read of /etc/shadow. Most recent matching event: {"process_kprobe":{"process":{"binary":"/usr/bin/cat","arguments":"/etc/shadow", ...},"function_name":"security_file_permission","args":[{"file_arg":{"path":"/etc/shadow","permission":"-rw-r-----"}},{"int_arg":4}],"action":"KPROBE_ACTION_POST","policy_name":"file-monitoring"}}The event carries the full process context: the binary (/usr/bin/cat), its arguments, the user and the parent process. You can see exactly who read the file, not just that it was read.
Step 6 - Read the events
Tetragon exports every event it observes as one JSON object per line to /var/log/tetragon/tetragon.log. Confirm that process-execution events are flowing:
sudo grep -c '"process_exec"' /var/log/tetragon/tetragon.log128To watch events live as they happen, stream them from the daemon with the tetra CLI. The -o compact option gives a one-line-per-event summary:
sudo tetra --server-address unix:///var/run/tetragon/tetragon.sock getevents -o compact🚀 process default/tetragon-host /usr/bin/cat /etc/shadow 📚 syscall default/tetragon-host /usr/bin/cat security_file_permission 🚀 process default/tetragon-host /usr/bin/sshdPoint your log shipper or SIEM at /var/log/tetragon/tetragon.log to get a kernel-level audit trail of process activity, sensitive-file access and privilege changes on the host.
Step 7 - Review the default TracingPolicy set
Tetragon always emits process execution and exit events. Everything else is driven by TracingPolicies. These are YAML files that tell the kernel-side engine what to observe, and optionally what to enforce. This image loads its default policies from /etc/tetragon/tetragon.tp.d/:
ls -1 /etc/tetragon/tetragon.tp.d/file-monitoring.yaml privileged-syscalls.yamlList what the daemon has loaded:
sudo tetra --server-address unix:///var/run/tetragon/tetragon.sock tracingpolicy listID NAME STATE SENSORS 1 file-monitoring enabled generic_kprobe 2 privileged-syscalls enabled generic_kprobefile-monitoringreports reads of credential and authentication files (/etc/shadow,/etc/sudoers,/root/.ssh,/boot) and writes to system binary and configuration directories.privileged-syscallsreportssetuidcalls, so privilege changes are visible.
Step 8 - Add your own policy
Drop any TracingPolicy YAML into /etc/tetragon/tetragon.tp.d/ and restart the service to load it. For example, to also monitor reads of /etc/ssh/sshd_config, create /etc/tetragon/tetragon.tp.d/my-policy.yaml:
apiVersion: cilium.io/v1alpha1 kind: TracingPolicy metadata: name: "sshd-config-reads" spec: kprobes: - call: "security_file_permission" syscall: false args: - index: 0 type: "file" - index: 1 type: "int" selectors: - matchArgs: - index: 0 operator: "Equal" values: - "/etc/ssh/sshd_config"Then reload:
sudo cp my-policy.yaml /etc/tetragon/tetragon.tp.d/
sudo systemctl restart tetragonThe Tetragon documentation covers the full policy language, including in-kernel filtering and enforcement actions (for example, sending SIGKILL when a policy matches).
Configuration
The daemon configuration is a set of drop-in files under /etc/tetragon/tetragon.conf.d/, one file per setting. These are this image's hardened defaults:
for k in server-address health-server-address export-filename tracing-policy-dir; do printf '%-22s %s\n' "$k" "$(cat /etc/tetragon/tetragon.conf.d/$k)"; doneserver-address unix:///var/run/tetragon/tetragon.sock health-server-address localhost:6789 export-filename /var/log/tetragon/tetragon.log tracing-policy-dir /etc/tetragon/tetragon.tp.dserver-addresssets the gRPC control interface, a loopback-only unix socket.health-server-addressis pinned tolocalhost, so the health port is never reachable off the box.export-filenamesets where JSON events are written.tracing-policy-dirsets where TracingPolicies are loaded from at startup.
To change a setting, edit the relevant file (or add a new one) and restart tetragon.
Security
This image is hardened for a security tool:
- SSH only. Nothing listens on the network except
sshdon port 22. Confirm it:
ss -tlnp 2>/dev/null | awk 'NR==1 || /:22 /'- Loopback-only control surface. The gRPC interface is a unix socket, and the health port (
tcp/6789, which upstream binds to all interfaces by default) is pinned to loopback and guarded by an nftables rule that drops any off-box access. Confirm the guard:
sudo nft list table inet tetragon_guard | grep -E 'dport 6789'tcp dport 6789 drop- No baked credential. The image ships no password of any kind. Per-VM uniqueness comes from the SSH host keys that each instance regenerates on first boot.
- Patched and self-updating. The OS is fully patched at capture, and unattended security upgrades remain enabled.
Maintenance
- Events. Structured JSON is written to
/var/log/tetragon/tetragon.logand rotated automatically. Stream events live withsudo tetra --server-address unix:///var/run/tetragon/tetragon.sock getevents. - Policies. Add or edit YAML in
/etc/tetragon/tetragon.tp.d/, then runsudo systemctl restart tetragon. List loaded policies withtetra ... tracingpolicy list. - Service. Check status with
systemctl status tetragonand read logs withjournalctl -u tetragon. - Upgrades. Download a newer release from the Tetragon releases, verify it against the published
.sha256sum, and re-run itsinstall.sh. - Security patches. Unattended-upgrades remains enabled, so the OS continues to receive security updates automatically.
Support
SecureAnyCloud provides 24/7 expert support for this image. Contact sales@secureanycloud.com.
Deploy on Azure
Launch Tetragon on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com
Overview
This guide covers deploying and using Tetragon on AWS with SecureAnyCloud AWS Marketplace AMIs. Tetragon is Cilium's open-source, eBPF-based runtime security observability and enforcement engine. It observes what actually happens on a host directly from the Linux kernel, using eBPF. It sees process execution, file access and privileged system calls, with rich process context and negligible overhead.
Tetragon is usually run on Kubernetes. It also runs standalone on a single host as a systemd service that watches that host's kernel, and that is the appliance this image ships. You get kernel-level runtime security on one Linux instance without needing Kubernetes.
The image ships Tetragon 1.7.0 (Apache-2.0 userspace with GPL-2.0 eBPF programs), installed from the official upstream release tarball and verified against the project's published SHA256 checksum. It runs as a standard systemd service. A default TracingPolicy set makes the appliance emit meaningful security events immediately, and a bundled self-test proves end to end that a monitored action produces the matching event.
Tetragon and Cilium are trademarks of their respective owners. This image is produced by SecureAnyCloud and is not affiliated with, endorsed by, or sponsored by the Cilium project or the Cloud Native Computing Foundation. It ships the free and open-source software, unmodified.
What you get:
- Tetragon 1.7.0 (the daemon, the
tetraCLI and the eBPF object library), installed from the checksum-verified upstream release astetragon.service - A default TracingPolicy set (
file-monitoringandprivileged-syscalls) that monitors reads of sensitive files, writes to system directories and setuid privileged syscalls, on top of Tetragon's always-on process execution and exit events - Structured JSON event export to
/var/log/tetragon/tetragon.log, ready for a log shipper, SIEM or CI to consume - A hardened, loopback-only gRPC control socket, and a health port pinned to loopback and guarded by an nftables rule (
tetragon-firewall.service) - Metrics and profiling endpoints disabled
- A bounded self-test (
tetragon-selftest) that triggers a monitored action and confirms the matching event is produced tetragon.service,tetragon-firewall.serviceandtetragon-firstboot.serviceas systemd units, enabled and active on boot- No default login and no shipped secret. Tetragon has no web UI, API password or admin account, so nothing needs to be rotated and nothing is baked into the image.
- An Ubuntu 24.04 LTS base with the latest security patches applied at build time, booting the current HWE kernel so the eBPF programs load against the same kernel a fresh instance runs
- 24/7 SecureAnyCloud support
Prerequisites
- An active AWS account and an EC2 key pair in your target region
- A subscription to the Tetragon listing on AWS Marketplace
- A VPC and subnet, and a security group that allows inbound
22/tcp(SSH, from your admin network). Tetragon opens no other port, because the control and health interfaces are loopback-only.
Recommended instance type: m5.large (2 vCPU, 8 GB RAM) is a sensible starting point. Tetragon's overhead is low, so a general-purpose instance is ample. Size it to match the workload of the host you are monitoring.
Connecting to your instance
This listing offers one or more operating-system variants. Connect over SSH as that variant's default login user, using your EC2 key pair:
OS variant SSH login user Example
Ubuntu 24.04 LTS ubuntu ssh -i your-key.pem ubuntu@<instance-public-ip>
Subscribe and launch from AWS Marketplace
Sign in to the AWS Marketplace and search for Tetragon by SecureAnyCloud. Choose Continue to Subscribe, then Continue to Configuration and Continue to Launch.
Pick your region, the m5.large instance type, your VPC and subnet, your EC2 key pair, and a security group that allows SSH (22) from your admin network. Then launch the instance.
Launch from the AWS CLI
You can also launch the AMI directly. Look up the product AMI ID for your region in the listing, then run:
REGION="us-east-1" AMI_ID="<ami-id>"
# the Tetragon AMI id for your region KEY_NAME="your-key" SG_ID="sg-xxxxxxxx"
# allows 22 from <your-mgmt-cidr> SUBNET_ID="subnet-xxxxxxxx" aws ec2 run-instances --region "$REGION" \
--image-id "$AMI_ID" --instance-type m5.large \
--key-name "$KEY_NAME" --security-group-ids "$SG_ID" --subnet-id "$SUBNET_ID" \
--metadata-options 'HttpTokens=required,HttpEndpoint=enabled' \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=tetragon}]'Tetragon starts on boot and begins watching the host kernel with no extra configuration.
Connect to your instance
ssh -i your-key.pem ubuntu@<public-ip>Confirm Tetragon is running
Tetragon runs as tetragon.service. Two more units support it: the nftables health-port guard (tetragon-firewall.service) and the first-boot provisioning unit (tetragon-firstboot.service). Confirm that all three are active:
sudo systemctl is-active tetragon tetragon-firewall tetragon-firstbootExpected output:
active active activeConfirm the version and the default policies
Check the installed version and list the loaded TracingPolicies. The gRPC control interface is a loopback-only unix socket, so the tetra CLI reaches it with --server-address:
tetra version
sudo tetra --server-address unix:///var/run/tetragon/tetragon.sock tracingpolicy listExpected output (the two default policies are enabled):
CLI version: v1.7.0 ID NAME STATE SENSORS MODE NPOST 2 file-monitoring enabled generic_kprobe monitor_only 172 3 privileged-syscalls enabled generic_kprobe monitor_only 4Prove it works end to end
A running service does not prove that Tetragon is observing. The image ships a bounded self-test that triggers a monitored action on this host, a read of /etc/shadow. It confirms that Tetragon produces the matching security_file_permission event. Run it:
sudo tetragon-selftestExpected output:
Tetragon self-test: proving a monitored action produces an event... default TracingPolicy 'file-monitoring' is loaded PASS: Tetragon observed the read of /etc/shadow. Matching event: {"process_kprobe": ... "function_name":"security_file_permission" ... "policy_name":"file-monitoring"}A PASS proves that the eBPF programs loaded against the running kernel, the default policy attached and the event export is working. It is a real end-to-end check, not a version string.
Read live security events
Stream events as they happen from the loopback gRPC socket. In one shell, start the stream. In another shell, run a command that Tetragon watches (for example cat /etc/shadow) and watch the events appear:
$
sudo tetra --server-address unix:///var/run/tetragon/tetragon.sock getevents -o compact * process ip-10-0-1-20 /usr/bin/cat /etc/shadow * read ip-10-0-1-20 /usr/bin/cat /etc/shadow * exit ip-10-0-1-20 /usr/bin/cat /etc/shadow 0Tetragon also writes the full structured JSON for every event to /var/log/tetragon/tetragon.log. This is the durable record that your log shipper or SIEM consumes.
Review the default monitoring policies
Two TracingPolicies ship enabled, under /etc/tetragon/tetragon.tp.d/:
file-monitoringreports reads of sensitive credential and authentication files (/etc/shadow,/etc/gshadow,/etc/sudoers,/etc/pam.d,/root/.ssh,/boot). It also reports writes to system binary and configuration directories (/etc,/bin,/sbin,/usr/bin,/usr/local/bin, and more).privileged-syscallsreports use of thesetuidprivileged syscall, so privilege changes on the host are visible.
Both run in monitor_only mode. They observe and report but do not block. Tetragon can also enforce (kill or override) when a policy matches. Extend the shipped policies with enforcement selectors when you are ready.
Add your own TracingPolicy
Tetragon reads every *.yaml file in /etc/tetragon/tetragon.tp.d/. Drop in your own policy and restart the service to load it. For example, this policy watches writes under /var/www:
apiVersion: cilium.io/v1alpha1 kind: TracingPolicy metadata: name: "watch-webroot-writes" spec: kprobes: - call: "security_file_permission" syscall: false return: true args: - index: 0 type: "file" - index: 1 type: "int" returnArg: index: 0 type: "int" selectors: - matchArgs: - index: 0 operator: "Prefix" values: [ "/var/www" ] - index: 1 operator: "Equal" values: [ "2" ]
# MAY_WRITEThen load the policy and confirm that it is listed. These commands modify the running configuration, so they are shown for reference and are not run automatically:
sudo cp watch-webroot-writes.yaml /etc/tetragon/tetragon.tp.d/
sudo systemctl restart tetragon
sudo tetra --server-address unix:///var/run/tetragon/tetragon.sock tracingpolicy listShip events to a SIEM or log pipeline
The JSON export at /var/log/tetragon/tetragon.log is a standard newline-delimited JSON file. Point your existing agent at it and forward the events to your SIEM. For example, use a Fluent Bit or Vector tail input, the CloudWatch agent, or a Filebeat prospector. Each line is a complete event with full process ancestry, so no extra enrichment is needed:
# Example Fluent Bit input (reference) [INPUT] Name tail Path /var/log/tetragon/tetragon.log Tag tetragon Parser jsonSecurity model
Tetragon runs arbitrary eBPF programs in the kernel and exposes a control interface, so the appliance locks that surface down:
- The gRPC control interface is a loopback-only unix socket (
unix:///var/run/tetragon/tetragon.sock). It is never reachable over the network. - The gRPC health server is pinned to
localhost:6789and an nftables guard (tetragon-firewall.service, tableinet tetragon_guard) dropstcp/6789from anywhere except loopback. It cannot be reached off the box even if the bind address were changed. - Metrics, gops and pprof endpoints are disabled.
- SSH is the only open port. Confirm the listener set. Only
sshdshould listen off the loopback interface:
sudo ss -tlnp- The image ships no credential of any kind: no web UI, API password or admin account. Per-instance uniqueness comes from the SSH host keys regenerated on first boot, not from any baked secret.
Managing the service
These commands manage Tetragon. They are shown for reference, and the restart and stop commands change the running state:
sudo systemctl status tetragon
# detailed status
sudo systemctl restart tetragon
# reload after changing config or policies
sudo journalctl -u tetragon -f
# follow the daemon logFile locations
Path and purpose:
/usr/local/bin/tetragon: the Tetragon daemon
/usr/local/bin/tetra: the Tetragon CLI
/etc/tetragon/tetragon.conf.d/: daemon configuration drop-ins (hardened defaults)
/etc/tetragon/tetragon.tp.d/: the TracingPolicy directory (add your own *.yaml here)
/var/log/tetragon/tetragon.log: the structured JSON event export
/usr/local/bin/tetragon-selftest: the end-to-end self-test
/etc/tetragon/tetragon-firewall.nft: the nftables health-port guard ruleset
Troubleshooting
tetra cannot reach the daemon
The control socket is loopback-only and owned by root. Always run the CLI as root with the explicit socket path: sudo tetra --server-address unix:///var/run/tetragon/tetragon.sock <command>. Confirm that the daemon is up with sudo systemctl status tetragon.
No events appear on the stream
Events are produced by activity. Generate some, for example with cat /etc/shadow or by starting a process, and they appear immediately on the getevents stream.
The buffered JSON file export at /var/log/tetragon/tetragon.log flushes on volume, so on a very quiet host it lags the live stream. Use getevents for immediate feedback and the log file for durable records.
A policy does not load after I add it
Check that the YAML is valid and restart the service (sudo systemctl restart tetragon). Then run sudo tetra --server-address unix:///var/run/tetragon/tetragon.sock tracingpolicy list and confirm that the new policy is enabled and not in an error state.
Support
SecureAnyCloud provides 24/7 technical support for this product by email and live chat. Our engineers help with deployment, writing and tuning TracingPolicies, shipping events to your SIEM, and scaling.
- Email: sales@secureanycloud.com
- Live chat: available 24/7
Tetragon is open-source software (Apache-2.0, with GPL-2.0 eBPF programs). This image is produced by SecureAnyCloud and is not affiliated with or endorsed by the Cilium project or the Cloud Native Computing Foundation.
Deploy on AWS
Launch Tetragon eBPF Runtime Security with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com