Deployment guide

Tenzir

Overview

Tenzir is an open source (BSD 3-Clause) data pipeline engine for security teams. It collects, parses, normalises, enriches, reduces, stores and routes security telemetry such as logs and events. You query the data with TQL, a purpose-built pipeline language that uses the same syntax for live streaming and historical analysis.

This SecureAnyCloud image installs the open source Tenzir node from the pinned upstream package. Each node includes a built-in columnar edge storage engine, so you can import events into the node and query them back with no external database. The image is fully standalone. The open source edition contains no platform plugin, so the node needs no token, no subscription and no outbound connection to any management service. The commercial Tenzir Platform, the paid web UI, is deliberately not included.

What you get:

  • The open source Tenzir node (tenzir-node.service) and the tenzir command-line client
  • The node control endpoint bound to 127.0.0.1:5158 (loopback only, a binary protocol, no web interface)
  • The built-in columnar edge storage engine, reachable from TQL with the import and export operators
  • A start-time bind guard that refuses to run the node on any non-loopback endpoint
  • An nftables host firewall that denies inbound traffic by default, with only SSH allowed
  • A one-command self-test at /opt/sac/tenzir-roundtrip.sh
  • 24/7 SecureAnyCloud support

This is a headless product. The node control endpoint listens on 127.0.0.1:5158 only and has no browser interface. You run TQL pipelines with the tenzir client on the VM, and the columnar store ships empty.

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 size for evaluation and light pipelines. Choose Standard_B2ms (8 GiB) or larger for heavier sustained ingestion.

Configure the network security group (NSG) to allow inbound 22/tcp from your management network only. No inbound application ports are needed, because the node is loopback-only.

1

Deploy from the Azure Marketplace

Sign in to the Azure Portal, choose Create a resource, search the Marketplace for Tenzir 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) only.

Then select Review + create and Create.

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:tenzir:default:latest
az vm create \
  --resource-group <your-rg> \
  --name tenzir \
  --image sac1647283583153:tenzir: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 Standard
3

Connect to your VM

Connect over SSH as azureuser:

ssh azureuser@<vm-ip>

The Tenzir client lives in /opt/tenzir/bin, which is added to your PATH automatically for login shells. In a non-login shell, add it explicitly:

export PATH="$PATH:/opt/tenzir/bin"
4

Confirm the node is running

Print the Tenzir version and check the service state:

export PATH="$PATH:/opt/tenzir/bin" tenzir 'version' systemctl is-active tenzir-node

The output shows the Tenzir version (6.9.0) and active.

5

Import events into the node store with TQL

Tenzir stores events in its built-in columnar engine. The import operator writes the output of a pipeline into the store. This pipeline ingests a small set of example security events:

export PATH="$PATH:/opt/tenzir/bin" tenzir 'from {event: "ssh_login", user: "alice", src_ip: "203.0.113.10", outcome: "success"}, {event: "ssh_login", user: "bob", src_ip: "198.51.100.7", outcome: "failure"}, {event: "ssh_login", user: "root", src_ip: "198.51.100.7", outcome: "failure"}, {event: "http_request", src_ip: "203.0.113.55", path: "/admin", status: 403} | import'

In production, replace the inline from {...} source with a real input such as from_file, load_tcp, from_kafka or one of the many other built-in connectors. The rest of the pipeline stays the same.

6

Query the store with TQL

The export operator reads events back from the store. Combine it with where, select and summarize to filter, project and aggregate. Tenzir pushes filters down into the storage engine for fast historical queries. Run these three pipelines:

export PATH="$PATH:/opt/tenzir/bin" tenzir 'export | where event == "ssh_login" and outcome == "failure" | select user, src_ip' tenzir 'export | where outcome == "failure" | summarize src_ip, failures=count()' tenzir 'export | summarize event, events=count()'

The first pipeline returns the failed SSH logins, the second aggregates failures by source IP, and the third counts every stored event by type.

7

Run the built-in self-test

The image ships a one-command, end-to-end self-test. It confirms that the node is active and loopback-bound, imports a set of events and queries them back. It fails loudly if the round trip returns nothing.

sudo /opt/sac/tenzir-roundtrip.sh

On success, it prints a round-trip summary and TENZIR ROUND-TRIP OK.

Security model

The node control endpoint binds to 127.0.0.1:5158 (loopback) only. The open source node has no built-in authentication on this endpoint, so the endpoint must never be exposed off the VM. This image enforces that with three layers:

  • A systemd drop-in pins the endpoint to 127.0.0.1:5158. A start-time bind guard (/usr/local/sbin/tenzir-bindguard.sh) refuses to start the node on any non-loopback or wildcard address.
  • An nftables host firewall denies inbound traffic by default and allows only SSH (22/tcp), so every node port is unreachable off the VM regardless of your NSG.
  • Your NSG stays limited to 22/tcp from trusted networks. Keep it that way.
sudo ss -tlnp | grep tenzir-node
sudo nft list table inet sac

The node listens on 127.0.0.1:5158. The internal actor port is bound to a random high port, which the host firewall blocks off the VM.

Where things live

  • /opt/tenzir/bin: Tenzir binaries (tenzir, tenzir-node, tenzir-ctl)
  • /var/lib/tenzir: columnar store, which ships empty and is owned by the tenzir user
  • /var/log/tenzir: node logs
  • /etc/systemd/system/tenzir-node.service.d/10-sac.conf: loopback endpoint and bind guard drop-in
  • /etc/nftables.conf: host firewall (default deny inbound, SSH only)
  • /opt/sac/tenzir-roundtrip.sh: built-in ingest-to-query self-test
  • /var/lib/sac/data/tenzir-firstboot.notes: per-VM first-boot notes

Managing the service

Check the service status, restart it and read its recent logs with these commands:

systemctl status tenzir-node
sudo systemctl restart tenzir-node journalctl -u tenzir-node --no-pager | tail -20

Support

SecureAnyCloud maintains this image and provides 24/7 support. Tenzir is a trademark of Tenzir GmbH. This image packages the open source Tenzir node and is not affiliated with or endorsed by Tenzir GmbH. See the SecureAnyCloud guides for more.

Deploy on Azure

Launch Tenzir 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

Deploy on Azure