Skip to content

Policy Packs

Policy packs are curated collections of detection and enforcement rules distributed to sensors through the Console. Each pack targets specific node roles, protocol families, and operational assumptions. The sensor applies the assigned pack within one heartbeat cycle (15 seconds) and verifies each policy file's Ed25519 signature before loading it.


How packs work

  1. An operator assigns a pack version to a sensor or group of sensors from the Console.
  2. The assignment is stored in the Console database and included in the next heartbeat response for each affected sensor.
  3. The sensor receives the pack assignment, downloads and caches the TracingPolicy YAML files locally under compiled-policies/{pack_id}/{version}/, and applies each file to the embedded eBPF engine via gRPC.
  4. Each .yaml file is accompanied by a .yaml.sig sidecar. The sensor verifies the Ed25519 signature against the policy-signing.pub key it received at enrollment before loading the policy. Policies with invalid signatures are rejected.
  5. The current assignment is persisted to assigned-pack.json so it survives a sensor restart.
  6. Enforcement state (observe, enforce_ready, enforced) is part of the assignment and delivered the same way.

Pack catalog

The Telovix Console serves the pack catalog from the policy pack directory configured during initial setup. Each pack lives in a subdirectory named {pack_id}/{version}/ and contains a manifest.json and an engine-input.json.

The following packs are included with the standard installation. All are at version 0.1.0 in the current release.

O-DU packs

Pack IDTitleKindTarget roles
o-du-baseline-observeO-DU Baseline Observeobserveo_du
o-du-fronthaul-observeO-DU Fronthaul Observeobserveo_du
o-du-process-guardO-DU Process Guardguardo_du

o-du-process-guard is enforcement-capable. When operators advance the enforcement ladder to enforced, it can block execution from /tmp, /var/tmp, /dev/shm, and /run/telovix-staging on O-DU hosts.

O-CU packs

Pack IDTitleKindTarget roles
o-cu-baseline-observeO-CU Baseline Observeobserveo_cu
o-cu-core-signaling-observeO-CU Core Signaling Observeobserveo_cu
o-cu-ims-session-observeO-CU IMS Session Observeobserveo_cu
o-cu-signaling-observeO-CU Signaling Observeobserveo_cu

O-Cloud packs

Pack IDTitleKindTarget roles
o-cloud-baseline-observeO-Cloud Baseline Observeobserveo_cloud
o-cloud-core-observeO-Cloud Core Observeobserveo_cloud
o-cloud-integrity-guardO-Cloud Integrity Guardguardo_cloud
o-cloud-interconnect-observeO-Cloud Interconnect Observeobserveo_cloud
o-cloud-runtime-drift-observeO-Cloud Runtime Drift Observeobserveo_cloud

o-cloud-integrity-guard is enforcement-capable. When advanced to enforced, it can block execution from /tmp, /var/tmp, /dev/shm, and /run/telovix-staging on O-Cloud hosts.

General

Pack IDTitleKindTarget rolesSupport level
generic-linux-observeGeneric Linux Observeobservegeneric_linux, o_du, o_cudevelopment

::: note The generic-linux-observe pack has support_level: development. It is intended for lab and development environments, not production deployments. :::


Pack manifest fields

Each manifest.json defines the following fields:

FieldDescription
pack_idUnique identifier used in file paths and Console display
pack_versionSemVer string
pack_familyLogical grouping (e.g. telecom_baseline, telecom_du_integrity)
target_rolesNode roles this pack is intended for
protocol_familiesProtocol families covered (e.g. 5g_nr_ran, 5g_core_signaling)
pack_kindobserve (detection only) or guard (enforcement-capable)
titleHuman-readable name shown in the Console
descriptionWhat the pack monitors
rationaleWhy the pack exists and what threat it addresses
scope_summaryExact scope of collection
observation_classTypes of activity observed (e.g. process_execution network_activity)
telecom_contextTelecom-specific context shown in the Console
support_levelofficial or development
enforcement_capabletrue if this pack can be advanced past observe
enforcement_summaryDescription of what enforcement does (only present when enforcement_capable: true)

Role assignment is validated: a pack's target_roles must include the sensor's declared_role or generic_linux. Assigning a pack targeting o_du to a sensor declared as amf returns a RoleMismatch error.


Provenance states

When you configure a pack registry URL in Console Settings, the Console verifies pack integrity against the registry before assignment. Without a registry, the Console serves packs from local disk without remote verification.

StateMeaning
verifiedPack manifest signature verified against registry using Ed25519
unverifiedRegistry not configured; pack loaded from local disk without remote verification
mismatchPack manifest does not match the registry record
unavailableRegistry configured but unreachable or key not found
local_customPack marked as a local custom pack; no provenance check performed

Assigning a pack

Single sensor

In the Console, go to Sensors, select a sensor, and click Assign Pack. Choose the pack ID and version from the catalog.

Sensor detail page showing the Assign Pack dialog with the pack catalog and version selector.
Sensor detail page showing the Assign Pack dialog with the pack catalog and version selector. Click to enlarge

Kubernetes namespace scope

For Kubernetes-deployed sensors, you can limit policy application to specific namespaces. In the Console, go to Sensors > [sensor] > Assign Pack and enter the namespace scope (e.g. 5g-core, ran-workloads) in the namespace filter field.

When a namespace scope is set, the sensor applies the pack rules only to events from pods in the specified namespaces.

Fleet assignment

In the Console, go to Sensors > Fleet Actions > Assign Pack to assign a pack to multiple sensors at once. The Console shows a preflight summary of outcomes for each sensor (ready, assigned, blocked, failed) before you confirm. A sensor is blocked from assignment if its declared role does not match the pack's target_roles.


Manage enforcement states

Every pack assignment has an enforcement state. The state can only advance forward one step at a time, and only for packs with enforcement_capable: true.

observe  -  enforce_ready  -  enforced

Returning to observe is always allowed from any state.

StateBehavior
observeEvents are recorded and alerts are generated. No blocking. Default for all new assignments.
enforce_readyPack is loaded in enforcement mode; the sensor is ready to enforce but has not yet entered the enforced state. Used as a final review gate before enforcement. The sensor must be in runtime_mode: live.
enforcedActive blocking is enabled. Only available after enforce_ready and only for enforcement-capable packs.

In the Console, go to Sensors > [sensor] > Enforcement to advance the enforcement state. Before advancing to enforce_ready or enforced, review the enforcement verification panel on the same page, which shows the readiness class (NotReady, ReviewRequired, or CandidateForEnforceReady), the list of blocking conditions, and any caution conditions.


List and inspect the catalog

In the Console, go to Policies > Policy Packs to view all packs in the catalog with their provenance state. Select a sensor from Sensors to see its current pack assignment.


Verify policy signatures

Each policy YAML file in a pack has a .yaml.sig sidecar containing an Ed25519 signature over the message:

telovix-policy-v1:{policy_name}\n{yaml_content}

The sensor verifies this signature against the policy-signing.pub key it received at enrollment. Policies with invalid signatures are rejected and the assignment fails. This protects against tampering with policy files that cross a network or storage boundary.

If no .sig sidecar exists but a signing key is configured, the sensor logs a warning and loads the policy anyway for backwards compatibility with pre-signing pack versions.


Troubleshooting

Pack assignment returns RoleMismatch

The sensor's declared_role is not listed in the pack's target_roles. Use a pack that targets the sensor's declared role, or correct the declared role on the sensor to match the intended pack.

Pack assignment returns PackRootNotConfigured

The policy pack directory has not been configured in the Console. Set the policy pack directory path in Console Settings and restart the Console before attempting assignment again.

Pack shows provenance_state: unavailable

A pack registry URL is configured in Console Settings but the registry is currently unreachable. Check the registry URL and network connectivity from the Console host. Packs continue to work from local disk, but the mismatch state persists until the registry is reachable.

Pack not appearing in sensor events after assignment

Policy signature verification failed on the sensor, or the heartbeat carrying the assignment has not yet been delivered. Check the sensor logs with journalctl -u telovix-sensor -n 50 --no-pager | grep policy and verify that policy-signing.pub is present in the sensor state directory (default /var/lib/telovix-sensor/).

enforce_ready transition rejected

The sensor is not in live runtime mode, or the trust health is not healthy. Review the enforcement verification panel on the sensor enforcement page for the specific blocking conditions preventing the transition.


Further reading

Released under the Telovix Commercial License.